由于服务器开放着SSH协议,经常在互联网上会有一些莫名的“骇客”在扫描我服务器的22端口并试图登录,这给服务器安全带来了很多的隐患。如何保障SSH的安全,自然成为了我们管理员工作的重中之重。 ­

BSD的Ports系统收录了N多的 SSH保护软件,其中有denyhosts,sshit,sshguard,file2ban(ports中无此项)等,起初,我用denyhosts来 阻挡SSH的恶意登录,发现它是调用TCP wrapper来实现的,感觉上并不是太好。后来,无意间发现了SSHguard,它可以结合BSD系统内置的防火墙(IPFW、PF、IPFILTER)来过滤SSH登录,非常不错。实现过程如下: ­

1)安装SSHguard ­

  1. # cd /usr/ports/security/sshguard-pf 
  2. # make install distclean 

2)删除syslogd里的注释,启动SSHguard ­

  1. auth.info;authpriv.info     |exec /usr/local/sbin/sshguard 

3)重新加载syslogd ­

  1. # /etc/rc.d/syslogd reload 

如看到以下信息,证明成功启动 ­

  1. Nov 20 08:00:01 test sshguard[54247]: Started successfully [(a,p,s)=(4, 420, 1200)], now ready to scan. 

4)在PF里加入以下规则,即可

  1. # Define Tables for SSH 
  2. table <sshguard> persist 
  3. block in quick on $ext_if proto tcp from <sshguard> to any port 22 label "ssh bruteforce" 

看日志,已经有人试图登录,被SSHguard阻止了,帅吧

  1. Nov 20 03:56:44 test sshd[52381]: Invalid user globus from 88.191.121.114 
  2. Nov 20 03:56:47 test sshd[52383]: Invalid user condor from 88.191.121.114 

最后,屏蔽所有人对我服务器外网口的icmp探测Default PF rules is block all) ­

  1. pass out inet proto icmp all icmp-type $icmp_types keep state label "allow ping" 

注意哦,是pass out,而非pass in,这样,内网用户依然可以检测与外网的通讯,而外网用户无法探测我服务器外网口是否存活。

查看SSH阻击列表

  1. #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了