最近一个朋友跳槽到了新公司,公司要用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头,只验证密码的(有时候不想安装插件就可以去掉)
甚至如果不考虑穷举,滴漏相关的代码也可以去掉.