服务器被SSH暴力破解解决方案

服务器端使用Debian 9×64系统,发现大量不存在的用户名登陆失败记录,于是使用Fail2ban进行IP封禁。

查看系统登录日志(仅root用户)

last|less会返回一系列登录成功的记录,格式为

用户名+终端位置+IP地址+登录时间+在线时长
root pts/1 IP Sat May 25 17:23 still logged in

lastb会返回一系列登录失败的记录,格式为

steam1   ssh:notty    188.165.44.214   Sat May 25 06:19 - 06:19  (00:00)
dan      ssh:notty    134.175.18.237   Sat May 25 06:19 - 06:19  (00:00)
steam1   ssh:notty    188.165.44.214   Sat May 25 06:19 - 06:19  (00:00)
12345678 ssh:notty    82.223.130.223   Sat May 25 06:18 - 06:18  (00:00)
12345678 ssh:notty    82.223.130.223   Sat May 25 06:18 - 06:18  (00:00)
tom1     ssh:notty    164.132.62.233   Sat May 25 06:18 - 06:18  (00:00)
# 查看不存在的用户名登录失败的日志
grep "Failed password for invalid user" /var/log/auth.log | awk '{print $13}' | sort | uniq -c | sort -nr | more
# 查看root账户登录失败记录
sudo grep "Failed password for root" /var/log/auth.log | awk '{print $11}' | sort | uniq -c | sort -nr | more

下面的登录失败记录只是冰山一角

199 92.50.249.166
199 47.107.55.172
199 195.114.210.238
199 194.56.72.6
199 159.89.149.46

更改SSH端口

可以从输出结果看到这个服务器被攻击的相当频繁,还好之前改过SSH端口。

# 一键更改端口
wget -N --no-check-certificate https://raw.githubusercontent.com/ToyoDAdoubi/doubi/master/ssh_port.sh && chmod +x ssh_port.sh && bash ssh_port.sh

下面是手动方法:

vim /etc/ssh/sshd_config打开SSH的配置文件,可以找到#Port字样,默认一般为22,非常不安全,将其注释去掉并在其后添加一行,即Port ***,添加新的SSH端口,在验证新端口好用后再将22端口注释掉。

在修改端口之后需要重启SSH服务

/etc/init.d/sshd restart  //或者
service sshd restart 

如果还是访问不通,需要进行防火墙配置

  /etc/init.d/iptables stop   //或者
  service iptables stop     

或者在防火墙过滤规则中上增加一条,允许对新增的端口的访问:

vim /etc/sysconfig/iptables
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
***********
-A INPUT -m state --state NEW -m tcp -p tcp --dport 2022 -j ACCEPT
***********
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT

Fail2ban配置

之前尝试使用过DenyHosts,其已经很长时间没有进行维护而且它用的Python2与服务器上部署的Python3有不兼容的现象,弃用。

Fail2ban是一款实用软件,可以监视你的系统日志,然后匹配日志的错误信息(正则式匹配)执行相应的屏蔽动作。一般需求的操作并不复杂,修改配置文件即可。

安装

apt-get install fail2ban

打开配置文件

vim /etc/fail2ban/jail.conf

配置文件翻译如下:

我并没有在服务器上配置邮件服务,也不需要邮件提醒,主要是修改前12行

[DEFAULT]
# 忽略的IP列表,不受设置限制
ignoreip = 127.0.0.1/8 

# 被封IP禁止访问的时间,单位是秒
bantime = 60000

# 检测时间,在此时间内超过规定的次数会激活fail2ban,单位是秒 
findtime = 300

# 允许错误登录的最大次数
maxretry = 2

需要将Fail2ban设置为开机自启动

# 设置fail2ban开机启动
systemctl enable fail2ban
systemctl start fail2ban

# 启动与重启fail2ban
service fail2ban start
service fail2ban restart

日志查看功能

# 查看最近100条记录 ps.可以配合grep筛选已Ban列表
tail -100 /var/log/fail2ban.log

查看SSH服务监护状态,能看到当前被禁IP

fail2ban-client status sshd