[内容] auditd 使用 (监控文件或目录的变化)

内容一:auditd 的管理

1.1 启动 auditd

1.1.1 启动 auditd
# service auditd restart
1.1.2 查看 auditd 状态
# auditctl -s
1.1.3 设置 auditd 开机自启
# chkconfig auditd on
1.1.4 查看 auditd 开机自启状态
# chkconfig --list auditd

1.2 查看 auditd 的规则

# auditctl -l

1.3 删除 auditd 的规则

1.3.1 永久删除 auditd 的所有规则
1.3.1.1 清空 /etc/audit/audit.rules 文件里的所有内容
# vi /etc/audit/audit.rules

删除里面的所有内容

1.3.1.2 让刚刚的设置生效
# service auditd restart

或者:

# augenrules
1.3.2 临时删除 auditd 的规则
1.3.2.1 临时删除 auditd 的所有规则
# auditctl -D

(补充:此操作重启后失效)

1.3.2.2 临时删除 auditd 的普通规则 (以 -w 开头的规则)
# auditctl -W <policy>

(补充:此操作重启后失效)

1.3.2.3 临时删除 auditd 的使用系统调用和过滤条件的监控规则 (以 -a 开头的规则)
# auditctl -d <policy>

(补充:此操作重启后失效)

1.4 显示 auditd 日志

1.4.1 显示 auditd 的所有日志
# cat /var/log/audit/audit.log
1.4.2 显示某文件或目录的日志
# ausearch -f <file/directory>
1.4.3 显示某关键词的日志
# ausearch -k <key_name>

1.5 生成 auditd 日志报告

# aureport -k

内容二:auditd 的规则

2.1 普通监控规则

2.1.1 普通监控规则的格式
2.1.1.1 普通监控规则的格式
-w <file/directory> -p <previlege> -k <key_name>


补充:
1) 文件名或目录名,需要绝对路径
2) 监控的权限,可以是 rwxa 其中的任意 1 个或多个,r 代表读权限、w 代表写权限,x 代表执行权限,a 代表文件类型
3) 此类日志的关键词

2.1.1.2 添加普通监控规则的格式
2.1.1.2.1 临时添加普通监控规则的格式
# auditctl -w <file/directory> -p <previlege> -k <key_name>
2.1.1.2.2 永久添加普通监控规则的格式
# vim /etc/audit/audit.rules

添加以下内容:

......
-w <file/directory> -p <previlege> -k <key_name>


注意:永久添加的规则后要重启 auditd 服务后才会生效

# service auditd restart

或者:

# augenrules

2.1.2 添加普通监控规则的案例
2.1.2.1 案例一:添加监控 /etc/nginx/nginx.conf 文件的读、写、执行和文件属性变化的规则
# auditctl -w /etc/nginx/nginx.conf

(补充:这里以临时添加监控 /etc/nginx/nginx.conf 文件的读、写、执行和文件属性变化的规则为例)

2.1.2.2 案例二:添加监控 /etc/nginx/nginx.conf 文件的读、写、执行和文件属性变化,并设置关键词为 nginx 的规则
# auditctl -w /etc/nginx/nginx.conf -p rwxa -k 'nginx'

(补充:这里以临时添加监控 /etc/nginx/nginx.conf 文件的读、写、执行和文件属性变化,并设置关键词为 nginx 的规则为例)

2.2 使用系统调用和过滤条件的监控规则

2.2.1 使用系统调用和过滤条件的监控规则的格式
2.2.1.1 使用系统调用和过滤条件的监控规则的格式
-a <action>,<filter> -S <system_call> -F <field>=<value> -k <key_name>


补充:
1) 和 用于确定事件被记录, 的值可以是 always 或者 never, 的值可以是 task、exit、user 或者 exclude
2) 是系统调用,Linux 系统调用的名称在 /usr/include/asm/unistd_64.h 文件中,可以将多个系统调用放在一个规则里,例:-S <system_call> -S <system_call> ……,或者 -S <system_call>,<system_call>……
3) 和 是过略条件,可以将多个过略条件放在一个规则里,-F <field>=<value> -F <field>=<value> ……
4) 是此类日志的关键词

2.2.1.2 添加使用系统调用和过滤条件的监控规则的格式
2.2.1.2.1 临时添加使用系统调用和过滤条件的监控规则的格式
# auditctl -a <action>,<filter> -S <system_call> -F <field>=<value> -k <key_name>
2.2.1.2.2 永久添加使用系统调用和过滤条件的监控规则的格式
# vim /etc/audit/audit.rules

添加以下内容:

......
-a <action>,<filter> -S <system_call> -F <field>=<value> -k <key_name>


注意:永久添加的规则后要重启 auditd 服务后才会生效

# service auditd restart

或者:

# augenrules

2.2.2 使用系统调用和过滤条件的监控规则的案例
2.2.2.1 案例一:监控所有 UID 大于 1000 的用户的删除操作,并设置关键词为 delete
# auditctl -a always,exit -S rmdir -S unlink -S unlinkat -S rename -S renameat -F auid>=1000 -F auid!=unset -F auid!=4294967295 -k delete

(补充:这里以临时监控所有 UID 大于 1000 的用户删除操作为例)

(注意:这里的 -F auid!=4294967295 是为了排除 login UID 没有被设置的用户)

2.2.2.2 案例二:监控所有 UID 大于 1000 的用户的文件删除操作,并设置关键词为 delete
# auditctl -a always,exit -S unlink -S unlinkat -S rename -S renameat -F auid>=1000 -F auid!=unset -F auid!=4294967295 -k delete

(补充:这里以临时监控所有 UID 大于 1000 的用户删除操作为例)

(注意:这里的 -F auid!=4294967295 是为了排除 login UID 没有被设置的用户)

2.2.2.3 案例三:监控所有网络连接
# auditctl -a always,exit -F arch=b64 -S socket
# auditctl -a always,exit -F arch=b64 -S connect
# auditctl -a always,exit -F arch=b64 -S sendmmsg
# auditctl -a always,exit -F arch=b64 -S sendmsg
# auditctl -a always,exit -F arch=b64 -S bind
# auditctl -a always,exit -F arch=b64 -S recvmsg
# auditctl -a always,exit -F arch=b64 -S close

(补充:这里以监控所有网络连接为例)

[排错] 解决 Linux 运行时报错 “watchdog: Bug: soft lockup – CPU……” (CPU 软锁)

报错代码

watchdog: Bug: soft lockup - CPU......

分析

当 CPU 的负载过高时,一个 CPU 在运行某一个进程时,在内核模式下超过 20 秒没有回应,则看门狗程序会将系统所有 CPU 软锁住,然后会让这些 CPU 显示各自正在运行的进程堆栈跟踪

缓解方法

方法一:通过 /proc/sys/kernel/watchdog_thresh 文件延长看门狗软锁 CPU 的时间

# echo 20 > /proc/sys/kernel/watchdog_thresh

(补充:这里以将看门狗的值延长到 20 为例,也可以根据自己的需求延长更多,默认值为 10)

方法二:通过新建文件延长看门狗软所 CPU 的时间

2.1 通过新建文件延长看门狗软所 CPU 的时间

# echo "kernel.watchdog_thresh = 20" >> /etc/sysctl.conf

(补充:这里以将看门狗的值延长到 20 为例,也可以根据自己的需求延长更多,默认值为 10)

2.2 让新建文件立刻生效

# sysctl -p /etc/sysctl.conf

深究方法

开启 Kdump,等此报错再次发生时分析 Kdump 在内核崩溃时搜集信息 vmcore