最近发现服务器/var/log/auth.log文件里每天无数个暴力SSH登录尝试,各种invalid user。用iptables封掉了几个来源IP,每天还是有新IP来攻击。虽说服务器用key登录,每天暴增的log还是让人十分不爽。网上学习了学习,总结一下Linux服务器防暴力破解攻击(brute-force attacks)的方法:

1. 用复杂一点的用户名/密码

当你把你的ssh暴露在公网下,要想到的第一件事就是黑客们会来猜你的用户名/密码。密码设置复杂一点,这个就不多说了。

2. 禁用root登录

SSH的配置文件在/etc/ssh/sshd_config中。要禁用root登录,确定其中有:

# Prevent root logins:
PermitRootLogin no

然后重启sshd/ssh服务:

service ssh restart

如果你要root权限,用一般用户登录再su。

3. 限制用户登录

仅允许需要远程ssh的用户登录,你可以在sshd_config文件里配置

AllowUsers username1 username2

别忘了重启ssh服务

4. 关闭Protocol 1

SSH可能用到的两个协议:Protocol 1 和 Protocol 2。老的Protocol 1 相较而言安全性要低一些。如果你没有特别的需要,就把它关掉。同样是在sshd_config文件:

# Protocol 2,1
Protocol 2

5. 使用Public/Private Keys来认证

用Keys来认证,一来你不用每次输密码了,二来你可以关闭密码认证,就无所谓那些密码猜测暴力破解了。

6. 使用非标准的端口

SSH默认监听来自22端口的连接,把它改了。(依然是改配置文件,记得重启ssh服务)这个方法没有有些人说的那么有用,但是它至少可以减少你的log里那些只攻击22端口的黑客们留下的记录。其实你不用太担心这些暴力尝试。

不过如果一定要改端口,不要用超过1024的端口。因为在有些Unix-like的系统,低于1024的端口是只有root才有权限监听的。如果使用了超过1024的端口,反而会在某些方面降低服务器的安全性。

更改SSH端口的方法:

修改/etc/ssh/sshd_config文件中:

# Port 22
Port 789

然后重启sshd/ssh服务:

service ssh restart

7. 使用denyhosts或者fail2ban

我搞了个fail2ban。fail2ban可以监视你的系统日志,然后匹配日志的错误信息(正则式匹配)执行相应的屏蔽动作(一般情况下是调用防火墙屏蔽),如:当有人在试探你的SSH、SMTP、FTP密码,只要达到你预设的次数,fail2ban就会调用防火墙屏蔽这个IP,而且可以发送e-mail通知系统管理员,很实用、很强大。

安装fail2ban:

apt-get install fail2ban

安装好以后,目录如下:

/etc/fail2ban/
├── action.d
│   ├── dummy.conf
│   ├── hostsdeny.conf
│   ├── iptables.conf
│   ├── mail-whois.conf
│   ├── mail.conf
│   └── shorewall.conf
├── fail2ban.conf
├── fail2ban.local
├── filter.d
│   ├── apache-auth.conf
│   ├── apache-noscript.conf
│   ├── couriersmtp.conf
│   ├── postfix.conf
│   ├── proftpd.conf
│   ├── qmail.conf
│   ├── sasl.conf
│   ├── sshd.conf
│   └── vsftpd.conf
├── jail.conf
└── jail.local

目录action.d下的文件指定满足条件时执行的一些动作,比如使用iptables禁止ip访问。
目录filter.d下的文件定义匹配日志的正则表达式。
fail2ban.conf文件是配置fail2ban-server程序启动的一些参数。
jail.conf文件包含filter及action的指定。
每个conf文件可被local文件覆盖,conf文件第一个被读取,接着是读取local文件,所以local文件中定义的参数会覆盖conf中的参数。所以我们不需要添加所有的内容到local文件,只需要添加conf文件中你想覆盖的部分参数就好。

配置好以后,启动fail2ban:

service fail2ban start

启动之后,只要符合filter所定义的正则式规则的日志项出现,就会执行相应的action。