限定IP地址提升phpBB管理面板安全的Nginx配置

提升服务器应用程序安全性方法之一是限制用户的权限,比如网上论坛等程序通过用户密码、用户等级匹配的方法来限制,但若应用程序管理员的密码泄露,则还有另一种限制IP访问地址的手段来加强安全性。也就是说,要获取应用程序的控制权,除了管理员账号密码外,还须从事先设定的IP地址访问该应用程序,这样即便密码被窃,应用程序安全方面受到攻击的可能性也会大大降低。

Apache的配置规则相对比较容易,近年来流行的Nginx的配置规则就繁杂一些。phpBB官方尽管提供了完整的Nginx配置文件,但其中却并没有加入对管理员面板进入层面的防护。本站论坛的Nginx配置文件中增加了一段代码,可完成相应的目标。

假设phpBB论坛是安装在服务器当前网站的根目录下,也就是以类似http://bbs.mydomain.tld这样的地址来访问,那么默认的管理员控制面板的路径就是http://bbs.mydomain.tld/adm/http://bbs.mydomain.tld/adm/index.php。假设我仅允许IP来源地址为12.34.56.78的访问通过,有两种方案来设置Nginx的配置文件。

第一种方案,在相应的server block下所有location block之前加上如下代码

1
2
3
4
5
6
7
8
9
10
location ~ ^/adm/index.php(|\?.*)$ {
allow 12.34.56.78;
deny all;
include fastcgi_params;
fastcgi_split_path_info ^(.+\.php)(/.*)$;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_index index.php;
fastcgi_pass 127.0.0.1:9000;
}

以上配置中,用波浪号(tilde)~指示当前location block要用到正则表达,用(|\?.*)$表示路径后index.php可能跟随相应的特征字串(管理员如果在登录之后通过首页链接进入管理面板则index.php后会有一串特征字符,如http://bbs.mydomain.tld/adm/index.php?sid=82082d09a7d0645ed75b9cf8bdc9bf5b),接着用allow和deny all来限定允许的IP地址,即除了12.34.56.78这个IP以外,其它IP来源均禁止掉。最后的6行代码是为了连接PHP-FPM执行动态程序,对于不在允许范围内的IP访问来说,这6行代码不会执行。

第二种方案用到嵌套,在任意一段增加如下代码,先对adm这个目录进行限制,随后再给adm目录下的php文件进行限定,原理同前一种方案相同,只是这样的配置下,这段location block可放置在Nginx相应server block的任意地方。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
location /adm/ {
allow 12.34.56.78;
deny all;
location ~ ^/adm/index.php(|\?.*)$ {
allow 12.34.56.78;
deny all;
include fastcgi_params;
fastcgi_split_path_info ^(.+\.php)(/.*)$;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_index index.php;
fastcgi_pass 127.0.0.1:9000;
}
}

在第一种方案下,之所以配置代码要放在全部location block[1]的前面,是因为带有~波浪符的location block是所有location block里执行级别最低的,要等到其它几个级别[2]的location block执行后才轮到它。为保证adm这个phpBB下的子目录的限制能有效执行而不与网站其它同名目录混淆起来,这段代码须置于前面,但如果网站内没有同名目录,则顺序并不重要。


  1. 有关location block的说明可参考Nginx官方解释,以及相关教程 ↩︎

  2. 分别是direct or longest match、=/^~ ↩︎