linux监控文件操作行为

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>

可能有几个原因:

  1. 尚未发生任何匹配的事件 如果您刚刚设置了审计规则,而且 /etc/pam.d/common-auth 或 /etc/lightdm/lightdm-autologin 文件尚未发生任何被监控的更改(如写入或属性更改),那么审计日志中自然不会有匹配的记录。

  2. 审计规则未正确加载或应用 可能是由于审计规则没有被正确添加到 /etc/audit/audit.rules 或 /etc/audit/rules.d/ 目录下的文件中,或者添加后没有重启 auditd 服务来应用新规则。请确保按照以下步骤操作:

将监控规则正确添加到配置文件中。 使用命令 sudo systemctl restart auditd 重启 auditd 服务。 3. 错误的关键词 请确认在使用 ausearch 命令时输入的关键词与您添加到审计规则中的关键词完全一致。在你提供的命令中,第二个命令末尾出现了拼写错误(autologin-changecno matches> 应为 autologin-change)。请确保使用正确的关键词执行搜索。

  1. 审计日志被旋转或清理 如果系统的审计日志被旋转(即新的日志文件被创建,旧的日志文件被移动、压缩或删除)或者手动清理,可能会导致之前的记录丢失。可以检查 /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 的基本步骤:

  1. 初始化 fanotify: 通过调用 fanotify_init 函数来初始化一个 fanotify 实例。这个调用会返回一个文件描述符,用于后续的所有 fanotify 操作。

  2. 标记(Mark)监控的文件或目录: 使用 fanotify_mark 函数来指定你想要监控的文件系统对象(如整个挂载点或特定路径)。你可以指定对哪些事件感兴趣,比如文件被访问(FAN_ACCESS)、文件被修改(FAN_MODIFY)等。

  3. 读取事件: 使用 read 系统调用来读取 fanotify 文件描述符,获取发生的事件。每个事件都会以 fanotify_event_metadata 结构返回,从中你可以获取到事件的详细信息,包括被操作文件的路径。

  4. 处理事件: 根据读取到的事件信息进行相应的处理。例如,你可以记录下哪些进程访问了监控的文件。

  5. 关闭 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 并自行编写程序。

相关推荐
宁zz6 小时前
乌班图安装jenkins
运维·jenkins
大丈夫立于天地间6 小时前
ISIS协议中的数据库同步
运维·网络·信息与通信
cg50176 小时前
Spring Boot 的配置文件
java·linux·spring boot
暮云星影6 小时前
三、FFmpeg学习笔记
linux·ffmpeg
rainFFrain7 小时前
单例模式与线程安全
linux·运维·服务器·vscode·单例模式
GalaxyPokemon7 小时前
Muduo网络库实现 [九] - EventLoopThread模块
linux·服务器·c++
mingqian_chu7 小时前
ubuntu中使用安卓模拟器
android·linux·ubuntu
@郭小茶8 小时前
docker-compose方式部署docker项目
运维·docker·容器
GalaxyPokemon8 小时前
Muduo网络库实现 [十] - EventLoopThreadPool模块
linux·服务器·网络·c++