Linux Audit框架初探

本文记录Linux安全机制Audit审计框架及使用...

0x01 基本配置

1. 配置文件

1
/etc/audit/audit.rules  # 审计规则文件

2. 基本参数

1
2
3
-D        # 删除所有以前存在的规则
-b 8192 # 设置用于容纳审计消息的缓冲区数目
-f 1 # 设置当内核需要处理严重错误时要使用的故障标志。可能的值为 0(静默)、1(printk,列显故障消息)和 2(恐慌,暂停系统)

3. 启动停止

systemctl is-enabled auditd
systemctl disable auditd
systemctl stop auditd

0x02 审计监测

1. 监测审计日志及配置文件

添加审计配置文件和日志文件本身的监测项可确保您能够跟踪任何尝试篡改配置文件的操作,或检测任何尝试访问日志文件的操作

1
2
3
4
5
6
7
8
9
10
11
-w /var/log/audit/               # 设置审计日志所在目录的监测项,对任何类型访问此目录的尝试均触发事件
-w /var/log/audit/audit.log

-w /var/log/audit/audit_log.1
-w /var/log/audit/audit_log.2
-w /var/log/audit/audit_log.3
-w /var/log/audit/audit_log.4

-w /etc/audit/auditd.conf -p wa # 设置审计配置文件的监测项,记录对此文件的所有写入和属性更改尝试
-w /etc/audit/audit.rules -p wa
-w /etc/libaudit.conf -p wa

2. 审计系统调用

审计文件系统对象系统调用有助于跟踪高于应用程序级别的系统活动,发现异常系统调用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
1)审计文件系统系统调用

-a entry,always -S chmod -S fchmod -S chown -S chown32 -S fchown -S fchown32 -S lchown -S lchown32 # 对更改文件所有权和权限相关的系统调用启用审计环境

-a entry,always -S creat -S open -S truncate -S truncate64 -S ftruncate -S ftruncate64 # 对文件内容修改相关的系统调用启用审计环境

-a entry,always -S mkdir -S rmdir # 对任何目录操作(例如创建或去除目录)启用审计环境

-a entry,always -S unlink -S rename -S link -S symlink # 对任何链接操作(例如创建符号链接、创建链接、取消链接或重命名)启用审计环境

-a entry,always -S setxattr # 对扩展文件系统属性相关的任何操作启用审计环境。
-a entry,always -S lsetxattr
-a entry,always -S fsetxattr
-a entry,always -S removexattr
-a entry,always -S lremovexattr
-a entry,always -S fremovexattr

-a entry,always -S mknod # 对用于创建特殊(设备)文件的 mknod 系统调用启用审计环境

-a entry,always -S mount -S umount -S umount2 # 对任何装入或卸载操作启用审计环境: 对于 x86 体系结构,请禁用 umount 规则; 对于 Intel 64 体系结构,请禁用 umount2 规则

2)审计其他系统调用

-a entry,always -S clone -S fork -S vfork # 跟踪任务创建

-a entry,always -S umask # 审计umask系统调用以跟踪进程是如何修改创建掩码

-a entry,always -S adjtimex -S settimeofday # 跟踪尝试更改系统时间的操作:使用adjtimex来调整时间,settimeofday会设置绝对时间

3. 审计安全配置文件

跟踪系统配置的更改(内核、服务、时间等)有助于发现他人尝试操纵您系统的基础功能的任何行为,适用于与安全身份验证和通讯相关的任何其他配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
1)定时任务监测

-w /var/spool/atspool # at配置监测
-w /etc/at.allow
-w /etc/at.deny

-w /etc/cron.allow -p wa # cron配置监测
-w /etc/cron.deny -p wa
-w /etc/cron.d/ -p wa
-w /etc/cron.daily/ -p wa
-w /etc/cron.hourly/ -p wa
-w /etc/cron.monthly/ -p wa
-w /etc/cron.weekly/ -p wa
-w /etc/crontab -p wa
-w /var/spool/cron/root

2)用户及登录监测

-w /etc/group -p wa
-w /etc/passwd -p wa
-w /etc/shadow

-w /etc/login.defs -p wa
-w /etc/securetty
-w /var/log/lastlog

3)主机及系统配置监测

-w /etc/hosts -p wa # 静态主机名配置设置监测
-w /etc/sysconfig/ # 系统配置目录监测
w /etc/init.d/ # 引导配置监测
w /etc/ld.so.conf -p wa # 链接器配置监测
w /etc/localtime -p wa # 本地时间监测

w /etc/sysctl.conf -p wa # 内核配置监测
w /etc/modprobe.d/
w /etc/modprobe.conf.local -p wa
w /etc/modprobe.conf -p wa

4)PAM配置目录监测

w /etc/pam.d/

5)别名文件监测

-w /etc/aliases -p wa

6)SSH等配置文件监测

-w /etc/ssh/sshd_config

-w /etc/stunnel/stunnel.conf
-w /etc/stunnel/stunnel.pem

-w /etc/vsftpd.ftpusers
-w /etc/vsftpd.conf

7)主机名设置及系统标识配置监测

-a exit,always -S sethostname
-w /etc/issue -p wa
-w /etc/issue.net -p wa

4. 过滤系统调用参数

审计系统调用会产生高负载的日志记录活动,而后者又会给内核带来繁重的负载,应用过滤器有助于将审计重点放在您主要关注的方面
过滤非多路转换系统调用
access 系统调用会检查是否允许某个进程读取、写入文件或文件系统对象或者测试该对象是否存在。请使用 -F 过滤标志以 -F a1=ACCESS_MODE 格式构建与特定 access 调用匹配的规则。在 /usr/include/fcntl.h 中检查 access 系统调用的可能参数列表

1
2
3
-a entry,always -S access -F a1=4  # 审计 access 系统调用,但仅当该系统调用的第二个参数 (mode) 为 4 (R_OK) 时会进行审计。此规则过滤所有用于测试对用户或进程所访问的文件或文件系统是否拥有足够读取权限的 access 调用
-a entry,always -S access -F a1=6 # 审计 access 系统调用,但仅当该系统调用的第二个参数 (mode) 为 6(表示 4 OR 2,相当于 R_OK OR W_OK)时会进行审计。此规则过滤用于测试是否拥有足够读取和写入权限的 access 调用
-a entry,always -S access -F a1=7 # 审计 access 系统调用,但仅当该系统调用的第二个参数 (mode) 为 7(表示 4 OR 2 OR 1,相当于 R_OK OR W_OK OR X_OK)时会进行审计。此规则过滤用于测试是否拥有足够读取、写入和执行权限的 access 调用

过滤多路转换系统调用
socketcall 系统调用是多路转换系统调用。多路转换是指在所有可能的调用中只存在一个系统调用,并且 libc 会传递实际的系统调用作为第一个参数 (a0)。有关可能的参数值和系统调用名称的列表,请参见 /usr/src/linux/include/linux/net.h。审计支持使用 -F a0=SYSCALL_NUMBER 过滤特定的系统调用

1
2
3
4
5
6
7
-a entry,always -S socketcall -F a0=1 -F a1=10   # 审计 socket(PF_INET6) 系统调用。-F a0=1 过滤器会匹配所有 socket 系统调用,-F a1=10 过滤器可将匹配范围缩小为传递 IPv6 协议系列域参数 (PF_INET6) 的 socket 系统调用。有关第一个参数 (a0),请查看 /usr/include/linux/net.h;有关第二个参数 (a1),请查看 /usr/src/linux/include/linux/socket.h。AMD64/Intel 64 等 64 位平台不会对 socketcall 系统调用使用多路转换。对于这些平台,请将规则注释掉,并添加对 PF_INET6 进行过滤的普通系统调用规则
## Use this line on x86_64, ia64 instead
#-a entry,always -S socket -F a0=10

-a entry,always -S socketcall -F a0=5 # 审计 socketcall 系统调用。过滤标志设置为过滤 a0=5(socketcall 的第一个参数),如果您检查 /usr/include/linux/net.h,会发现此设置转换为 accept 系统调用。AMD64/Intel 64 等 64 位平台不会对 socketcall 系统调用使用多路转换。对于这些平台,请将规则注释掉,并添加不含参数过滤的普通系统调用规则
## Use this line on x86_64, ia64 instead
#-a entry, always -S accept

ipc 系统调用是多路转换系统调用的另一个示例。要调用的实际调用由传递给 ipc 系统调用的第一个参数决定。过滤这些参数有助于您将重点放在要关注的 IPC 调用上。在 /usr/include/linux/ipc.h 中查看可能的参数值

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
1) 审计与 IPC SYSV 消息队列相关的系统调用

a0 值指定要针对 msgctl 和 msgget 系统调用(14 和 13)添加审计。AMD64/Intel 64 等 64 位平台不会对 ipc 系统调用使用多路转换。对于这些平台,请将前两条规则注释掉,并添加不含参数过滤的普通系统调用规则

## msgctl
-a entry,always -S ipc -F a0=14
## msgget
-a entry,always -S ipc -F a0=13
## Use these lines on x86_64, ia64 instead
#-a entry,always -S msgctl
#-a entry,always -S msgget


2) 审计与 IPC SYSV 消息信号相关的系统调用

a0 值指定要针对 semctl、semget、semop 和 semtimedop 系统调用(3、2、1 和 4)添加审计。AMD64/Intel 64 等 64 位平台不会对 ipc 系统调用使用多路转换。对于这些平台,请将前四条规则注释掉,并添加不含参数过滤的普通系统调用规则

## semctl
-a entry,always -S ipc -F a0=3
## semget
-a entry,always -S ipc -F a0=2
## semop
-a entry,always -S ipc -F a0=1
## semtimedop
-a entry,always -S ipc -F a0=4
## Use these lines on x86_64, ia64 instead
#-a entry,always -S semctl
#-a entry,always -S semget
#-a entry,always -S semop
#-a entry,always -S semtimedop

3) 审计与 IPC SYSV 共享内存相关的系统调用

a0 值指定要针对 shmctl 和 shmget 系统调用(24 和 23)添加审计。AMD64/Intel 64 等 64 位平台不会对 ipc 系统调用使用多路转换。对于这些平台,请将前两条规则注释掉,并添加不含参数过滤的普通系统调用规则

## shmctl
-a entry,always -S ipc -F a0=24
## shmget
-a entry,always -S ipc -F a0=23
## Use these lines on x86_64, ia64 instead
#-a entry,always -S shmctl
#-a entry,always -S shmget

5. 使用键管理审计事件记录

使用 ausearch 命令可以根据不同的准则过滤日志。通过使用 ausearch -m MESSAGE_TYPE,可以过滤特定类型的事件。但是,要过滤与特定规则相关的事件,需要在 /etc/audit/audit.rules 文件中将一个键添加到此规则。然后,每次该规则记录一个事件时,此键就会添加到相应事件记录。要检索这些日志项,只需运行 ausearch -k YOUR_KEY 获取与该规则相关且带有此特定键的记录列表

1
2
3
4
5
-w /etc/audit/audit.rules -p wa

-w /etc/audit/audit.rules -p wa -k CFG_audit.rules # 使用 -k 选项将一个键添加到上述规则

查找记录:ausearch -k CFG_audit.rules

可以指定任何文本字符串作为键。使用不同的键前缀(CFG、LOG 等)后接文件名来区分与不同文件类型(配置文件或日志文件)相关的各监测项

0xFF 参考链接