我试图克服 /var/log/secure 日志文件,并显示仅“密码失败”日志类型,该日志类型至少出现 3 次。 有没有什么方法可以只使用linux命令来做到这一点? awk?格雷普?
安全日志的示例,
Mar 20 08:38:28 localhost sshd[21895]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=mail.queued.net user=root
Mar 20 08:38:31 localhost sshd[21895]: Failed password for root from 207.210.101.209 port 2854 ssh2
Mar 20 15:38:31 localhost sshd[21896]: Received disconnect from 207.210.101.209: 11: Bye Bye
Mar 20 08:38:32 localhost unix_chkpwd[21900]: password check failed for user (root)
Mar 20 08:38:32 localhost sshd[21898]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=she
从这个日志文件中我期望没说什么因为只有 1 行密码失败,但假设有 4 行“密码失败”,具有相同的 IP - 我想显示可能试图暴力破解我的 IP 地址。
答案1
这只是完成这项工作的一种方法。我更喜欢计算特定 IP 地址尝试连接到我的主机的次数,而不是用户名,因为这样我最终可以禁止它。
awk '/Failed password/{ z[$11]++; }
END{
for (i in z){
if (z[i]>3) printf("%s attemps %s times.\n", i, z[i])
}
}' /var/log/secure
(当然它可以是一个oneliner命令,我缩进是为了增加可读性。)
解释:
awk
逐行读取日志文件。如果一行包含字符串,/Failed password/
则将数组元素z[$11]++
索引递增$11
(即 IP 地址):我将其用作计数器。最后,在数组中搜索z[$11]
并仅打印尝试连接超过 3 次的 IP 地址。
您可以根据需要自定义检查和打印消息。
如果您担心的是暴力尝试,我可以建议您使用现有的工具作为失败2禁止它会扫描日志文件并禁止显示恶意迹象的 IP(例如:密码失败次数过多、寻求漏洞利用等)。它很容易理解和配置以满足您的需求。
答案2
$ awk '/Failed password/{for(i=1;i<=NF;i++)if($i~/for/)user[$(i+1)]++}END{for(j in user){if(user[j]>3){printf("%s : %s times failed\n",j,user[j])}}}' /var/log/secure