NGINX上启用HTTP认证(HTTP Authentication)

前言

在后台我经常可以看到有扫描器通过wp-login.php穷举密码登陆试图 WordPress 。同时还看到针对各种 Web 应用方面的攻击记录。
想来想去我始终无法防御所有的 Web 漏洞,所以我想通过引入 HTTP 认证这种手段来降低遭遇攻击时的风险。

什么是 HTTP 认证?

在HTTP中,基本认证(Basic access authentication)是一种用来允许网页浏览器或其他客户端程序在请求时提供用户名和口令形式的身份凭证的一种登录验证方式。
通过HTTP 认证我们可以阻挡各种未经授权的访问以缓解各种漏洞。
因为启用之后只有输入正确的用户密码才允许访问web内容。

在NGINX上启用 HTTP 认证

要配置 HTTP 认证我们首先需要创建认证账户密码文件。
我们可以通过openssl或者htapasswd来创建。
方法1:使用 htapasswd 命令来创建

1
2
3
4
#Ubuntu 上要使用 htapasswd 需要安装 apache2-utils 
#可以直接通过apt来安装
#sudo apt install apache2-utils
htpasswd -nb username password >> /etc/nginx/http_passwd

方法2:使用openssl来创建

1
2
3
4
#printf "username:$(openssl passwd -crypt password)\n" >> /etc/nginx/http_passwd
#Apache variant加密方式,更安全
printf "username:$(openssl passwd -apr1 password)\n" >> /etc/nginx/http_passwd
# cat /etc/nginx/http_passwd

注: username 与 password 请自行替换。

创建了 passwd 文件(本例中为:/etc/nginx/http_passwd)之后,我们需要修改NGINX的配置启用 HTTP 认证。
Ubuntu 上 NGINX 配置文件存放在 /etc/nginx/sites-enabled 目录下。
本例中为: /etc/nginx/sites-enabled/exvs
为需要保护的路径添加类似下面这样的内容

1
2
3
4
location / {
auth_basic "HTTP Authentication";
auth_basic_user_file /etc/nginx/http_passwd;
}

最后通过命令重启 NGINX 。

1
systemctl restart nginx

重启完成后如果访问指定的路径则需要进行 HTTP 认证了。

如果对于配置方面还有疑问可参阅 NGINX 文档:
https://nginx.org/en/docs/http/ngx_http_auth_basic_module.html