由于服务器开放着SSH协议,经常在互联网上会有一些莫名的“骇客”在扫描我服务器的22端口并试图登录,这给服务器安全带来了很多的隐患。如何保障SSH的安全,自然成为了我们管理员工作的重中之重。
BSD的Ports系统收录了N多的 SSH保护软件,其中有denyhosts,sshit,sshguard,file2ban(ports中无此项)等,起初,我用denyhosts来 阻挡SSH的恶意登录,发现它是调用TCP wrapper来实现的,感觉上并不是太好。后来,无意间发现了SSHguard,它可以结合BSD系统内置的防火墙(IPFW、PF、IPFILTER)来过滤SSH登录,非常不错。实现过程如下:
1)安装SSHguard
- # cd /usr/ports/security/sshguard-pf
- # make install distclean
2)删除syslogd里的注释,启动SSHguard
- auth.info;authpriv.info |exec /usr/local/sbin/sshguard
3)重新加载syslogd
- # /etc/rc.d/syslogd reload
如看到以下信息,证明成功启动
- Nov 20 08:00:01 test sshguard[54247]: Started successfully [(a,p,s)=(4, 420, 1200)], now ready to scan.
4)在PF里加入以下规则,即可
- # Define Tables for SSH
- table <sshguard> persist
- block in quick on $ext_if proto tcp from <sshguard> to any port 22 label "ssh bruteforce"
看日志,已经有人试图登录,被SSHguard阻止了,帅吧
- Nov 20 03:56:44 test sshd[52381]: Invalid user globus from 88.191.121.114
- Nov 20 03:56:47 test sshd[52383]: Invalid user condor from 88.191.121.114
最后,屏蔽所有人对我服务器外网口的icmp探测 (Default PF rules is block all)
- pass out inet proto icmp all icmp-type $icmp_types keep state label "allow ping"
注意哦,是pass out,而非pass in,这样,内网用户依然可以检测与外网的通讯,而外网用户无法探测我服务器外网口是否存活。
查看SSH阻击列表
- #pfctl -tsshguard -Tshow
59.63.157.63
109.123.126.166
116.125.127.120
123.212.43.243
125.250.249.34
174.123.157.66
182.18.29.190
195.49.134.149
202.170.126.6
218.240.1.117
218.241.155.13
221.132.34.138
哇,这么多IP被block了