0
点赞
收藏
分享

微信扫一扫

AcWing 800. 数组元素的目标和——算法基础课题解

linux监控文件操作行为

使用 auditd 系统

auditd 是Linux系统的一个安全和审计系统,它能够跟踪系统上发生的安全相关事件。要使用 auditd 来监控文件,你需要首先确保 auditd 已经安装并且运行在你的系统上。

然后,你可以使用 auditctl 命令来添加监控规则:

sudo auditctl -w /path/to/your/file -p warx -k your-key
#-w 指定要监控的文件路径。
#-p 设置权限过滤,warx 分别代表写入(w)、属性更改(a)、读取(r)和执行(x)。
#-k 设置一个关键词,以便于后续通过这个关键词来搜索和过滤审计日志。

之后,你可以通过 ausearch 或 aureport 命令来查询和报告这个文件的审计日志:

sudo ausearch -k your-key 

操作步骤

安装启动

首先,确保你的系统上已经安装了 auditd。可以通过运行以下命令来检查 auditd 服务的状态:

sudo systemctl status auditd

如果服务未运行,使用以下命令启动并设置为开机启动:

sudo systemctl start auditd
sudo systemctl enable auditd
配置监控规则

编辑 /etc/audit/rules.d/audit.rules 文件(或者如果这个文件不存在,可能需要编辑 /etc/audit/audit.rules),然后添加以下行:

-w /etc/pam.d/common-A -p wa -k auth-change
-w /etc/lightdm/lightdm-B -p wa -k autologin-change
应用并重启 auditd
sudo systemctl restart auditd
sudo auditctl -R /etc/audit/rules.d/audit.rules
sudo auditctl -R /etc/audit/audit.rules
检查审计日志
sudo ausearch -k auth-change
sudo ausearch -k autologin-change

命令解释

-w /etc/pam.d/common-A -p wa -k auth-change
-w /etc/lightdm/lightdm-B -p wa -k autologin-change
关键词(key)的定义

关键词(key)在这个上下文中是完全自定义的。当你使用 -k 参数在 auditd 规则中指定一个关键词时,这个关键词用于标记和识别与该规则相关的审计事件。

这意味着你可以使用任何有意义的字符串作为关键词,以便于后续在审计日志中快速过滤和查找相关事件。

在提供的例子中:

-k auth-change 中的 auth-change 是一个自定义关键词,用于标识和过滤与 /etc/pam.d/common-auth 文件更改相关的审计事件。
-k autologin-change 中的 autologin-change 是另一个自定义关键词,用于标识和过滤与 /etc/lightdm/lightdm-autologin 文件更改相关的审计事件。
选择关键词时,建议使用既简洁又能准确描述监控规则目的的字符串。

问题处理

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/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"

使用 inotifywait 命令

inotifywait 是 inotify-tools 工具集中的一个命令,它可以用来监视文件系统事件。通过使用 inotifywait,你可以监控文件或目录的变化事件。

首先需要安装 inotify-tools:

sudo apt-get install inotify-tools  # Debian/Ubuntu
sudo yum install inotify-tools      # CentOS/RHEL

然后,使用下面的命令来监控对某个文件的操作:

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 会话。

示例代码

#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;
}

选择方法

如果需要详细的审计跟踪(包括哪个用户、哪个进程),推荐使用 auditd。
如果只需要简单地监视文件或目录变化,inotifywait 是一个简单易用的选择。
对于需要高级功能和灵活性的场景,可能需要考虑使用 fanotify 并自行编写程序。

举报

相关推荐

0 条评论