对于使用 WordPress 的站长而言,如何避免入侵者侵入 WordPress 是个很头疼的问题。WordPress 的管理面板,路径一律是 wp-admin,这很方便入侵者尝试破解密码。市面上有许多 WordPress 安全加固插件,例如自动封禁破解管理员密码的 IP 地址等。这些插件的确增加了入侵者侵入服务器的难度,不过,运行插件是会耗费服务器处理器和内存资源的,如何用更简单的方法达成目标呢?
原理及注意事项
插件挡住攻击者之前,攻击者已经看到了 WordPress 的登录界面。我们常用的 Nginx Web 服务器其实是可以给该界面加把锁的,也就是 HTTP 身份验证。简单说,显示 WordPress 后台界面之前,Nginx 会要求我们输入用户名和密码,密码验证通过之后才运行后台登录界面的 PHP 程序,这样既可以把攻击者拒之门外,又不会让服务器承受太重的负担。
至于 HTTP 身份验证是怎样工作的,感兴趣的同学可以自行 Google 一下。但是需要提醒两点:
- 你的网站一定要通过 HTTPS 协议提供服务,因为 HTTP 身份验证是以明文方式传输用户名和密码的。
-
你要有 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 当中,否则不会对后台起到保护作用。