成功登录IP地址列表

成功登录IP地址列表

我知道我需要查看 /var/log/auth.log,但我似乎无法仅 grep 成功的 IP 地址。我希望以以下格式输出到另一个文件:

Accepted from <username /> from <ipaddress /> port <port /> at <datetime />

其目的是由开发 nginx 网络服务器运行一个 cron 作业,该作业将运行一个 cron 作业来记录并只允许使用公钥通过 ssh 登录的最新 IP 访问页面(如果这提供了一些上下文)。

答案1

您可以使用:

grep -Po 'sshd.*\KAccepted publickey for [a-z]+ from [0-9.]+ port [0-9]+' /var/log/auth.log >> /path/to/outfile

在哪里grep的选项-P将启用 Perl 风格的正则表达式PCRE 函数(使用\K)并且-o仅打印匹配的捕获部分。

sshd将确保该行仅与日志中的 SSH 相关的身份验证行匹配...\K将从打印中排除其左侧的内容,以便您不会在输出中看到它。

Accepted将根据身份验证日志语法匹配成功的身份验证。

publickey将仅匹配该身份验证方法,但您可以包含其他方法,例如password通过“或”|修饰符将它们拆分,例如[publickey|password]匹配两者或匹配任何字母表达式(单词/方法),您可以使用[a-z]+甚至匹配任何一个或多个字符.+

[a-z]+应该匹配字母小写(用户名),[0-9.]+应该匹配数字和点(IP),并且[0-9]+应该匹配数字(端口)...注意+是一个量词,它将匹配至少一个或多个前面的表达式。

因此,整个 RegEx 应该匹配如下行:

2024-01-16T17:26:34.896742+03:00 localhost sshd[1140156]: Accepted password for ubuntu from 127.0.0.1 port 54208 ssh2

...像这样打印:

Accepted password for ubuntu from 127.0.0.1 port 54208

...并且 shell 附加重定向将附加输出到路径中>>命名的文件,如果不存在则创建它。outfile/path/to/outfile

请注意,如果在 CRON 中用作 cronjob,则建议指定可执行文件的完整路径,/bin/grep而不是仅仅grep因为后者将依赖于您的搜索路径来解析,并且这可能与 CRON 可用的搜索路径变量不同,尤其是当作为用户调用root或添加到系统范围的 crontab 时。

为了进一步处理和格式化,您还可以使用其他更丰富的文本处理工具,例如 AWK:

awk '
/sshd.*Accepted .+ for [a-z]+ from [0-9.]+ port [0-9]+/ {
        print "Accepted from <" $7 " /> from <" $9 " /> port <" $11 " /> at <" $1 " />"
}
' /var/log/auth.log >> /path/to/outfile

... 打印一些您喜欢的格式的内容:

Accepted from <ubuntu /> from <127.0.0.1 /> port <54208 /> at <2024-01-16T17:26:34.896742+03:00 />

答案2

写这篇文章的时候我非常累,我知道可能有更好的方法。但这是我的尝试。

我猜你想在每行末尾打印找到的每行的时间戳。我使用 很快地写了这个awk,我认为可能有更好的方法来实现这一点,但是通过使用awk我们可以获取位置列。 awk假设 [[空格]] 是字段分隔符。

如果我们执行awk如下代码:

awk '/Accepted publickey/ {print}' /var/log/auth.log

/Accepted publickey/我们正在寻找的精确匹配,并且{print}没有任何字段将整行打印到屏幕上,因此我们得到如下一行:

Jan 15 21:11:07 terrance-ubuntu sshd[468972]: Accepted publickey for terrance from 127.0.0.1 port 52736 ssh2: RSA SHA256:<MyReallyLongKey>

awk默认情况下,将空格作为字段分隔符。如果您想要其他内容(例如冒号) ,:则可以在-F:之前指定它'/Accepted publickey/'。使用空格作为字段分隔符,则字段1将是 Jan,2将是 15,3将是 21:11:07,依此类推。

您可以awk指定要打印的字段{print $1,$2}等等。

抓取您在问题中输入的内容,字段将是 1、2、3,然后是 6 - 13。此外,awk可以按您想要的顺序打印出字段(用逗号分隔),也可以在“引号”中写入文本:

awk '/Accepted publickey/ {print $6,$7,$8,$9,$10,$11,$12,$13,"at",$3,"on",$1,$2}' /var/log/auth.log

我知道这条awk线很难看,但它会产生如下的线:

Accepted publickey for terrance from 127.0.0.1 port 52736 at 21:11:07 on Jan 15

然后使用该命令将其写入 root 拥有的日志中tee -a

tee手段read from standard input and write to standard output and files-a附加到文件的方法。

因此,您的命令可能如下所示:

awk '/Accepted publickey/ {print $6,$7,$8,$9,$10,$11,$12,$13,"at",$3,"on",$1,$2}' /var/log/auth.log | sudo tee -a /var/www/security/ssh_ips.log

答案3

grep -i ssh /var/log/auth.log | grep -i accept | tr -s " " | cut -d" " -f11 | sort -u

这将列出来自 auth.log 的所有 ssh 登录 ip,并进行排序。

相关内容