如何统计出系统中谁在破解你的密码及破解的次数(分析/var/log/secure)
分析/var/log/secure的IP地址 计算次数 并格式化输出 [root@template ~]# cat /var/log/secure|awk -F "[ :]+" '{ip[$14]=ip[$14]+1} END{for (item in ip) {printf "%-20s %-s \n",item,ip[item] }}'
一、系统:CentOS 6.3 64位
二、方法:读取/var/log/secure,查找关键字 Failed,例如(注:文中的IP地址特意做了删减):
Sep 17 09:08:09 localhost sshd[29087]: Failed password for root from 13.7.3.6 port 44367 ssh2 Sep 17 09:08:20 localhost sshd[29087]: Failed password for root from 13.7.3.6 port 44367 ssh2 Sep 17 09:10:02 localhost sshd[29223]: Failed password for root from 13.7.3.6 port 56482 ssh2 Sep 17 09:10:14 localhost sshd[29223]: Failed password for root from 13.7.3.6 port 56482 ssh2
从这些行中提取IP地址,如果次数达到5次则将该IP写到 /etc/hosts.deny中。
三、步骤:
1、先把始终允许的IP填入 /etc/hosts.allow ,这很重要!比如: sshd:19.16.18.1:allow sshd:19.16.18.2:allow
2、脚本 /root/secure_ssh.sh
#! /bin/bash cat /var/log/secure|awk '/Failed/{print $(NF-3)}'|sort|uniq -c|awk '{print $2"="$1;}' > /root/black.txt DEFINE="5" for i in `cat /root/black.txt` do IP=`echo $i |awk -F= '{print $1}'` NUM=`echo $i|awk -F= '{print $2}'` if [ $NUM -gt $DEFINE ];then grep $IP /etc/hosts.deny > /dev/null if [ $? -gt 0 ];then echo "sshd:$IP:deny" >> /etc/hosts.deny fi fi done
3、将secure_ssh.sh脚本放入cron计划任务,每1分钟执行一次。 # crontab -e */1 * * * * sh /root/secure_ssh.sh
四、测试:
1、开两个终端窗口,一个ssh连上服务器,另一个用错误的密码连接服务器几次。
很快,服务器上黑名单文件里已经有记录了: [root@ ~]# $ cat /root/black.txt 13.26.21.27=3
再看看服务器上的hosts.deny [root@ ~]# cat /etc/hosts.deny sshd:13.7.3.6:deny sshd:92.4.0.4:deny sshd:94.10.4.2:deny sshd:94.4.1.6:deny sshd:11.64.11.5:deny
2、从另一个终端窗口继续“暴力”连接服务器。
看看服务器上的黑名单文件: [root@ ~]# cat black.txt 13.26.21.27=6
再看看服务器上的hosts.deny [root@ ~]# cat /etc/hosts.deny sshd:13.7.3.6:deny sshd:92.4.0.4:deny sshd:94.10.4.2:deny sshd:94.4.1.6:deny sshd:11.64.11.5:deny sshd:13.26.21.27:deny
IP 已经被加入到服务器的hosts.deny,再用正确的密码连接服务器,被拒绝: $ ssh root@myserver.mydomain.com -p 2333 ssh_exchange_identification: Connection closed by remote host
注: 1.脚本为同事编写。
2.服务器sshd端口已改为2333,事实证明,改了端口后,暴力破解的ssh连接数锐减。
分析安全日志
/var/log/secure
定位有多少IP在爆破主机的root帐号:
grep "Failed password for root" /var/log/secure | awk '{print $11}' | sort | uniq -c | sort -nr | more
定位有哪些IP在爆破:
grep "Failed password" /var/log/secure|grep -E -o "(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?).(25[0-5]|2[0-4][09]|[01]?[0-9][0-9]?).(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?).(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)"|uniq -c
爆破用户名字典是什么?
grep "Failed password" /var/log/secure|perl -e 'while($_=<>){ /for(.*?) from/; print "$1\n";}'|uniq -c|sort nr
定位有多少IP在爆破主机的root帐号:
grep "Accepted " /var/log/secure | awk '{print $11}' | sort | uniq -c | sort -nr | more
定位有哪些IP在爆破:
grep "Accepted " /var/log/secure | awk '{print $1,$2,$3,$9,$11}'
access_log
查看 IP
[root@localhost logs]# cat access_log | awk '{print $1}'
显示访问前10 位的IP 地址,便于查找攻击源
[root@localhost logs]# cat access_log|awk '{print $1}'|sort|uniq -c|sort -nr|head -10
显示指定时间以后的日志
[root@localhost logs]# cat access_log |awk '$4>="[1/Jan/2020:00:00:00"'
查看某一时间内的 IP 连接情况
[root@localhost logs]# grep "2020:05"access_log |awk '{print $4}'|sort|uniq –c |sort -nr
查看指定的 IP 做了什么
[root@localhost logs]# cat access_log |grep 192.168.3.3| awk '{print $1"\t"$8}'| sort|uniq –c |sort –nr|less
查看最近访问量最高的文件
[root@localhost logs]# cat access_log |tail 10000| awk '{print $7}'| sort|uniq –c |sort –nr|less
shell-将密码输入错误超过4次的IP地址通过firewalld防火墙阻止访问
应用场景:防止恶意IP尝试ssh登录
脚本说明:将密码输入错误超过四次得ip地址通过iptable防火墙访问。
分析:
首先,需要知道ssh远程访问记录在哪一个文件中 /var/log/secure
其次,模拟远程访问输错密码,查看日志文件
再次,通过日志可以看到关键信息“Failed password”表示错误密码有可能事手误引起得,所以设定几次错误为恶意试探密码,建议设置为4;还有需要将恶意试探密码主机得ip提取出来,对提取得ip地址进行统计计数
最后,需要明确怎么在脚本中通过iptables策略设置阻止恶意ip访问策略添加到哪里合适;防火墙2配置文件等。
模拟远程访问,查看日志
发现每一次错误密码后,显示主机ip时前都有 Failed password
所以我还可以借助Failed password字段来获取 恶意访问ip。二ip在倒数第三个字段(以空格为分隔符)
awk '/Failed password/ {print $(NF-3)}' /var/log/secure
设定4次错误为恶意试探密码,并提取得ip地址进行统计计数
首先我没需要将恶意IP地址进行统计
[root@cotenos ~]# awk '/Failed password/ {IP[$(NF-3)]++} END{for (i in IP) print i,IP[i]}' /var/log/secure
对超过4次的错误的ip进行选取
[root@cotenos ~]# awk '/Failed password/ {IP[$(NF-3)]++} END{for (i in IP) {if ($IP[i] >= 4) print i,IP[i]}}' /var/log/secure
或者
[root@cotenos ~]# awk '/Failed password/ {print $(NF-3)}' /var/log/secure | sort | uniq -c | awk '$1>=4 {print $2}'
最后将获取的ip遍历,使用firewalld-cmd命令对ip进行阻隔
总代码
#!/bin/bash
bath=/var/log/secure
ip=`awk '/Failed password/ {IP[$(NF-3)]++} END{for (i in IP) {if ($IP[i] >= 4) print i}}' $bath`
for i in $ip
do
firewall-cmd --add-rich-rule="rule family=ipv4 source address=$i/32 service name=ssh dorp"
done