开源 使用awk分析日志文件

使用awk分析日志文件

每个Linux系统管理员都知道日志文件是生活中的一个事实。每次出现问题时,日志文件都是诊断几乎所有可能的问题的第一个地方。玩笑归玩笑,有时候他们甚至可以提供一个解决方案。系统管理员也知道,筛选日志文件可能很乏味。一行又一行地查看通常会导致到处都是“相同的东西”,而完全错过错误消息,特别是当人们不确定要从哪里开始搜索时。

Linux提供了许多日志分析工具,包括开源的和商业许可的,用于分析日志文件。本教程将介绍非常强大的使用方法awk实用程序从各种日志文件中“提取”错误消息,以便更容易地找到问题发生的位置(和时间)。特别是对于Linux,awk是通过自由的GNU实用程序实现的腼腆的人,任何一个命令都可以用于调用awk

来描述awk仅仅作为一个实用程序,它将文件或流的文本内容转换为可以定位的内容awk这是一个巨大的麻烦,但是这个功能与日志文件的单调统一结构相结合,使它成为一个非常实用的工具,可以非常快速地搜索日志文件。

为此,我们将研究如何与awk在本系统管理教程中分析日志文件。

读:面向开发人员的项目管理软件和工具

如何映射日志文件

熟悉逗号分隔值(CSV)文件或制表符分隔文件的人都知道这些文件具有以下基本结构:

  • 文件中的每一行都是一条记录
  • 在每一行中,用逗号或制表符分隔单独的“列”
  • 与数据库不同,“列”的数据格式不能保证一致

回到我们的教程,Python中的文本抓取,这看起来有点像下面:

Awk文件分析

图1 -带有假社会安全号码的CSV文件示例

Awk文件分析

图2 -同样的数据,在Microsoft Excel中检查

在这两个图中,明显的“坐标网格”跳出来了。只需使用上述网格,就可以很容易地提取出特定的信息。例如,值4235住在行5列D上面的文件。

毫无疑问,有些读者会说:“只有当数据的结构像这个理想化的例子一样一致时,这种方法才能很好地工作!”但最棒的是awk是,这不是一个要求.使用时唯一重要的是awk对于日志文件分析来说,被匹配的每一行都有一个统一的结构,对于Linux系统中的大多数日志文件来说,这是最肯定的情况。

这个特性可以在下面的图中看到一个例子/var/log/auth.logUbuntu 22.04.1 LTS服务器上的文件:

awk教程

图3 -一个示例日志文件,显示了每行之间的统一结构。

如果日志文件的每一行都是一条记录,并且使用空格作为分隔符,则可以对日志文件的每一行的每个单词使用以下数字标识符:

awk文件分析教程

图4 -一行中每个单词的数字标识符

日志文件的每一行都以相同的信息开始:

  • 专栏1:月缩写
  • 第二列:本月几号
  • 第三列:24小时格式的活动时间
  • 第四列:主机名
  • 列5:进程名和PID

注意,并不是每个日志文件都是这样的;不同应用程序的格式可能有很大差异。

因此,在检查上图时,最简单的方法失败了ssh该主机的登录将查找其中的日志行/var/log/auth.log,其中有文本失败的列6而且密码列7.数字列以美元符号(),0美元表示当前正在处理的整行。使用awk命令如下:

awk美元”(6美元= =“失败”)& &(7美元= =“密码”){打印$ 0}’/var/log/auth.log

注意:根据权限配置,上面的命令可能需要加上前缀sudo

输出如下:

使用awk进行文件分析

图5 -仅包含ssh登录尝试失败的日志条目

作为awk也是一种脚本语言,它的语法对于精通编码的系统管理员来说很熟悉,这并不奇怪。例如,上面的命令可以这样实现,如果你更喜欢“编码”风格的外观:

美元awk的{如果(($ 6 = =“失败”)& &(7美元= = "密码")){打印$ 0}}“/var/log/auth.log

awk \{\如果美元($ 6 = =“失败”)& &(7美元= = "密码 ") ) \ { \ 打印0美元  \ } \ }' / var / log / auth.log

在上面的两个命令行中,额外的括号和圆括号被加粗。两者都会给出相同的输出:

Awk日志分析

图6 -混合和匹配awk输入

根据需要,文本匹配逻辑可以很简单,也可以很复杂,如下所示。

读:远程开发人员的最佳工具

如何进行扩展匹配

当然,无效的登录方式ssh难道不是将登录失败列为的唯一方法吗/var/log/auth.log文件。考虑同一文件中的以下片段:

awk日志文件分析

图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的默认路径中。这就是为什么必须在当前目录下为脚本加上前缀./当运行它时。

该脚本的输出如下所示:

使用awk分析日志文件

图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)

这种管道被称为进程替换.进程替换允许以与文件相同的方式使用命令输出。

注意,小于号和圆括号之间的间距很重要。如果括号的间距和排列不正确,该命令将不起作用。

该命令的输出如下:

使用awk记录文件

图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目录中。下面是这样一个文件的示例,其中包含否认旗帜被突出显示。

如何使用awk

图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 "条目。下面是这个调用的输出示例:

Awk用于系统管理

图12 -通过awk命令过滤的输出

通常情况下,有很多很多的条目符合上述标准,因为公开访问的web服务器经常受到持续的攻击。

使用Awk分析日志文件的最后想法

如前所述,awk语言非常强大,能够完成各种有用的文件分析任务。自由软件基金会目前维护着腼腆的人实用程序,以及它的官方文档。考虑到Linux及其软件通常在日志文件中提供大量信息,它是执行精确日志分析的理想免费工具。由于该语言是严格为从文本流中提取而设计的,它的程序比用更通用的语言编写的程序更简洁和更短,以完成相同类型的任务。金宝搏官网188

awk可以将实用程序合并到无人参与的文本文件分析中,用于几乎任何结构化文本文件格式,如果有人敢的话,甚至还可以用于非结构化文本文件格式。它是系统管理员武器库中“默默无闻”、有时被忽视的工具之一,它可以使工作变得非常容易,特别是在处理不断增加的数据量时。

读:开发人员的最佳生产力工具

最新的文章

有关的故事

Baidu
map