Linux 审计文件以查看谁对文件进行了更改
这是许多新系统管理员问的关键问题之一:
如何审计文件事件(如读/写等)?如何使用审计查看谁在 Linux 中更改了文件?
答案是使用 2.6 内核的审计系统。现代 Linux 内核 (2.6.x) 附带 auditd 守护进程。它负责将审计记录写入磁盘。在启动期间,此守护进程会读取 /etc/audit.rules 中的规则。您可以打开 /etc/audit.rules 文件并进行更改,例如设置审计文件日志位置和其他选项。默认文件足以开始使用 auditd。
为了使用审计功能,您需要使用以下实用程序
=> auditctl – 一个帮助控制内核审计系统的命令。您可以获取状态,并在内核审计系统中添加或删除规则。使用以下命令设置文件监视:
=> ausearch – 可以根据不同的搜索条件查询审计守护进程日志中的事件的命令。
=> aureport – 生成审计系统日志摘要报告的工具。
请注意,以下所有说明均在 CentOS 4.x、Fedora Core 和 RHEL 4/5 Linux 上测试。
任务:安装审计包
审计包包含用户空间实用程序,用于存储和搜索 Linux 2.6 内核中审计子系统生成的审计记录。CentOS/Red Hat 和 Fedora 核心包含审计 rpm 包。使用 yum 或 up2date 命令安装包
# yum install audit
或
# up2date install audit
启动时自动启动 auditd 服务
# ntsysv
或
# chkconfig auditd on
现在启动服务:
# /etc/init.d/auditd start
如何设置文件监视以进行审计?
假设你想审计 /etc/passwd 文件。你需要输入以下命令:
# auditctl -w /etc/passwd -p war -k password-file
在哪里,
- -w /etc/passwd:在给定路径中插入对文件系统对象的监视,即监视名为 /etc/passwd 的文件
- -p war:设置文件系统监视的权限过滤器。可以是 r 表示读取、w 表示写入、x 表示执行、a 表示附加。
- -k password-file:在 /etc/passwd 文件(监视)上设置过滤键。password-file 是一个过滤键(文本字符串,最长可达 31 个字节)。它可以唯一地标识监视生成的审计记录。在搜索审计日志时,您需要使用 password-file 字符串或短语。
简而言之,您正在监视(读作监视)/etc/passwd 文件,其中的任何人(包括 syscall)都可以对文件执行写入、附加或读取操作。
等待一段时间或以普通用户身份运行以下命令:
$ grep 'something' /etc/passwd
$ vi /etc/passwd
以下是更多示例:
文件系统审计规则
使用任意过滤键“shadow-file”在“/etc/shadow”上添加监视,该监视会为“shadow”上的“读取、写入、执行和附加”生成记录
# auditctl -w /etc/shadow -k shadow-file -p rwxa
系统调用审计规则
下一条规则禁止对 mount 系统调用退出进行审计
# auditctl -a exit,never -S mount
文件系统审计规则
添加一个带有 NULL 过滤键的监视“tmp”,它会在“/tmp”上生成“执行”记录(适用于 Web 服务器)
# auditctl -w /tmp -p e -k webserver-watch-tmp
使用 pid 的系统调用审计规则
要查看名为 sshd (pid – 1005) 的程序发出的所有系统调用:
# auditctl -a entry,always -S all -F pid=1005
如何找出谁更改或访问了文件 /etc/passwd?
使用 ausearch 命令如下:
# ausearch -f /etc/passwd
或
# ausearch -f /etc/passwd | less
或
# ausearch -f /etc/passwd -i | less
其中,
- -f /etc/passwd:仅搜索此文件
- -i:将数字实体解释为文本。例如,uid 转换为帐户名。
输出:
---- type=PATH msg=audit(03/16/2007 14:52:59.985:55) : name=/etc/passwd flags=follow,open inode=23087346 dev=08:02 mode=file,644 ouid=root ogid=root rdev=00:00 type=CWD msg=audit(03/16/2007 14:52:59.985:55) : cwd=/webroot/home/lighttpd type=FS_INODE msg=audit(03/16/2007 14:52:59.985:55) : inode=23087346 inode_uid=root inode_gid=root inode_dev=08:02 inode_rdev=00:00 type=FS_WATCH msg=audit(03/16/2007 14:52:59.985:55) : watch_inode=23087346 watch=passwd filterkey=password-file perm=read,write,append perm_mask=read type=SYSCALL msg=audit(03/16/2007 14:52:59.985:55) : arch=x86_64 syscall=open success=yes exit=3 a0=7fbffffcb4 a1=0 a2=2 a3=6171d0 items=1 pid=12551 auid=unknown(4294967295) uid=lighttpd gid=lighttpd euid=lighttpd suid=lighttpd fsuid=lighttpd egid=lighttpd sgid=lighttpd fsgid=lighttpd comm=grep exe=/bin/grep
让我们尝试理解输出
- audit(03/16/2007 14:52:59.985:55):审计日志时间
- uid=lighttpd gid=lighttpd:数字格式的用户 ID。通过将-i选项传递给命令,您可以将大多数数字数据转换为人类可读的格式。在我们的示例中,用户是 lighttpd,使用 grep 命令打开文件
- exe=”/bin/grep”:用于访问 /etc/passwd 文件的 grep 命令
- perm_mask=read :文件已打开以进行读取操作
因此,从日志文件中,您可以清楚地看到谁使用 grep 读取了文件或使用 vi/vim 文本编辑器对文件进行了更改。日志提供了大量其他信息。您需要阅读手册页和文档才能了解原始日志格式。
其他有用的例子
搜索带有日期和时间戳的事件。如果省略日期,则假定为今天。如果省略时间,则假定为现在。使用 24 小时制时间而不是 AM 或 PM 来指定时间。例如日期是 10/24/05。时间的示例是 18:00:00。
# ausearch -ts today -k password-file
# ausearch -ts 3/12/07 -k password-file
使用 -x 选项搜索与给定可执行文件名称匹配的事件。例如,使用 rm 命令找出谁访问了 /etc/passwd:
# ausearch -ts today -k password-file -x rm
# ausearch -ts 3/12/07 -k password-file -x rm
搜索具有给定用户名 (UID) 的事件。例如,查明用户 vivek (uid 506) 是否尝试打开 /etc/passwd:
# ausearch -ts today -k password-file -x rm -ui 506
# ausearch -k password-file -ui 506
其他审计相关岗位
进一步阅读
- 阅读手册页 –auditd、ausearch、auditctl
已更新以提高准确性。