使用 HTTP 身份验证保护 WordPress 后台

  对于使用 WordPress 的站长而言,如何避免入侵者侵入 WordPress 是个很头疼的问题。WordPress 的管理面板,路径一律是 wp-admin,这很方便入侵者尝试破解密码。市面上有许多 WordPress 安全加固插件,例如自动封禁破解管理员密码的 IP 地址等。这些插件的确增加了入侵者侵入服务器的难度,不过,运行插件是会耗费服务器处理器和内存资源的,如何用更简单的方法达成目标呢?

原理及注意事项

  插件挡住攻击者之前,攻击者已经看到了 WordPress 的登录界面。我们常用的 Nginx Web 服务器其实是可以给该界面加把锁的,也就是 HTTP 身份验证。简单说,显示 WordPress 后台界面之前,Nginx 会要求我们输入用户名和密码,密码验证通过之后才运行后台登录界面的 PHP 程序,这样既可以把攻击者拒之门外,又不会让服务器承受太重的负担。

  至于 HTTP 身份验证是怎样工作的,感兴趣的同学可以自行 Google 一下。但是需要提醒两点:

  1. 你的网站一定要通过 HTTPS 协议提供服务,因为 HTTP 身份验证是以明文方式传输用户名和密码的。

  2. 你要有 Nginx 站点配置文件的完全访问权限,如果你用的是虚拟主机,有些主机提供商可能提供了配置 HTTP 身份验证的网页。

需要的 Nginx 模块

  在编译 Nginx 时,默认会自动加入 ngx_http_auth_basic_module 模块。如果使用的是发行版自带的 Nginx,则都已经有了这个模块。

生成 Nginx 身份验证使用的用户文件

Nginx 身份验证用户文件的格式

  Nginx 身份验证用户文件是一个纯文本文件,它格式很简单,一行是一组用户名和密码,用户名到密码之间用半角冒号“:”作为分隔符。

注意: 用户名只能是英文字母和数字。

生成 Nginx 身份验证用户的密码

  可以通过 openssl 生成 Nginx 身份验证用户的密码,命令是:

openssl passwd -1>>nginx_auth

解释:openssl passwd -6 是通过 OpenSSL 生成密码,而后面的管道符表示将生成的密码保存到 nginx_auth 文件当中。

小提示: 如果执行 openssl 提示找不到命令,就请安装 OpenSSL 软件包。在 Debian 及 Ubuntu 系统上,请执行 apt update&&apt install openssl,在 CentOS 8、RockyLinux 及 AlmaLinux 系统上,请执行 dnf install openssl

修改 nginx_auth 文件

  使用 nano 文本编辑器打开生成的 nginx_auth 文件。在 $6$ 前面输入用户名,然后输入半角冒号“:”,冒号后面是 $6$。修改完成后,按 Ctrl + X,然后输入 Y,按回车键保存。

修改 Nginx 配置文件

  找到站点的配置文件,例如,这是一个样例:


server { listen 443 http2 ssl; listen [::]:443 http2 ssl; ssl_certificate your_cert_file; ssl_certificate_key your_cert_privkey_file; server_name wordpress.contoso.com; #charset utf-8; access_log off; root /data/www/contoso/wordpress; index index.php; try_files $uri $uri/ /index.php?$args; // 这是重点 location /wp-admin/ { auth_basic "Private zone"; auth_basic_user_file auth/nginx_auth; location ~ \.php$ { try_files $uri =404; fastcgi_pass php_fastcgi_backend; include fastcgi_params; } } location /wp-login.php { auth_basic "Private Zone"; auth_basic_user_file auth/nginx_auth; location ~ \.php$ { try_files $uri =404; fastcgi_pass php_fastcgi_backend; include fastcgi_params; } } location ~ \.php$ { try_files $uri =404; fastcgi_pass php_fastcgi_backend; include fastcgi_params; } }

  上面的示例中,我配置了一个主机(server),并且配置了主机名和 SSL。最关键的就是 location /wp-admin/ { 这一句:

location /wp-admin/ {
auth_basic “Private zone”;
上面这一句表示开启 HTTP 身份验证,如果浏览器要显示标识,就让它显示 Private zone。

auth_basic_user_file auth/nginx_auth;
上面这一句是指定 nginx_auth 文件的位置,如果是相对路径,就是相对于 nginx.conf 的路径。

下面就是该目录的 PHP 处理程序的映射,如果没有下面的映射,Nginx 并不会要求进行身份验证,请你结合实际工作,告诉我为什么。

location ~ .php$ {
try_files $uri =404;
fastcgi_pass php_fastcgi_backend;
include fastcgi_params;
}
}

将 nginx_auth 文件放置到正确的目录当中

  一切都快完成了,现在,只需要把 nginx_auth 文件放到指定的目录中即可。
如果 Nginx 配置文件中指定的 auth_basic_user_file 采用相对路径,就请将 nginx_auth 文件放置到相对于 nginx.conf 文件的路径中。在刚才的代码示例中,应该放置于 /etc/nginx/auth 目录。

测试配置文件是否正确

  请执行 nginx -t -c 配置文件路径 命令,例如 nginx -t -c /etc/nginx/nginx.conf 或者省略为 ** nginx -t**,如果提示 nginx: configuration file /etc/nginx/nginx.conf test is successful,则表示配置文件没有问题。

  如果有问题,就请撤销对配置文件的修改,然后问问其他人,寻求解决方法。

重启 Nginx

  一切完成后,我们来执行 systemctl reload nginx 来让 Nginx 重新加载配置文件。

测试

  请访问你的 WordPress 仪表板,看看有没有跳出用户名和密码对话框。如果有,那就输入你设置的用户名和密码登录吧!

举一反三

  这个方法完全可以用来保护其他系统的后台,例如 Typecho 等。但是一定要注意:千万记得把 php 处理程序的 location 包含到受保护的 location 当中,否则不会对后台起到保护作用。

留下评论

您的电子邮箱地址不会被公开。