最近刚搞完网络安全攻防演练,正好整理用到的一些命令。
这次记录的是将SSH多次登录失败的IP加入黑名单的过程。
```
# 统计暴力破解次数
awk '/Failed/{fa[$(NF-3)]++}END{for(pol in fa)print pol,fa[pol]}' /var/log/secure|column -t
```
我虽然将ssh的端口更改了,但还是免不了被人发现,并且尝试暴力破解。

查看记录才发现一直有被爆破的记录,最离谱的一个IP爆破了2W次......
```
列出登入失败的用户记录
lastb
```
经过查询网上网友们的解决方案,发现可以使用定时任务来检查登录失败主机列表,并将达到登录失败次数的主机IP地址加入到黑名单。
感觉很不错,为了服务器的安全,我决定在服务器也弄一个,降低 sshd 服务的压力。
脚本如下:
```
#!/usr/bin/bash
# 通过lastb获取登录失败的IP及登录失败的次数
lastb | awk '{print $3}' | grep ^[0-9] | sort | uniq -c | awk '{print $1"\t"$2}' > /tmp/host_list
list=`cat /tmp/host_list`
line=`wc -l /tmp/host_list | awk '{print $1}'`
count=1
# 如果/tmp/host_list中有数据,循环至少需要执行一次
while [[ "$line" -ge "$count" ]]; do
ip_add=`echo $list | awk '{FS="\t"} {print $2}'`
num=`echo $list | awk '{FS="\t"} {print $1}'`
# 登录失败达到5次就将该IP写入文件
if [[ "$num" -ge 5 ]]; then
grep "$ip_add" /etc/hosts.deny &> /dev/null
if [[ "$?" -gt 0 ]]; then
# --------> 此处添加当前系统时间,请根据实际情况定义日期格式
echo "# $(date +%F' '%H:%M:%S)" >> /etc/hosts.deny
echo "sshd:$ip_add" >> /etc/hosts.deny
fi
fi
let count+=1
# 删除已经写入文件的IP
sed -i '1d' /tmp/host_list
# 修改$list变量
list=`cat /tmp/host_list`
done
# 清空临时文件
echo '' > /tmp/host_list
exit 0
```
弄好脚本将其加到 `crontab` 定时任务执行就完成了~
# 10-08更新
新版本优化的脚本如下:
```
#!/bin/bash
#获取ssh登录失败的黑名单IP,写入临时文件/tmp/faildSSHIP.list.tmp
awk '/Failed/{{if($(NF-3)~"[0-9]{1,3}.") print $(NF-3)}}' /var/log/secure | sort | uniq -c|sort -nr -k1|awk '{{if($1>5)print $2}}' > /tmp/faildSSHIP.list.tmp
#遍历临时黑名单IP文件/tmp/faildSSHIP.list.tmp,如果某个IP不在/etc/hosts.deny里,则加入
for i in `cat /tmp/faildSSHIP.list.tmp`
do
grep -qw $i /etc/hosts.deny
if test $? -ne 0 ; then
echo "sshd: ${i}" >> /etc/hosts.deny
fi
done
```

将SSH多次登录失败的IP加入黑名单