如何使用 grep 或 awk 操作日志文件?

如何使用 grep 或 awk 操作日志文件?

我试图克服 /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

相关内容