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

相关推荐
韩楚风4 分钟前
【linux 多进程并发】linux进程状态与生命周期各阶段转换,进程状态查看分析,助力高性能优化
linux·服务器·性能优化·架构·gnu
陈苏同学7 分钟前
4. 将pycharm本地项目同步到(Linux)服务器上——深度学习·科研实践·从0到1
linux·服务器·ide·人工智能·python·深度学习·pycharm
Ambition_LAO13 分钟前
解决:进入 WSL(Windows Subsystem for Linux)以及将 PyCharm 2024 连接到 WSL
linux·pycharm
Pythonliu730 分钟前
茴香豆 + Qwen-7B-Chat-Int8
linux·运维·服务器
你疯了抱抱我31 分钟前
【RockyLinux 9.4】安装 NVIDIA 驱动,改变分辨率,避坑版本。(CentOS 系列也能用)
linux·运维·centos
追风赶月、31 分钟前
【Linux】进程地址空间(初步了解)
linux
栎栎学编程32 分钟前
Linux中环境变量
linux
挥剑决浮云 -1 小时前
Linux 之 安装软件、GCC编译器、Linux 操作系统基础
linux·服务器·c语言·c++·经验分享·笔记
小O_好好学2 小时前
CentOS 7文件系统
linux·运维·centos
哲伦贼稳妥3 小时前
一天认识一个硬件之机房地板
运维·网络·经验分享·其他