每个Linux系统管理员都知道日志文件是生活中的一个事实。每次出现问题时,日志文件都是诊断几乎所有可能的问题的第一个地方。玩笑归玩笑,有时候他们甚至可以提供一个解决方案。系统管理员也知道,筛选日志文件可能很乏味。一行又一行地查看通常会导致到处都是“相同的东西”,而完全错过错误消息,特别是当人们不确定要从哪里开始搜索时。
Linux提供了许多日志分析工具,包括开源的和商业许可的,用于分析日志文件。本教程将介绍非常强大的使用方法awk实用程序从各种日志文件中“提取”错误消息,以便更容易地找到问题发生的位置(和时间)。特别是对于Linux,awk是通过自由的GNU实用程序实现的腼腆的人,任何一个命令都可以用于调用awk.
来描述awk仅仅作为一个实用程序,它将文件或流的文本内容转换为可以定位的内容awk这是一个巨大的麻烦,但是这个功能与日志文件的单调统一结构相结合,使它成为一个非常实用的工具,可以非常快速地搜索日志文件。
为此,我们将研究如何与awk在本系统管理教程中分析日志文件。
如何映射日志文件
熟悉逗号分隔值(CSV)文件或制表符分隔文件的人都知道这些文件具有以下基本结构:
- 文件中的每一行都是一条记录
- 在每一行中,用逗号或制表符分隔单独的“列”
- 与数据库不同,“列”的数据格式不能保证一致
回到我们的教程,Python中的文本抓取,这看起来有点像下面:
图1 -带有假社会安全号码的CSV文件示例
图2 -同样的数据,在Microsoft Excel中检查
在这两个图中,明显的“坐标网格”跳出来了。只需使用上述网格,就可以很容易地提取出特定的信息。例如,值4235住在行5,列D上面的文件。
毫无疑问,有些读者会说:“只有当数据的结构像这个理想化的例子一样一致时,这种方法才能很好地工作!”但最棒的是awk是,这不是一个要求.使用时唯一重要的是awk对于日志文件分析来说,被匹配的每一行都有一个统一的结构,对于Linux系统中的大多数日志文件来说,这是最肯定的情况。
这个特性可以在下面的图中看到一个例子/var/log/auth.logUbuntu 22.04.1 LTS服务器上的文件:
图3 -一个示例日志文件,显示了每行之间的统一结构。
如果日志文件的每一行都是一条记录,并且使用空格作为分隔符,则可以对日志文件的每一行的每个单词使用以下数字标识符:
图4 -一行中每个单词的数字标识符
日志文件的每一行都以相同的信息开始:
- 专栏1:月缩写
- 第二列:本月几号
- 第三列:24小时格式的活动时间
- 第四列:主机名
- 列5:进程名和PID
注意,并不是每个日志文件都是这样的;不同应用程序的格式可能有很大差异。
因此,在检查上图时,最简单的方法失败了ssh该主机的登录将查找其中的日志行/var/log/auth.log,其中有文本失败的为列6而且密码为列7.数字列以美元符号($),0美元表示当前正在处理的整行。使用awk命令如下:
awk美元”(6美元= =“失败”)& &(7美元= =“密码”){打印$ 0}’/var/log/auth.log
注意:根据权限配置,上面的命令可能需要加上前缀sudo.
输出如下:
图5 -仅包含ssh登录尝试失败的日志条目
作为awk也是一种脚本语言,它的语法对于精通编码的系统管理员来说很熟悉,这并不奇怪。例如,上面的命令可以这样实现,如果你更喜欢“编码”风格的外观:
美元awk的{如果(($ 6 = =“失败”)& &(7美元= = "密码")){打印$ 0}}“/var/log/auth.log
或:
awk \{\如果美元($ 6 = =“失败”)& &(7美元= = "密码 ") ) \ { \ 打印0美元 \ } \ }' / var / log / auth.log
在上面的两个命令行中,额外的括号和圆括号被加粗。两者都会给出相同的输出:
图6 -混合和匹配awk输入
根据需要,文本匹配逻辑可以很简单,也可以很复杂,如下所示。
如何进行扩展匹配
当然,无效的登录方式ssh难道不是将登录失败列为的唯一方法吗/var/log/auth.log文件。考虑同一文件中的以下片段:
图7 -直接登录失败的日志条目
在本例中,是列6美元而且7美元拥有价值观失败的而且登录,分别。这些失败的登录来自试图从控制台登录。
当然,使用单人间是很方便的awk调用来处理这两种情况,而不是多个调用,当然,尝试在一行上键入有点复杂的脚本会很乏味。“鱼与熊掌兼得,”一个脚本可以用来包含两个条件的逻辑:
# !/usr/bin/awk - f#解析失败的登录awk{ if ( ( ($6 == "Failed") && ($7 == "password") ) || ( ($6 == "FAILED") && ($7 == "LOGIN") ) ) { print $0 } }
请注意,awk脚本不是自由形式的文本。虽然“更好地”组织这段代码很有诱惑力,但这样做可能会导致语法错误。
的代码awk脚本看起来很“c”不幸的是,它最像任何其他Linux脚本;该文件parse-failed-logins.awk需要执行权限:
$ chmod +x解析失败login .awk
下面的命令行执行这个脚本,假设它在当前工作目录中:
美元。/ parse-failed-logins。awk /var/log/auth.log
默认情况下,当前目录不在Linux的默认路径中。这就是为什么必须在当前目录下为脚本加上前缀./当运行它时。
该脚本的输出如下所示:
图8 -两种类型的登录失败
该日志的唯一缺点是,当用户试图从控制台登录时,不会记录无效的用户名。方法可以进一步简化此脚本放低函数将值转换为6美元小写字母:
# !/usr/bin/awk - f#解析失败-登录-ci。awk{ if ( tolower($6) == "failed" ) { if ( ($7 == "password") || ($7 == "LOGIN") ) { print $0 } } }
注意- f结束;结束;# !/usr/bin/awk - f在这些脚本的顶部是非常重要的!
其他日志源
下面是系统管理员可能遇到的其他一些潜在日志源的列表。
journald / journalctl
当然,日志文件的文本并不是与安全相关的信息的唯一来源。例如,使用CentOS和Red Hat Enterprise Linux (RHEL)journald为方便查阅与登入有关的资料:
$ journalctl -u SSHD -u GDM—没有分页
这个命令传递了两个单位,即sshd而且gdm,进入journalctl,因为这是在CentOS和RHEL中访问登录相关信息所必需的。
注意,默认情况下,journalctl分页它的输出。这使得awk一起工作的-no-pager选项禁用分页。
输出如下:
图9 -使用journalctl获取ssh相关的登录信息
如上图所示,而gdm表示发生了失败的登录尝试,但不指定与该尝试关联的用户名。因此,在本教程的进一步演示中不会使用这个单元;但是,如果特定于特定Linux发行版的其他单元确实提供了这些信息,则可以使用它们。
以下awk脚本可以解析出失败的登录CentOS:
# !/usr/bin/awk - f#解析失败-登录-centos。awk{ if ( (tolower($6) == "failed") && ($7 = "password") ) { print $0 } }
的输出journalctl可以直接导入管道吗awk通过命令:
美元。/ parse-failed-logins-centos。awk< <(journalctl -u sshd -u gdm --no-pager)
这种管道被称为进程替换.进程替换允许以与文件相同的方式使用命令输出。
注意,小于号和圆括号之间的间距很重要。如果括号的间距和排列不正确,该命令将不起作用。
该命令的输出如下:
图10 -将journalctl输出输送到awk
执行管道的另一种方法是使用命令:
$ journalctl——no-page -u SSHD | ./parse-failed-login -centos.awk
SELinux / audit.log
SELinux是系统管理员的救星,但却是软件开发人员的噩梦。从设计上讲,它的消息传递是不透明的,除了日志记录,在这一点上它几乎是不透明的太有帮助的。
SELinux日志通常存储在/var/log/audit/audit.log.与受旋转影响的任何其他日志文件一样,这些日志的以前迭代也可能出现在/var/log/audit目录中。下面是这样一个文件的示例,其中包含否认旗帜被突出显示。
图11 -一个典型的SELinux audit.log文件
在这个特定的上下文中,SELinux禁止Apachehttpd从写入到特定文件的守护进程。这与禁止这样写的Linux权限不同。即使用户帐户下的Apachehttpd如果正在运行的文件对这些文件有写访问权限,SELinux将禁止写尝试。这是一种常见的良好安全实践,可以帮助防止可能已经上传到网站的恶意代码覆盖网站本身。然而,如果web应用程序的设计前提是它应该能够覆盖其目录中的文件,这可能会导致问题。
需要注意的是,如果一个web应用程序被设计为对自己的web目录有写访问权,而它正被SELinux阻止,最好的做法是“重做”应用程序,使其写入到不同的目录。修改SELinux策略可能非常危险,会使服务器面临更多的攻击向量。
SELinux通常在Linux中的许多不同上下文中管理许多不同的进程。结果就是/var/log/audit/audit.log文件可能太大和“混乱”,以分析他们只是看。正因为如此,awk可以是一个有用的工具,过滤掉的部分/var/log/audit/audit.log系统管理员不感兴趣的文件。下面的简化调用awk过滤器将给出所需的结果,在这种情况下寻找匹配的值列4美元而且10美元:
$ sudo awk’(4美元= =“否认”)& &(10美元= =“通讯= \”httpd \ "){打印$ 0}’/var/log/audit/audit.log
注意该命令是如何合并sudo(该文件由root拥有)和通讯= " httpd "条目。下面是这个调用的输出示例:
图12 -通过awk命令过滤的输出
通常情况下,有很多很多的条目符合上述标准,因为公开访问的web服务器经常受到持续的攻击。
使用Awk分析日志文件的最后想法
如前所述,awk语言非常强大,能够完成各种有用的文件分析任务。自由软件基金会目前维护着腼腆的人实用程序,以及它的官方文档。考虑到Linux及其软件通常在日志文件中提供大量信息,它是执行精确日志分析的理想免费工具。由于该语言是严格为从文本流中提取而设计的,它的程序比用更通用的语言编写的程序更简洁和更短,以完成相同类型的任务。金宝搏官网188
的awk可以将实用程序合并到无人参与的文本文件分析中,用于几乎任何结构化文本文件格式,如果有人敢的话,甚至还可以用于非结构化文本文件格式。它是系统管理员武器库中“默默无闻”、有时被忽视的工具之一,它可以使工作变得非常容易,特别是在处理不断增加的数据量时。