前言
Linux auditd 工具可以将审计记录写入日志文件。包括记录系统调用和文件访问。管理员可以检查这些日志,确定是否存在安全漏洞。本文首先介绍用户空间审计系统的结构,然后介绍主要的 audit 工具的使用方法。
Linux 用户空间审计系统简介
Linux 内核有用日志记录事件的能力,包括记录系统调用和文件访问。管理员可以检查这些日志,确定是否存在安全漏洞(如多次失败的登录尝试,或者用户对系统文件不成功的访问),这就是本文介绍的 linux 用户空间审计系统, 图 1 是 linux 用户空间审计系统示意图 。
图 1 Linux audit 架构示意图
说明:图 1 的实线代表数据流,虚线代表组件之间的控制关系。图 1 包括有两大部分:图 1 中间的是 Linux 内核中的几种系统调用(user, task, exit, exclude),图 1 右侧是一系列应用程序(auditd、audispd、auditctl、autrace、ausearch 和 aureport 等)。Linux 内核中的几种系统调用是:
User :记录用户空间中产生的事件;它的作用是过滤消息的,内核传递给审计后台进程之前先查询它。
Task:跟踪应用程序的子进程(fork);当一个任务被创建时,也就是父进程通过 fork 和克隆创建子进程时记录该事件;
Exit:当一个系统调用结束时判断是否记录该调用;
Exclude:删除不合格事件;Exclude 是用来过滤消息的,也就是不想看到的消息可以在这里写规则进行过滤。
从图 1 可以看到 audit 是内核中的一个模块,内核的运行情况都会在 audit 中记录,当然这个记录的规则是由超级用户来设置的。内核的 audit 模块是由应用层的一个应用程序 auditd 来控制的。audit 产生的数据都会传送到 auditd 中,然后再由 auditd 进行其它操作。auditd.conf 是 auditd 的配置文件,确定 auditd 是如何启动的,日志文件放在哪里等等。audit.rules 是 audit 的规则文件,确定 audit 的日志中记录哪些操作。它通过一个对 audit 进行控制的应用程序 auditctl 进行操作。root 用户也可以直接调用 auditctl 进行操作。auditd 收到的数据后会有两个去处。默认的是将日志保存在 audit.log 文件中,默认路径/var/log/audit/audit.log。另一个通过 audispd 将日志进行分发。要使用安全审计系统可采用下面的步骤:首先安装软件包。然后设置配置文件、配置常用命令,添加审计规则,然后启用 audit 守护进程并开始进行日志记录,最后通过生成审计报表和搜索日志来周期性地分析数据。
Linux 用户空间审计系统由 auditd、audispd、auditctl、autrace、ausearch 和 aureport 等应用程序组成。下面依次说明:
auditctl : 即时控制审计守护进程的行为的工具,如添加规则等。
auditd :audit 守护进程负责把内核产生的信息写入到硬盘上,这些信息由应用程序和系统活动触发产生。用户空间审计系统通过 auditd 后台进程接收内核审计系统传送来的审计信息,将信息写入到 /var/log/audit/audit.log。
aureport : 查看和生成审计报告的工具。
ausearch : 查找审计事件的工具
auditspd : 转发事件通知给其他应用程序,而不是写入到审计日志文件中。
autrace : 一个用于跟踪进程的命令。类似于 strace,跟踪某一个进程,并将跟踪的结果写入日志文件之中。
audit 和 syslog 日志系统的关系
audit 主要用来记录安全信息,用于对系统安全事件的追溯;而 syslog 日志系统用来记录系统中的各种信息,如硬件警报和软件日志等。但是 syslog 属于应用层,没办法记录太多信息。audit 来记录内核信息,包括文件的读写,权限的改变等。
安装 audit 软件包并且配置审计守护进程
使用 yum 工具安装软件包
清单 1.安装软件包
1 |
#yum install audit*.* -y |
用户也可以从源码安装,源码下载地址:http://people.redhat.com/sgrubb/audit/
了解 audit 配置文件
audit 配置文件简介
audit 安装后会生成 2 个配置文件: /etc/audit/auditd.conf 和/etc/audit/audit.rules 。/etc/audit/auditd.conf 是守护程序的默认配置文件。/etc/audit/audit.rules 是记录审计规则的文件。首次安装 audit 后, 审计规则文件是空的。
理解/etc/audit/audit.conf 文件
/etc/audit/auditd.conf 守护程序的默认配置文件是 Linux 安全审计系统最关键文件。/etc/audit/auditd.conf 文件包括如下几个部分:一般先设置 auditd 的日志文件,然后设置是否循环使用日志文件,配置日志文件大小和报警信息,设置审计规则信息
和目录观察器。下面简单设置一个 /etc/audit/auditd.conf
清单 2. /etc/audit/auditd.conf 配置例子
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
#vi /etc/audit/auditd.conf #第 5 行设置日志文件 log_file = /var/log/audit/audit.log #第 11 行设置日志文件轮询的数目,它是 0~99 之间的数。如果设置为小于 2,则不会循环日志。如果没有设置 num_logs 值,它就默认为 0,意味着从来不循环日志文件 num_logs = 5 #第 14 行设置日志文件是否使用主机名称,一般选 NONE name_format = NONE #第五行设置日志文件大小,以兆字节表示的最大日志文件容量。当达到这个容量时,会执行 max_log_file _action 指定的动作 max_log_file = 6 #第 17 行设置日志文件到达最大值后的动作,这里选择 ROTATE(轮询) max_log_file_action = ROTATE |
清单 2 是笔者在 CentOS 7 下的配置,其他参数可以选择缺省值。
auditctl 命令简介
auditctl 命令是 Linux 用户空间审计系统的最主要的部分,命令格式:
1 |
auditctl [选项] filter,action -S syscall -F condition -k label |
主要参数说明见表 1
表 1. auditctl 命令选项
项目 | 可选参数 | 説明 |
filter | user,exit,task,exclude |
filter 详细说明哪个内核规则匹配过滤器应用在事件中。以下是其中之一的与规则匹配的过 滤器:task、exit、user 以及 exclude |
action | always, never | 是否审核事件(always 表示是)(never 表示否) |
syscall | all, 2, open 等 | 所有的系统调用都可以在/usr/include/asm/unistd_64.h 文件中找到。许多系统调用都能形成一个规则 |
condition | euid=0, arch=b64 | 详细说明其他选项,进一步修改规则来与以特定架构、组 ID、进程 ID 和其他内容为基础的事件相匹配 |
label | 任意文字 | 标记审核事件并检索日志 |
-S 表示系统调用号或名字
-F 表示规则域。
-k 表示设置审计规则上的过滤关键
了解 audit 审计规则
audit 审计规则分成三个部分:
控制规则:这些规则用于更改审计系统本身的配置和设置。
文件系统规则:这些是文件或目录监视。使用这些规则,我们可以审核对特定文件或目录的任何类型的访问。
系统调用规则:这些规则用于监视由任何进程或特定用户进行的系统调用。
控制规则
控制规则可以在/etc/audit/audit.rules 中设置。主要包括:
-D #删除所有当前装载的审核规则#
-b 8192 #在内核中设定最大数量的已存在的审核缓冲区为 8Mb#
-e 2 #锁定审核配置#
文件系统规则
可以通过 auditctl 命令设置。监控文件系统行为(依靠文件、目录的权限属性来识别)
规则格式:
-w 路径
-p 权限
-k 关键字
其中-p 权限的动作分为四种
r — 读取文件或者目录。
w — 写入文件或者目录。
x — 运行文件或者目录。
a — 改变在文件或者目录中的属性。
例如要监控/etc/passwd 文件的修改行为,可以使用这个命令:#auditctl -w /etc/passwd -p wa
也可以自己将上述内容加入到文件/etc/audit/rules.d/audit.rules 中即可实现对该文件的监视。
清单 3 例子的审核规则记录了每次读取或者修改/etc/hosts 文件的尝试:
清单 3. 审核规则记录了每次读取或者修改/etc/hosts 文件的尝试
1 |
#auditctl -w /etc/hosts -p wa -k hosts_change |
系统调用规则
监控系统调用可能会引起高负荷的日志活动,这会让内核承受更大的负荷。所以要慎重衡量哪些系统调用需要放到 audit.rules 中。如果审计的是目录的话,只能对该目录本身的属性进行审计。如果想审计下面的文件,需要一一列出。
系统调用的监控:
-a 添加一条系统调用监控规则
-S 显示需要监测的系统调用的名称
显示规则和删除规则:
-D 删除所有规则
-d 删除一条规则和-a 对应
-w 写入文件或者目录。
-W 删除一条规则和-w 对应
-l 列出所有规则
清单 4 的命令用来定义特定用户(这里假设是 UID 为 10001)访问日志,规则是 userfile:
清单 4 定义记录有哪些文件,特定用户(UID 为 10001)访问和标签的日志条目的规则
1 |
# auditctl -a always,exit -F arch=b64 -F auid=10001 -S open -k userfile |
说明:userfile 是用户自己设置的一个规则名字,以上的都设置完毕了,就可以生成各种报告了。另外通过 auditctl 命令添加的规则不是永久有效的。为了让他们在重新启动后有效的,可以将其添加到文件/etc/audit/rules.d/audit.rules 中。
启动 auditd 守护进程
可以使用如下命令启动服务进程:
#service auditd start
要使它自动在运行时启动,则应作为根用户执行命令:
#systemctl enable auditd
要停止它,可使用 service auditd stop 命令,重启 auditd, 可使用 service auditd restart 命令,service auditd reload 或者 service auditd force-reload 命令用来重新加载 auditd 在/etc/audit/auditd.conf 文件中的配置。service auditd rotate 命令在/var/log/audit/目录中旋转日志文件。service auditd resume 命令在推迟审核事件日志之后重新开始,例如存在没有足够的磁盘分区空间来保存审核日志文件情况。service auditd status 命令显示运行状态。要验证规则,应以根用户身份执行 auditctl -1 命令列出所有活动的规则和观察器。
配置 auditd 的日志文件到远程主机
假设 audit 服务器名称是 cyq1 ,ip 地址 192.168.0.1 ;audit 客户端名称是 cyq2 ,ip 地址 192.168.0.2 。
首先修改服务器端配置文件:
清单 5 修改服务器端配置文件
1 2 3 4 5 |
vi /etc/audit/auditd.conf #修改第 25 行设置监听端口为 60 tcp_listen_port =60 然后重启服务 #service auditd restart |
然后在客户端安装相关软件包并且配置文件
清单 6 客户端安装相关软件包并且配置文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
#yum -y install audispd-plugins 修改配置文件 #vi /etc/audisp/plugins.d/au-remote.conf # 修改第 6 行,把审核日志发送到日志服务器 active =yes #vi /etc/audisp/audisp-remote.conf #修改第 6 行 remote_server =cyq1 #修改第 7 行设置监听端口为 60 port = 60 #vi /etc/audit/auditd.conf #修改第 6 行 log_format =NOLOG 然后重启服务 #service auditd restart |
使用 aureport 命令生成审计消息的报表
要生成审计消息的报表,可使用 aureport 命令。如果执行 aureport 时没有使用任何选项,则会显示如汇总报表。下面是几个例子:
清单 7 生成一段特定时间内的报告
1 |
# aureport -ts 8:00-te 17:30 -f –i |
清单 8 生成所有用户失败事件的总结报告:
1 |
# aureport -u --failed --summary –i |
清单 9 生成系统调用事件报告# aureport -s -i --summary
1 |
使用 ausearch 命令使用搜索记录功能 |
audit 系统附带了一个功能强大的工具,称为 ausearch 搜索审计日志。使用 ausearch ,您可以过滤和搜索事件类型。它还可以通过将数值转换为更加直观的值(如系统调用或用户名)来解释事件。以根用户身份执行 ausearch 命令,当显示结果时,每个记录用 4 条虚线组成的一行隔开,每个记录前均显示时间标记。图 2 是 ausearch –f /etc/group 中的结果 。
图 2 ausearch –f /etc/group 中的结果
这里简单介绍一下图 2 的输出结果。
time : 审计时间。
name : 审计对象
cwd : 当前路径
syscall : 相关的系统调用
auid : 审计用户 ID
uid 和 gid : 访问文件的用户 ID 和用户组 ID
comm : 用户访问文件的命令
exe : 上面命令的可执行文件路径
下面是几个例子:
清单 10 搜索系统登录失败,使用如下命令:
1 |
# ausearch --messag e USER _LO G IN --success no --i nterpret |
清单 11 搜索所有的账户,群组,角色变更,使用以下命令:
1 |
# ausearch -m ADD _USER -m DEL_USER -m ADD _GROUP -m USER _CHAUT HTOK -m D EL_GROUP -m CHGRP_ID -m ROLE_ASSIGN -m ROLE_REMOVE -i |
清单 12 搜寻从制定时间段的失败的系统调用,使用以下命令:
1 |
# ausearch --start 02/07/2017 --end 02/21/2017 no w -m SYSCALL -sv no –i |
使用关键字( key)搜索审计事件记录
auditd 生成的日志文件内容非常多,如果没有设置关键字,要查找搜索审计事件记录,比较麻烦。使用关键字( key) 可以提高效率:
首先使用 auditctl 命令建立一个规则:
清单 13 使用 auditctl 命令建立一个规则
1 |
# auditctl -w /etc/passwd -p rwa -k passwd_changes |
上面这个规则的意思是记录访问或修改 / etc / passwd 用户帐户数据库的任何尝试。一旦有人修改了数据库文件,可以使用如下关键字( key)搜索审计事件记录
清单 14 使用关键字( key)搜索审计事件记录
1 |
# ausearch -k passwd_changes | less |
上面的命令显示访问或修改 / etc / passwd 文件的日志信息,其他信息忽略。
使用图形化工具 seaudit
seaudit 是 SElinux 故障诊断工具包(setools-gui)的组件。seaudit 允许用户查看和过滤日志文件的内容。它支持 syslog 和 auditd 两种日志格式,并提供查询以检查基于 SELinux 的策略日志消息。打开 seaudit 工具可以看到审计信息。从"工具"菜单中选择"监控日志",或单击"切换"监视器按钮打开和关闭实时日志监视功能。当此功能开启时,seaudit 会定期检查新消息间隔,默认为每秒。还可以配置间隔首选项对话框。如图 3 。
图 3 配置视图
使用 seaudit 工具可以生成报表方法是从 tools 菜单选择"Creat Report",在"Input"选项你可以选择输出所有 audit 的日志文件或者当前的视图文件。在"Output"选项你可以选择输出 HTML 或者 txt 格式两种报告格式。然后点击"create Report"按钮保存报表文件即可。用户可以使用浏览器查看生成的报表文件查看日志文件见图 4。
图 4 使用浏览器查看生成的报表文件
说明:使用 seaudit 工具建立 HTML 格式的报表的话先要下载两个格式文件 seaudit-report.conf 和 seaudit-report.css 到/usr/sharre/setools-3.3/目录下,下载网站是https://github.com/TresysTechnology/setools3/tree/master/seaudit 。
总结
Linux 提供了用来记录系统安全信息的审计系统,使用 Audit 系统您可以在应用程序执行期间获取以下信息。发生错误的时间、哪个文件导致错误、原因是什么?、什么进程导致了错误等等。如果你能熟练掌握它,我认为这是非常有用的系统管理和安全管理工具。