静看光阴荏苒
不管不顾不问不说也不念

BunkerWeb:开源Web应用程序防火墙 (WAF)

介绍(摘自官方项目页面)

BunkerWeb作为一个功能齐全的Web服务器(底层基于NGINX ),它将保护您的Web服务。BunkerWeb可以无缝集成到您现有的环境(Linux、Docker、Swarm、Kubernetes等)中,并且配置非常简单。

BunkerWeb特性:

A non-exhaustive list of security features :

  • HTTPS support with transparent Let’s Encrypt automation
  • State-of-the-art web security : HTTP security headers, prevent leaks, TLS hardening, …
  • Integrated ModSecurity WAF with the OWASP Core Rule Set
  • Automatic ban of strange behaviors based on HTTP status code
  • Apply connections and requests limit for clients
  • Block bots by asking them to solve a challenge (e.g. : cookie, javascript, captcha, hCaptcha or reCAPTCHA)
  • Block known bad IPs with external blacklists and DNSBL
  • And much more …

这篇文章记录一下BunkerWeb与Linux集成的配置。

[备注]系统Debian12,如果你使用Debian11请先升级到12,BunkerWeb不支持11。

如果系统内已经安装了Debian官方Repo内的Nginx则需要先卸载:

systemctl stop nginx
apt purge python3-certbot-nginx
apt purge nginx nginx-common
apt autoremove

[备注]purge将删除/etc/nginx目录,这个目录保存了所有Nginx配置文件,如果有需要,请备份这个目录下面的站点配置文件。

确保系统内的80、443、7000端口没有被其他程序占用。(7000端口是BunkerWeb Web UI需要)

BunkerWeb依赖于Nginx1.24,可以通过添加Nginx官方Repo并指定版本号进行安装:

apt update
apt -y install curl gnupg2 ca-certificates lsb-release debian-archive-keyring
curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor | tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null
echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] http://nginx.org/packages/debian `lsb_release -cs` nginx" | tee /etc/apt/sources.list.d/nginx.list
apt update
apt -y install nginx=1.24.0-1~$(lsb_release -cs)

现在就可以安装BunkerWeb了:

export UI_WIZARD=1
curl -s https://packagecloud.io/install/repositories/bunkerity/bunkerweb/script.deb.sh | bash
apt update
apt -y install bunkerweb=1.5.6

[重要]禁止系统升级的时候升级Nginx和Bunkerweb,如有升级需求需根据官方的升级文档来操作:

apt-mark hold nginx bunkerweb

[可选但建议配置]启用Web UI,编辑ui.env配置文件:

nano /etc/bunkerweb/ui.env

写入Web UI的管理员账号和密码:

ADMIN_USERNAME=imlala
ADMIN_PASSWORD=hidden

重启bunkerweb-ui服务使其生效:

systemctl restart bunkerweb-ui

编辑variables.env配置文件:

nano /etc/bunkerweb/variables.env

这个配置文件是BunkerWeb的核心,可以说BunkerWeb所有的功能特性都可以通过这个文件来进行配置,在BunkerWeb安装完成后,这个文件内默认的配置如下:

DNS_RESOLVERS=9.9.9.9 8.8.8.8 8.8.4.4
HTTP_PORT=80
HTTPS_PORT=443
API_LISTEN_IP=127.0.0.1
MULTISITE=yes
UI_HOST=http://127.0.0.1:7000
SERVER_NAME=

现在我们要配置Web UI,需要先修改SERVER_NAME=,在这里绑定一个域名用于访问Web UI:

SERVER_NAME=bunker.example.com

然后增加如下内容:

bunker.example.com_USE_UI=yes
bunker.example.com_USE_REVERSE_PROXY=yes
bunker.example.com_REVERSE_PROXY_URL=/randompath
bunker.example.com_REVERSE_PROXY_HOST=http://127.0.0.1:7000
bunker.example.com_INTERCEPTED_ERROR_CODES=400 404 405 413 429 500 501 502 503 504

在这个配置内,后端服务(Web UI)监听在127.0.0.1:7000,BunkerWeb通过反向代理127.0.0.1:7000来提供对外的访问,同时提供相应的保护。为防止Web UI不被外界轻易扫描或者说是访问到,可以将/randompath改成一个复杂的路径。

做完任何改动后,都需要重启bunkerweb服务,新的配置才能生效:

systemctl restart bunkerweb

现在通过访问http://bunker.example.com/randompath就能打开Web UI了。

个人还是建议能用配置文件就用配置文件,这个Web UI有些功能还有一些很明显的BUG,比如更改了配置但不能生效等问题。更多的时候把它当个辅助工具就好了,看看LOG什么的还行。

下面介绍一下BunkerWeb比较关键的几个功能的设置。在开始进行设置前,要了解BunkerWeb的一些配置常识。

BunkerWeb的配置可分为三种类型:全局配置、特定于站点的配置、多组配置。

我们可以将所有站点共同需要用到的功能设置为“全局配置”。将部分站点要用到的功能设置为“特定于站点的配置”。而多组配置的话,一般情况下用不到,这里就不介绍了。

下面的这些配置,我将它设置为“全局配置”。

关闭默认服务器:

DISABLE_DEFAULT_SERVER=yes

此配置非常重要,一些扫描互联网的爬虫会使用此功能来进行指纹识别,比如censys,shodan。关闭默认服务器,可有效避免被此类爬虫扫描到敏感信息。

max-sizes:

MAX_CLIENT_SIZE=0

这个配置很重要,实际上对应Nginx的client_max_body_size,如果你反代Nextcloud这类需要上传大文件的程序,务必修改为合适的值,否则会导致文件上传失败。设置为0则表示为不限制大小。

自动申请和续签Let’s Encrypt证书:

AUTO_LETS_ENCRYPT=yes
EMAIL_LETS_ENCRYPT=imlala@example.com

其他相关配置:https://docs.bunkerweb.io/latest/security-tuning/#lets-encrypt

强制HTTPS/SSL/TLS:

AUTO_REDIRECT_HTTP_TO_HTTPS=yes

其他相关配置:https://docs.bunkerweb.io/latest/security-tuning/#https-ssltls

关闭请求数限制:

USE_LIMIT_REQ=no

容易误杀,而且也不具备防CC、DoS的能力,建议关闭,这个功能更多的时候是用来限制API一类的服务,如果是普通的Web网站无需开启。

下面的这些配置,我将它设置为“特定于站点的配置”。

启用Antibot:

bunker.example.com_USE_ANTIBOT=captcha
bunker.example.com_ANTIBOT_URI=/challenge

Antibot可以有效防止CC、DoS一类攻击,也可以防止一些自动化工具扫描Web网站的漏洞。

工作原理也很简单,就是在访问的时候对客户端进行验证,验证的方式有很多种,比如说BunkerWeb原生支持的验证码、Javascript。这里我配置为BunkerWeb原生的验证码验证方式。

你还可以使用第三方的服务来进行验证,比如CloudFlare的Turnstile,具体的配置方法见:

https://docs.bunkerweb.io/latest/security-tuning/#antibot

目前有一个小BUG,如果你启用了Antibot的Captcha验证模式,但实际访问不到验证页面,并且错误LOG里面有类似于这样的信息:

require error for plugin antibot : error loading module 'gd' from file '/usr/share/bunkerweb/deps/lib/lua/gd.so': libgd.so.3: cannot open shared object file: No such file or directory

则需要安装:

apt -y install libgd-dev

然后重启BunkerWeb即可解决:

systemctl restart bunkerweb

关于Antibot这个功能的话,个人建议仅当Web服务受到攻击的时候才打开,因为验证的过程本身对访客而言也是一种负担,现在的人都是急性子,一个网页加载出来不是自己要看的内容反而是一个要输验证码的界面,这会让很多访客失去耐心,以至于直接关闭你的网页。

ModSecurity OWASP Core Rule Set,这是BunkerWeb核心中的核心,BunkerWeb就是通过ModSecurity来保护你的服务不受到威胁。但默认使用的版本是3,这里我改成用最新版本:

bunker.example.com_MODSECURITY_CRS_VERSION=4

除了上面提到的Antibot和ModSecurity以外,BunkerWeyy还提供了很多附加的安全防护功能。这里我就不一一进行配置了,实际上大多数功能也都是默认启用的状态。下面我简单介绍一下各个功能的作用。

Bad behavior:Bad behavior默认是启用的,当一个客户端在一定时间内不停的访问到403、404这样的页面后,将这个客户端禁止。禁止的理由很简单,一个正常的用户不可能一直发起403、404这样的请求,往往只有一些自动化工具在进行扫描的时候才会如此频繁的访问到相关的错误页面。

BunkerNet:BunkerNet默认是启用的,这是一个由BunkerWeb维护的数据库,BunkerWeb会把恶意请求者的IP记录在里面,供所有BunkerWeb实例使用,类似于杀毒软件的病毒库。

DNSBL:DNSBL默认是启用的,这是一个外部黑名单,如果发现客户端的IP在黑名单内则禁止客户端访问。

Reverse scan:Reverse scan默认是没有启用的,启用后它将扫描客户端有没有开放22、80、443、3128、8000、8080这类端口,如果开放则禁止客户端访问。禁止的原因是,一些公共的代理服务器一般会使用这些端口,而家宽的话不会开放这些端口。我个人觉得一般情况下不需要启用这个功能,容易误杀,毕竟很多个人的代理服务器也会使用这些端口。如果你的Web服务正在遭受CC攻击,并且日志里面有大量来路不明的IP在频繁的请求你的Web服务,可以尝试开启这个功能,也许有一定效果,因为攻击者可能是使用扫描到的大量的公开代理服务器来进行攻击,这些代理服务器一般代理的端口就是8080,8000。

基本上,BunkerWeb的防护功能就是这些,官方为了简化配置过程,甚至还特地提供了一个可视化的配置生成器,你可以使用这个配置生成器来生成各式各样满足自己需求的配置。

总的来说BunkerWeb的功能非常强大,安装与配置也相当简单,完全可以作为NPM(NginxProxyManager)等一类软件的替代品。如果硬要说目前的缺点的话,那就是WebUI有点拉跨,另外就是内存占用略高,可能需要1GB才能流畅运行,对于一些小的VPS来说不太理想。

赞(8)
未经允许不得转载:荒岛 » BunkerWeb:开源Web应用程序防火墙 (WAF)
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

分享创造快乐

广告合作资源投稿