linux监控文件操作行为
使用 auditd 系统
auditd 是Linux系统的一个安全和审计系统,它能够跟踪系统上发生的安全相关事件。要使用 auditd 来监控文件,你需要首先确保 auditd 已经安装并且运行在你的系统上。
然后,你可以使用 auditctl 命令来添加监控规则:
bash
sudo auditctl -w /path/to/your/file -p warx -k your-key
#-w 指定要监控的文件路径。
#-p 设置权限过滤,warx 分别代表写入(w)、属性更改(a)、读取(r)和执行(x)。
#-k 设置一个关键词,以便于后续通过这个关键词来搜索和过滤审计日志。
之后,你可以通过 ausearch 或 aureport 命令来查询和报告这个文件的审计日志:
bash
sudo ausearch -k your-key
操作步骤
安装启动
确保 auditd 已安装并运行。
首先,确保你的系统上已经安装了 auditd。可以通过运行以下命令来检查 auditd 服务的状态:
bash
sudo systemctl status auditd
如果服务未运行,使用以下命令启动并设置为开机启动:
bash
sudo systemctl start auditd
sudo systemctl enable auditd
配置监控规则
需要添加监控规则来跟踪对 /etc/pam.d/common-A 和 /etc/lightdm/lightdm-B 文件的更改。由于系统重启后之前使用 auditctl 命令添加的规则不会保留,因此你需要将这些规则添加到配置文件中。
编辑 /etc/audit/rules.d/audit.rules 文件(或者如果这个文件不存在,可能需要编辑 /etc/audit/audit.rules),然后添加以下行:
bash
-w /etc/pam.d/common-A -p wa -k auth-change
-w /etc/lightdm/lightdm-B -p wa -k autologin-change
-w 指定要监控的文件路径,-p wa 指定监控写入(w)和属性(a)更改,-k 后面跟随的是一个自定义的关键字,用于之后过滤和搜索审计日志。
应用并重启 auditd
修改配置文件后,重启 auditd 服务以应用新的监控规则:
bash
sudo systemctl restart auditd
不想重启服务,可以使用 auditctl 工具加载新规则
bash
sudo auditctl -R /etc/audit/rules.d/audit.rules
编辑的是 /etc/audit/audit.rules 文件
bash
sudo auditctl -R /etc/audit/audit.rules
检查审计日志
在系统重启并且文件可能发生变化后,使用以下命令来检查相关的审计日志:
bash
sudo ausearch -k auth-change
sudo ausearch -k autologin-change
命令解释
bash
-w /etc/pam.d/common-A -p wa -k auth-change
-w /etc/lightdm/lightdm-B -p wa -k autologin-change
第一行:监控 /etc/pam.d/common-A 文件的更改 -w /etc/pam.d/common-A:这部分指定了要监控的文件路径,即 /etc/pam.d/common-A。-w 参数用于指定监控哪个文件或目录。
-p wa:这部分指定了要监控的操作类型。-p 参数后面跟着的是一系列标志,代表不同类型的操作:
w 代表写入操作,即当文件被修改时。 a 代表属性更改,即当文件的元数据(如权限、所有权等)被修改时。 -k auth-change:这部分为当前的监控规则指定了一个关键词(key),即 auth-change。在审计日志中,可以通过这个关键词来过滤和搜索与此规则相关的事件。
第二行:监控 /etc/lightdm/lightdm-B 文件的更改 -w /etc/lightdm/lightdm-B:指定了另一个要监控的文件路径,即 /etc/lightdm/lightdm-B。同样使用 -w 参数。
-p wa:与第一行相同,指定了要监控的操作类型为写入和属性更改。
-k autologin-change:为这个监控规则指定了一个不同的关键词,即 autologin-change。这允许你在审计日志中区分由于不同规则触发的事件。
总结 通过添加这些规则到 auditd 的配置中,系统会监控 /etc/pam.d/common-A 和 /etc/lightdm/lightdm-B 这两个文件的写入和属性更改操作。任何对这些文件进行的修改都会被记录下来,并且可以通过指定的关键词来检索相关的审计日志记录。这对于跟踪系统配置更改、增强安全性和排查问题非常有用。
关键词(key)的定义
关键词(key)在这个上下文中是完全自定义的。当你使用 -k 参数在 auditd 规则中指定一个关键词时,这个关键词用于标记和识别与该规则相关的审计事件。
这意味着你可以使用任何有意义的字符串作为关键词,以便于后续在审计日志中快速过滤和查找相关事件。
在提供的例子中:
-k auth-change 中的 auth-change 是一个自定义关键词,用于标识和过滤与 /etc/pam.d/common-auth 文件更改相关的审计事件。 -k autologin-change 中的 autologin-change 是另一个自定义关键词,用于标识和过滤与 /etc/lightdm/lightdm-autologin 文件更改相关的审计事件。 选择关键词时,建议使用既简洁又能准确描述监控规则目的的字符串。
问题处理
bash
root@greatwall-pc:/home/greatwall# sudo ausearch -k auth-change
<no matches>
root@greatwall-pc:/home/greatwall# sudo ausearch -k autologin-changec
<no matches>
可能有几个原因:
尚未发生任何匹配的事件 如果您刚刚设置了审计规则,而且 /etc/pam.d/common-auth 或 /etc/lightdm/lightdm-autologin 文件尚未发生任何被监控的更改(如写入或属性更改),那么审计日志中自然不会有匹配的记录。
审计规则未正确加载或应用 可能是由于审计规则没有被正确添加到 /etc/audit/audit.rules 或 /etc/audit/rules.d/ 目录下的文件中,或者添加后没有重启 auditd 服务来应用新规则。请确保按照以下步骤操作:
将监控规则正确添加到配置文件中。 使用命令 sudo systemctl restart auditd 重启 auditd 服务。 3. 错误的关键词 请确认在使用 ausearch 命令时输入的关键词与您添加到审计规则中的关键词完全一致。在你提供的命令中,第二个命令末尾出现了拼写错误(autologin-changecno matches> 应为 autologin-change)。请确保使用正确的关键词执行搜索。
- 审计日志被旋转或清理 如果系统的审计日志被旋转(即新的日志文件被创建,旧的日志文件被移动、压缩或删除)或者手动清理,可能会导致之前的记录丢失。可以检查 /var/log/audit/ 目录下是否有旧的审计日志文件存在。
解决步骤 确认文件是否有过更改尝试,可以手动修改一下被监控的文件,以触发审计事件。 检查并确认审计规则是否已正确加载,可以使用 sudo auditctl -l 查看当前加载的规则。 确保使用正确且一致的关键词进行搜索。 检查 /var/log/audit/ 目录下是否有相关的审计日志文件。
结果示例分析
ini
//记录了一个假设的事件,其中某个进程尝试修改 /etc/ssh/sshd_config 文件
time->Tue Apr 16 15:30:22 2024
type=PROCTITLE msg=audit(1713270622.123:495): proctitle=2F7573722F62696E2F7669202F6574632F7373682F737368645F636F6E666967
type=PATH msg=audit(1713270622.123:495): item=1 name="/etc/ssh/sshd_config" inode=1052773 dev=08:02 mode=0100600 ouid=0 ogid=0 rdev=00:00 nametype=NORMAL cap_fp=0 cap_fi=0 cap_fe=0 cap_fver=0 cap_frootid=0
type=PATH msg=audit(1713270622.123:495): item=0 name="/etc/ssh/" inode=1052672 dev=08:02 mode=040755 ouid=0 ogid=0 rdev=00:00 nametype=PARENT cap_fp=0 cap_fi=0 cap_fe=0 cap_fver=0 cap_frootid=0
type=CWD msg=audit(1713270622.123:495): cwd="/home/user"
type=SYSCALL msg=audit(1713270622.123:495): arch=c000003e syscall=257 success=yes exit=3 a0=ffffff9c a1=7ffe01b3f110 a2=241 a3=1b6 items=2 ppid=2891 pid=2892 auid=1000 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=(none) ses=4 comm="vi" exe="/usr/bin/vi" key="sshd-config-change"
时间戳
- time->Tue Apr 16 15:30:22 2024: 事件发生的时间是 2024 年 4 月 16 日,15:30:22。
进程标题 (PROCTITLE)
- proctitle=...: 这是进程标题的十六进制表示,解码后为 /usr/bin/vi /etc/ssh/sshd_config。这意味着有一个进程启动了 vi 编辑器来编辑 /etc/ssh/sshd_config 文件。
路径 (PATH)
- item=1 指向被修改的文件 /etc/ssh/sshd_config。文件的 inode、设备号、文件权限(0600 表示仅所有者有读写权限)、所有者和组 ID 都被记录下来。
- item=0 指向父目录 /etc/ssh/,并记录了该目录的相关信息。
当前工作目录 (CWD)
- cwd="/home/user": 在执行相关操作时,进程的当前工作目录是 /home/user。
系统调用 (SYSCALL) 这部分提供了系统调用的详细信息:
- syscall=257: 表示执行的系统调用编号为 257,这通常与文件操作有关(例如 openat 在某些平台上)。
- success=yes: 表示系统调用执行成功。
- exit=3: 系统调用的返回值。
- a0=..., a1=..., a2=..., a3=...: 这些是系统调用的参数。
- ppid=2891, pid=2892: 表示父进程 ID 为 2891,当前进程 ID 为 2892。
- auid=1000: 审计用户 ID(启动进程的用户)为 1000。
- uid=0, gid=0, euid=0, suid=0, fsuid=0, egid=0, sgid=0, fsgid=0: 这些字段显示进程以 root 用户(UID 和 GID 均为 0)的权限执行。
- tty=(none), ses=4: 没有使用终端(tty),会话 ID 为 4。
- comm="vi": 命令名称为 vi。
- exe="/usr/bin/vi": 执行的程序路径为 /usr/bin/vi。
- key="sshd-config-change": 这个事件被标记为 sshd-config-change,这是在设置审计规则时指定的关键词,用于过滤和识别与 SSHD 配置更改相关的审计事件。
使用 inotifywait 命令
fanotify 是 Linux 内核中用于文件系统监控的一个特性,它允许程序监听文件系统事件,如文件的打开、关闭等。与 inotify 相比,fanotify 提供了对整个文件系统或单个挂载点的监控能力,而不仅仅是单个文件或目录。这使得 fanotify 非常适合实现如病毒扫描、数据备份等需要广泛文件系统访问的应用。然而,直接使用 fanotify 进行某个特定文件或进程的监控相对复杂,因为它设计的初衷是对文件系统级别的事件进行监控。
inotifywait 是 inotify-tools 工具集中的一个命令,它可以用来监视文件系统事件。通过使用 inotifywait,你可以监控文件或目录的变化事件。
首先需要安装 inotify-tools:
bash
sudo apt-get install inotify-tools # Debian/Ubuntu
sudo yum install inotify-tools # CentOS/RHEL
然后,使用下面的命令来监控对某个文件的操作:
bash
inotifywait -m /path/to/your/file
#-m 参数表示持续监控模式。
这将会显示所有对该文件的操作事件,但注意这不会直接显示哪个进程进行了操作。
使用 fanotify
fanotify 是一个较新的Linux内核功能,用于监控文件系统事件。它类似于 inotify,但提供了一些额外的功能和更大的灵活性。使用 fanotify 需要编写特定的程序代码来利用其API。
使用 fanotify 的基本步骤
要使用 fanotify 来实现对某个文件或进程的监控,你需要编写一个 C 程序,因为 Linux 中的 fanotify 接口是通过系统调用提供给用户空间的。
以下是使用 fanotify 的基本步骤:
-
初始化 fanotify: 通过调用 fanotify_init 函数来初始化一个 fanotify 实例。这个调用会返回一个文件描述符,用于后续的所有 fanotify 操作。
-
标记(Mark)监控的文件或目录: 使用 fanotify_mark 函数来指定你想要监控的文件系统对象(如整个挂载点或特定路径)。你可以指定对哪些事件感兴趣,比如文件被访问(FAN_ACCESS)、文件被修改(FAN_MODIFY)等。
-
读取事件: 使用 read 系统调用来读取 fanotify 文件描述符,获取发生的事件。每个事件都会以 fanotify_event_metadata 结构返回,从中你可以获取到事件的详细信息,包括被操作文件的路径。
-
处理事件: 根据读取到的事件信息进行相应的处理。例如,你可以记录下哪些进程访问了监控的文件。
-
关闭 fanotify 实例: 使用完毕后,通过关闭文件描述符来结束 fanotify 会话。
示例代码
以下是一个简单的 fanotify 示例代码片段,展示了如何初始化 fanotify,并监控整个文件系统的写入操作
c
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/fanotify.h>
#include <limits.h>
#include <unistd.h>
int main(void) {
int fd;
fd = fanotify_init(FAN_CLOEXEC | FAN_CLASS_CONTENT, O_RDONLY);
if (fd < 0) {
perror("fanotify_init");
exit(EXIT_FAILURE);
}
if (fanotify_mark(fd, FAN_MARK_ADD | FAN_MARK_MOUNT,
FAN_MODIFY, AT_FDCWD, "/") < 0) {
perror("fanotify_mark");
exit(EXIT_FAILURE);
}
// 这里需要添加代码来读取和处理事件
// ...
close(fd);
return 0;
}
展示了如何设置 fanotify 来监控根目录 ("/") 下所有挂载点的修改操作。
在实际使用中,你需要根据自己的需求来调整监听的路径和事件类型,并添加逻辑来读取和处理事件数据。
选择方法
如果需要详细的审计跟踪(包括哪个用户、哪个进程),推荐使用 auditd。 如果只需要简单地监视文件或目录变化,inotifywait 是一个简单易用的选择。 对于需要高级功能和灵活性的场景,可能需要考虑使用 fanotify 并自行编写程序。