续集:加强服务器安全性保护WordPress

自上次写过WordPress被黑之后,虽然安装了Wordfence,但发现依然不够,Wordfence能反复扫描出各种被黑的PHP木马。

没想到WordPress的安全性如此成问题,看来安全性还是必须从系统入手,不能光依赖WordPress本身。

一、禁用PHP的系统相关函数

首先经过检查,发现虽然篡改了PHP文件,甚至在tmp下面跑了一个进程,但似乎并没有渗透到系统级别,没有获得root权限,所以我立即在php.ini里面禁用了一些系统相关的函数,以防止被获得系统的权限


disable_functions = pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexi
ted,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wexitstatus,pcntl_wtermsig,pcntl_ws
topsig,pcntl_signal,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pc
ntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriorit
y,pcntl_setpriority,exec,passthru,shell_exec,system,proc_open,popen,curl_exec,cu
rl_multi_exec,parse_ini_file,show_source

二、将WordPress目录下的文件权限改为root

为了防止PHP文件被插入恶意脚本,我将PHP文件都设置为只读,虽然这样会导致WordPress无法自动更新或者是自动安装插件,但要好过被篡改。然而uploads目录是必须要可以写入的,没有这个功能无法上传图片。


# chown -R root .
# chown -R www-data wp-content/uploads

三、禁止 uploads 目录中执行任何 PHP 脚本

在做了前两步之后,我发现依然有黑客可以上传脚本到 uploads 目录下,并通过远程请求调用执行,所以必须要禁止这个目录下的PHP脚本的运行。我在nginx中增加了一下配置


server {
listen 80;
server_name shiningray.cn *.shiningray.cn ;
root /var/www/shiningray;
index index.html index.htm index.php;
include /etc/nginx/php_params;
location ~* /(?:uploads|files)/.*.php$ {
deny all;
}

}

四、配置防火墙

当我还没配置第三步的时候,我通过 netstat 和 lsof 等指令调试系统的时候,发现PHP进程会连接到很多邮件服务器的25(smtp)端口,我想起来之前Linode客服所说的经常能发现我的服务器在投递垃圾邮件,原来是拿我当肉鸡发垃圾邮件。所以我觉得直接堵死smtp端口的连接,就可以断了他们的念想。

我使用Ubuntu的ufw来配置了端口的访问:

表示拒绝任何从本地发起到外部25端口的连接,使用 deny 替换掉 reject 也可以,但是 deny 是丢弃掉链接上发出去的包,而 reject 是直接断开链接。由于木马往往会反复不停的尝试,如果只是deny的话,可能会导致进程被堵死,所以最后选择了 reject

至此之后,再也没有感染过PHP的恶意脚本了。

利用SSH通道加密网页浏览

更详细的介绍可以查看 Geek to Live: Encrypt your web browsing session (with an SSH SOCKS proxy)

我们普通的HTTP链接都是以明文进行传输的,信息非常容易被截取。例如,通过公共的无线热点上网、在公司要绕开网管或防火墙浏览某些页面。那么如何才能对普通的HTTP传输进行加密呢?

SSH为我们提供了这些便利。因为他具有内置的socks代理,可以在本地建立一个服务器,然后通过一个远程的可信SSH服务器来访问网络。

Windows可以采用Cygwin + OpenSSH,这个需要一定的配置,也可以使用CopSSH这个已经帮你配置好的安装包。

接下来就可以在控制台中通过以下指令来启动我们的本地代理:

接下来程序就会要求输入密码,接下来就可以使用了。

其中-N参数表示运行后不转入后台,而是占用控制台,这样我们可以方便地通过Ctrl+C来终止,-D就是表示在后面所跟的端口上建立socks代理。

使用方面,推荐使用Firefox的FoxyProxy,可以配置为仅部分地址使用代理。

最后,如果链接速度较慢的话,我们可以使用-C选项来开启传输的gzip压缩: