现在网络安全闹得沸沸扬扬,而且前两天发现之前部门的服务器被入侵而后用来攻击别人。所以花了点儿时间对我的 VPS 安全做了些研究。下面是配置记录。嗯,因为 Linux 发行版比较多,不同的发行版很多设置不太一样,有必要先说说我的 Linode VPS 的环境:CentOS + LAMP + phpMyAdmin。 使用强密码不管采取了多少其它的安全措施,如果使用的密码不够强健,恐怕一切都是白搭,所以首先需要设定足够强健的密码。包括系统用户登录密码,特别是 root 帐户的;还有 MySQL 用户的密码;以及其它一切可以获取读取系统任何内容的权限的密码。总之,一切密码好了。同时还要注意,不要使用相同的密码。 不要怕记不住。编写一个强健的密码,然后在自己的日记本上写下来,同时在电脑上找个地方保存下来(Windows 7 的便笺就是个不错的选择)。需要通过网页登录,或者使用 SSH 登录的时候,只需要复制粘贴就可以了(在 Putty 的窗口单击鼠标右键就可以完成粘贴)。 对VPS上所有的密码都是用强密码,并且要互不相关,避免泄露一个密码后其它密码随之泄露。 清理不需要的系统用户和组虽然 Linode VPS 提供的 CentOS 系统已经优化得挺不错的了,可还是有不少系统内建用户和组是不需要的。清理掉这些用户和组也有助于系统安全。当然,安全起见,还是需要先备份。 CentOS 中用户信息存储在 /etc/passwd 文件中。下面的命令可以显示出所有用户。 cat /etc/passwd 使用 root 帐户运行下面的命令来清理不需要的用户和组: cp /etc/passwd /etc/passwd.sav cp /etc/group /etc/group.sav for a in adm lp sync news uucp operator games gopher mailnull nscd rpc; do /usr/sbin/userdel $a -f; done for a in lp news uucp games gopher users floopy nscd rpc rpcuser nfsnobody; do /usr/sbin/groupdel $a -f; done 清理用户和组的方法参考自 128M VPS 上优化 CentOS 5 一文。用户和组完全是按照该文来清理的。也许还有别的用户和组也可以禁用,留待以后测试。 加强 SSH 安全?这一部分主要通过修改 SSH 的配置文件来实现: vim /etc/ssh/sshd_config 重点是下面 3 项。所有几个关键配置都列在这一节的后面,以供参考。
参考资料:
附:SSH 配置文件样本(一些用 # 注释掉的行没有列上) Port 1234 Protocol 2 SyslogFacility AUTHPRIV PermitRootLogin no AllowUsers user1 user2 /etc/ssh/ssh_known_hosts PermitEmptyPasswords no PasswordAuthentication yes ChallengeResponseAuthentication no GSSAPIAuthentication yes GSSAPICleanupCredentials yes UsePAM no # Accept locale-related environment variables AcceptEnv LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES AcceptEnv LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT AcceptEnv LC_IDENTIFICATION LC_ALL LANGUAGE AcceptEnv XMODIFIERS X11Forwarding no # override default of no subsystems Subsystem sftp /usr/libexec/openssh/sftp-server UseDNS no Banner /etc/issue 使用 iptables 对连接进行限制因为 iptables 中的规则对顺序很敏感,下面先提几个方面,然后给出全部配置文件内容(以 # 注释来进行说明)。
我发现编辑 iptables 条目实际上不需要使用如下的命令行慢慢来操作, iptables -A INPUT ......... 而是可以将 iptables 文件下载下来,使用记事本之类的编辑器编辑(当然格式还是得参照已有的规则)来编写,然后再上传过去覆盖掉原来的,再使用下面的命令行来加载新规则即可, service iptables restart 下面是我目前用的iptables 文件: # Generated by iptables-save v1.4.7 on Fri Mar 9 23:08:51 2012 *filter :INPUT ACCEPT [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [1301:2201856] # 下面两个 chain 是用来记录 ssh 尝试登录次数的 :blacklist - [0:0] :sshscan - [0:0] # 2012.03.16 新增一个 CHAIN :syn_flood - [0:0] # rule 1 允许所有本机发出的通讯 -A INPUT -s 127.0.0.1/32 -j ACCEPT # rule 2 限制 RELATED,ESTABLISHED 一类的连接速率为每秒钟 50 个,峰值 50;超过限制的则不接受 # 似乎不需要这么做,清除这一部分 2012.03.16 #-A INPUT -m state --state RELATED,ESTABLISHED -m limit --limit 50/sec --limit-burst 50 -j ACCEPT -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT # 跳转到 syn_flood CHAIN 来判断是否有“洪水”攻击,2012.03.16 -A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -j syn_flood # 有限接受 icmp 包,2012.03.16 -A INPUT -p icmp -m limit --limit 10/sec -j ACCEPT -A INPUT -p icmp -m limit --limit 10/sec -j LOG --log-prefix "PING-DROP: " --log-level 6 # rule 3 限制 80 端口新建连接的速度为 50 个每分钟,峰值 200;超过限制的不接受 -A INPUT -p tcp -m tcp --dport 80 -m state --state NEW -m limit --limit 50/min --limit-burst 200 -j ACCEPT # 邮件服务基本上全部由 Google 企业邮局完成,删除下面有关 465 和 25 端口的条目,禁用这 2 个端口 2012.03.16 # rule 4 类似 rule 3 来限制 465 端口 #-A INPUT -p tcp -m tcp --dport 465 -m state --state NEW -m limit --limit 30/min --limit-burst 100 -j ACCEPT # rule 5 类似 rule 3 来限制 25 端口 #-A INPUT -p tcp -m tcp --dport 25 -m state --state NEW -m limit --limit 30/min --limit-burst 100 -j ACCEPT # rule 6 类似 rule 3 来限制 5678 端口(这是我特殊使用的一个端口) -A INPUT -p tcp -m tcp --dport 5678 -m state --state NEW -m limit --limit 10/min --limit-burst 20 -j ACCEPT # rule 7 限制 80 端口并发连接数不超过 20,否则发送 tcp reset 来拒绝连接 -A INPUT -p tcp -m tcp --dport 80 --tcp-flags FIN,SYN,RST,ACK SYN -m connlimit --connlimit-above 20 --connlimit-mask 32 -j REJECT --reject-with tcp-reset # rule 8,9 开放 53 端口(DNS 服务) # 似乎不开放这个端口也没有问题,禁用掉 2012.03.16 #-A INPUT -p tcp -m tcp --sport 53 -j ACCEPT #-A INPUT -p udp -m udp --sport 53 -j ACCEPT # rule 10 配合前面提到的两个 chain 来限制 ssh 新建连接,并对超过尝试次数的连接封锁指定时间 -A INPUT -p tcp -m tcp --dport 1234 -m state --state NEW -j sshscan # rule 11 丢弃其它不满足前述规则的连接 -A INPUT -j DROP # 以下是前面提到的 2 个检查 ssh 连接的 chain,blacklist 和 sshscan -A blacklist -m recent --set --name blacklist --rsource -A blacklist -j DROP -A sshscan -m recent --update --seconds 600 --hitcount 1 --name blacklist --rsource -j DROP -A sshscan -m recent --set --name counter1 --rsource -A sshscan -m recent --set --name counter2 --rsource -A sshscan -m recent --set --name counter3 --rsource -A sshscan -m recent --update --seconds 20 --hitcount 3 --name counter1 --rsource -j blacklist -A sshscan -m recent --update --seconds 200 --hitcount 15 --name counter2 --rsource -j blacklist -A sshscan -m recent --update --seconds 2000 --hitcount 20 --name counter3 --rsource -j blacklist -A sshscan -j ACCEPT # 判断 syn_flood 攻击与否,不是则 RETURN(返回),否则 DROP 3012.03.16 -A syn_flood -m limit --limit 10/sec -j RETURN -A syn_flood -j DROP COMMIT # Completed on Fri Mar 9 23:08:51 2012 另外,也有在 iptables 中限制 ICMP 连接的,我是统统丢弃了。需要的话请参考: http://serverfault.com/questions/287998/is-my-linux-firewall-secure ------------------------------------------------------------------------------------------------------------------------ from:http://cnzhx.net/blog/secure-my-vps/ |