首页 > 心得分享 > Nginx配置PHP文件/目录访问需要密码)来保护受限制的内容。

Nginx配置PHP文件/目录访问需要密码)来保护受限制的内容。

最近一个朋友跳槽到了新公司,公司要用DedeCMS建站。
然而对这个比较熟的朋友应该知道,系统是够老牌。
但系统的漏洞比功能还多,如何保证服务器安全不被挂马是个大问题。

由于他们公司没有专业的技术,就找到我这来寻求帮助,本着助人为乐的想法,除了这样一个方案。

由于DedeCMS系统是全站生成静态的,而漏洞必然是通过PHP执行的,所以,防护的切入点为禁止他人访问PHP文件。
这样,全站由于是静态的,并不会有太大影响。

思路如下,使用Nginx的Auth验证系统,对所有PHP的访问加上密码验证,不了解Auth验证的可以去了解一些,这里不多说。

同时,为了防止黑客暴力破解密码,以及提高伪装性,加入了一个Header头验证。

第一步:Header伪装,所有对PHP的访问若不带有指定Header头,则直接返回404,迷惑他人。

Nginx配置加入如下内容

    # 只有带协议头才能继续
    if ($http_x_safe_token != 'vv9Th1bg'){
        return 404;
    }

配合Chrome插件(ModHeader)实现头信息伪造.

第二步: 为了防止穷举密码,加入漏斗.
在nginx.conf文件的http段中,加入如下代码

    # 设置auth验证次数
    limit_req_zone $binary_remote_addr zone=auth_logs:1m  rate=3r/m;

大意为 创建一个 auth_logs 的空间,大小为1m,使用用户IP做区分,速率为每分钟验证3次.

第三步: 创建.htpasswd密码文件.
htpasswd工具是httpd带的,而我用的Nginx没有,也不想安装,就使用在线工具生成([在线
htpasswd 生成器][2])
将生成的密码一行一个的保存的任意文件(可以为.htpasswd之类的,保存位置任意,自己找得到就好)

第四步: 为所有的需要保护的php文件加入如下代码启用Auth验证

    # 开启 密码验证
    auth_basic "Welcome Home.";
    # 密码文件
    auth_basic_user_file /home/htdocs/default/.htpasswd;
    # 滴漏验证
    limit_req zone=auth_logs burst=3;

这个代码需要放到location段中才能使用,而且,还要单独为这个location段开启PHP功能.
由于这个服务器所有的PHP都需要开启,我就直接放到了 enable-php.conf中了.

实例配置如下(不含nginx.conf文件http段中的滴漏)

# 免密码的文件
location ~ ^/pass/test\.php(/|$)
{
    try_files $uri =404;
    fastcgi_pass  unix:/tmp/php-cgi.sock;
    fastcgi_index index.php;
    include fastcgi.conf;
}
# 只需要密码的文件
location ~ ^/pass/home\.php(/|$)
{
    # 开启 密码验证
    auth_basic "Welcome Pass.";
    auth_basic_user_file /home/htdocs/default/.htpasswd;
    limit_req zone=auth_logs burst=3;

    try_files $uri =404;
    fastcgi_pass  unix:/tmp/php-cgi.sock;
    fastcgi_index index.php;
    include fastcgi.conf;ng
}
# 其他需要密码的
location ~ [^/]\.php(/|$)
{
    # 只有带协议头才能继续
    if ($http_x_safe_token != 'vv9Th1bg'){
        return 404;
    }
    # 开启 密码验证
    auth_basic "Welcome Home.";
    # 密码文件
    auth_basic_user_file /home/htdocs/default/.htpasswd;
    # 滴漏验证
    limit_req zone=auth_logs burst=3;

    try_files $uri =404;
    fastcgi_pass  unix:/tmp/php-cgi.sock;
    fastcgi_index index.php;
    include fastcgi.conf;
}

常见的实例都在这里了.
第一个为不需要走验证的(如DedeCMS中 plus目录下的count.php 用来统计文章访问数量的)
第二个是不需要修改Header头,只验证密码的(有时候不想安装插件就可以去掉)
甚至如果不考虑穷举,滴漏相关的代码也可以去掉.

上一篇: PHP实现禁用或清理Cookies后Session依旧可以还原并可用。

下一篇: 利用Git的WebHooks实现自动部署并解决NAT3网络内网穿透问题

最近回复

标签