序
ssh防御有很多种手段
一开始使用了 ssh配合pam 来实现 多次登录失败就锁定账户的策略,
如果管理员使用root作为常用的用户,并且没有创建其他用户或者允许其他用户ssh登录,
那么一旦启用这个规则后root多次错误之后就会被锁定,管理员也无法登录
之前有个项目安全审计需要整改,匆忙就使用了上诉方法,输入密码错误5次之后就锁定600秒,
本以为没啥问题,抱着测试一下的心态去输入错误密码5次之后,账户真就被锁定了,反正600秒之后就解锁了,接没管了,结果第二天发现还是无法ssh连接,最后才想起来,还有个监控系统配置的也是root账户,每隔一分钟就连上去收集性能指标,所以这个监控系统还是不厌其烦的去尝试,导致账户一直没有解锁,最后直接去机房操作解锁
网上还有使用脚本去读取/var/log/auth.log 或者是/var/log/secure 的日志,把尝试次数多的IP添加到/etc/hosts.deny 中来拒绝登录,其实也可行,就是觉得这还不是最优解,翻阅各类网站找到了Fail2ban 这个软件来防御ssh攻击
使用Fail2ban与firewalld 配合来实现ssh错误输入之后直接封锁该IP 访问ssh端口来拦截攻击者,但是其余端口仍然允许访问,避免误封之后业务系统无法访问的尴尬情况
安装Fail2ban
yum install epel-release -y
yum install fail2ban
配置说明
/etc/fail2ban 配置文件目录
jail.conf 为主配置文件一般不直接修改
jail.d 规则目录,我们也将在此目录下新建
防火墙配置
查看防火墙状态
firewall-cmd --state
启动防火墙
systemctl start firewalld
开启必要的端口
firewall-cmd --zone=public --add-port=22/tcp --permanent<br>firewall-cmd --zone=public --add-port=80/tcp --permanent<br>firewall-cmd --zone=public --add-port=443/tcp --permanent<br>firewall-cmd --reload
查看已经放通的端口
firewall-cmd --list-all
配置fail2ban
新建 jail.local 来覆盖 Fail2ban 的一些默认规则
vim /etc/fail2ban/jail.d/jail.local
[DEFAULT]
#指定哪些地址可以忽略 fail2ban 屏蔽
ignoreip = 127.0.0.1/8
#客户端IP被封禁时长
bantime = 24h
#在多长时间内允许尝试
findtime = 10m
#允许客户端尝试失败的次数, -1永久封禁
maxretry = 5
#屏蔽IP所使用的方法
banaction = firewallcmd-ipset
action = %(action_mwl)s
[sshd]
enabled = true
filter = sshd
port = 22
action = %(action_mwl)s
logpath = /var/log/secure
启动fail2ban
systemctl start fail2ban
systemctl enable fail2ban
systemctl status fail2ban
查看状态
fail2ban-client status sshd
解锁被封ip
fail2ban-client set sshd delignoreip
fail2ban-client set sshd unbanip 192.168.10.100
其他
#检查攻击来源
#btmp文件会记录SSH端口登录失败的信息,包括尝试的用户名、IP地址和时间等信息。
#btmp为二进制文件,文件路径为/var/log/btmp。
#查看文件btmp
#使用命令lastb可以查看文件btmp的信息,参数-n可以指定显示数量。
lastb -n 10 | tac
#查看尝试登录失败最多的ip
lastb | awk '{ print $3}' | sort | uniq -c | sort -n
#查看攻击者尝试的用户名
lastb | awk '{ print $1}' | sort | uniq -c | sort -n
#查看攻击开始时间
lastb | grep 192.168.0.100
#查看攻击终止时间
lastb | grep 192.168.0.100 | tac
#查看IP地理位置
curl cip.cc/192.168.0.100