WordPress的安全性其实不错,但是如果服务器上不做一些基本的安全措施,Wordpress再安全也是白搭。现在的VPS相比几年前便宜很多,很多人都买了自己的独立主机,如果不注意安全,面对满世界全天候的自动攻击脚本,网站被挂马,主机变毒瘤都是分分钟的事。

等中招之后再排查就异常困难了,因为可能有问题的点太多,逐一排查也不见得不会有漏网之鱼。但是其实只要注意一些最基本的安全因素,就能避免大部分低级攻击,免去不必要的麻烦。

前些天整理自己的服务器的时候发现一些问题,这里总结一下,以后再搬服务器也好参考。

1. 更改SSH默认端口

网上很多自动攻击脚本通过循环试错来破解账户密码的,尝试的端口都有限,所以如果把SSH端口改成4位数的,比如8964就不错,能够规避多数暴力破解攻击。注:UNIX系OS的端口限制是0~2^16-1(也就是0~65535),一些端口已经被知名软件占用了,但是只要自己的服务器上不冲突就行。

编辑 /etc/ssh/sshd_config 文件:

#把默认的22更改成自定义的数字
# What ports, IPs and protocols we listen for
Port 8964

2. 禁用root SSH登录

目的同上。Root密码的破解是攻击脚本的首要目标,所以还是新建一个私人账户,赋予sudo权限即可。嫌每次sudo输入密码麻烦,加上NOPASSWD指令,影响不大。

#/etc/ssh/sshd_config
#把默认的yes改成no
PermitRootLogin no

3. 取一个独特的用户名

攻击脚本会尝试很多用户名,一部分是常用服务的默认用户名,还有一些是人们喜欢使用的用户名。所以像admin,tester,jack什么之类的用户名就不要了。下面是我从log中取出来的一小部分,常用服务帐号,常用人名什么之类的都有,只有想不到,没有做不到,实在叹为观止。

Jul 27 06:29:17 localhost sshd[10509]: input_userauth_request: invalid user old [preauth]
Jul 27 06:31:04 localhost sshd[10511]: input_userauth_request: invalid user oracle [preauth]
Jul 27 06:37:30 localhost sshd[10516]: input_userauth_request: invalid user abc [preauth]
Jul 27 06:38:25 localhost sshd[10518]: input_userauth_request: invalid user oracle [preauth]
Jul 27 06:45:40 localhost sshd[10534]: input_userauth_request: invalid user postgres [preauth]
Jul 27 06:53:46 localhost sshd[10557]: input_userauth_request: invalid user rose [preauth]
Jul 27 07:07:42 localhost sshd[10570]: input_userauth_request: invalid user testing [preauth]
Jul 27 07:09:57 localhost sshd[10581]: input_userauth_request: invalid user abcd [preauth]
Jul 27 07:15:04 localhost sshd[10586]: input_userauth_request: invalid user test [preauth]
Jul 27 07:18:01 localhost sshd[10591]: input_userauth_request: invalid user lion [preauth]
Jul 27 07:22:24 localhost sshd[10593]: input_userauth_request: invalid user testuser [preauth]

4. 禁用不必要的Shell

检查/etc/passwd。一般来说,预置帐号除了root之外都是没有shell的,如果你发现类似man,game,sys这样的系统帐号的最后一列都是 /bin/sh 之类的shell,那就得注意一下了。各个系统的nologin位置不一样,locate一下。Ubuntu默认是/usr/sbin/nologin或者/bin/false,这两者有一点细微的区别

#系统帐号示例
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin

4. 使用公钥认证

如果使用上面的这些还不够,还可以彻底禁用密码登录的方式,采用公钥认证登录。当然,使用这种方式之后不方便随时随地管理,但是一个自用的web服务器,随时登录的需求几乎没有,在自己经常用的几台电脑上有密钥就好了。

#/etc/ssh/sshd_config
#公钥认证方式一般默认是开启的,无需更改
RSAAuthentication yes
PubkeyAuthentication yes

#密码认证方式默认是yes,改成no
PasswordAuthentication no

5. 停用不必要的服务

比如 vsftpd ,如果之前使用过现在不需要了,记得停用,然后彻底禁用掉。少一个服务少一个威胁。另外,像 FTP 这种服务,能不用就不用了,需要传文件的时候SCP足矣。可以用 netstat 命令查一下有监听端口的服务,然后排除不必要的。

zhu@digglife:~$ sudo netstat -tlunp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 127.0.0.1:8001          0.0.0.0:*               LISTEN      7044/uwsgi      
tcp        0      0 127.0.0.1:3306          0.0.0.0:*               LISTEN      23725/mysqld    
tcp        0      0 127.0.0.1:11211         0.0.0.0:*               LISTEN      27557/memcached 
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      8281/nginx: worker 
tcp        0      0 0.0.0.0:xxxx            0.0.0.0:*               LISTEN      16421/sshd      
tcp        0      0 0.0.0.0:xxxx            0.0.0.0:*               LISTEN      8281/nginx: worker 
tcp6       0      0 :::xxxx                 :::*                    LISTEN      16421/sshd      
udp        0      0 127.0.0.1:11211         0.0.0.0:*                           27557/memcached 
zhu@digglife:~$ 

6. 辅助服务只监听本地回环

某些服务只提供给本地的其他软件,比如 WordPress 必要的 MySQL,缓存插件用的 memcached 等等,只要是提供本地服务的,都设置为监听127.0.0.1,能规避直接的远程攻击。以 memcached 为例,配置文件为 /etc/memcached.conf ,默认监听所有IP。

# Specify which IP address to listen on. The default is to listen on all IP addresses
# This parameter is one of the only security measures that memcached has, so make sure
# it's listening on a firewalled interface.
-l 127.0.0.1

设置好重启服务之后惯例 netstat 检查一下。

以上这些只是最基本的服务器防护,实施起来十分简单,而且不会带来使用上的不方便。复杂的安全方式当然还有,比如使用iptables设定防火墙过滤,更改UMASK,开启Audit等等等等,但是比较复杂,多有妨碍自己方便的情况,何况一般也用不着。

对于服务器本身这一方面,如果想进一步做安全配置,可以分析一下一天的 security 相关log,RH系在 /var/log/secure ,Debian系在 /var/log/auth.log ,基本上能够了解攻击的类型,然后采取有针对性的措施。