限定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 | location ~ ^/adm/index.php(|\?.*)$ { |
以上配置中,用波浪号(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 | location /adm/ { |
在第一种方案下,之所以配置代码要放在全部location block[1]的前面,是因为带有~
波浪符的location block是所有location block里执行级别最低的,要等到其它几个级别[2]的location block执行后才轮到它。为保证adm这个phpBB下的子目录的限制能有效执行而不与网站其它同名目录混淆起来,这段代码须置于前面,但如果网站内没有同名目录,则顺序并不重要。