Linux审计与系统调用
介绍
Linux Audit 是 Linux 内核中的一个子系统,用于记录系统调用和文件访问等事件。通过 Audit,系统管理员可以监控系统中的安全相关事件,如文件访问、用户登录、权限更改等。Audit 提供了强大的日志记录功能,帮助管理员进行安全审计和故障排查。定期分析 Audit 日志可以帮助你及时发现潜在的安全问题,确保系统的安全性。
安装 Audit
在 CentOS 中,Audit 可以通过 yum
包管理器安装。
-
更新系统包:
yum update -y
-
安装 Audit:
yum install audit -y
-
验证安装:
auditctl -v
如果安装成功,会显示 Audit 的版本信息。
Audit 配置文件
Audit 的主要配置文件位于 /etc/audit/auditd.conf
,用于配置 Audit 守护进程的行为。
配置文件示例
# 日志文件路径
log_file = /var/log/audit/audit.log
# 日志文件格式
log_format = RAW
# 日志文件大小(MB)
max_log_file = 50
# 保留的日志文件数量
num_logs = 5
# 日志文件权限
log_group = root
配置选项说明
log_file
:指定日志文件的路径。log_format
:日志文件格式,可以是RAW
或NOLOG
。max_log_file
:单个日志文件的最大大小(MB)。num_logs
:保留的日志文件数量。log_group
:日志文件的所属组。
Audit 相关命令
Audit 提供了多个命令用于配置和管理审计规则。
auditctl
用于配置和管理审计规则。
常用选项
-a
:添加规则。-d
:删除规则。-l
:列出当前规则。-s
:显示审计系统状态。-w
:监控文件或目录。
选项详细解释
-
-a
:添加规则- 语法:
auditctl -a <action>,<filter>
- 参数:
<action>
:规则的动作,可以是always
或never
。always
:总是记录匹配的事件。never
:从不记录匹配的事件。
<filter>
:规则的过滤器,可以是task
、exit
、user
或exclude
。task
:记录任务创建事件。exit
:记录系统调用退出事件。user
:记录用户空间事件。exclude
:排除特定事件。
示例:
auditctl -a always,exit
解释:添加一条规则,总是记录系统调用退出事件。
- 语法:
-
-d
:删除规则- 语法:
auditctl -d <action>,<filter>
- 参数:与
-a
相同。
示例:
auditctl -d always,exit
解释:删除一条规则,停止记录系统调用退出事件。
- 语法:
-
-l
:列出当前规则- 语法:
auditctl -l
- 参数:无。
示例:
auditctl -l
解释:列出当前所有审计规则。
- 语法:
-
-s
:显示审计系统状态- 语法:
auditctl -s
- 参数:无。
示例:
auditctl -s
解释:显示审计系统的当前状态,包括启用状态、日志文件信息等。
- 语法:
-
-w
:监控文件或目录- 语法:
auditctl -w <path> -p <permissions> -k <key>
- 参数:
<path>
:要监控的文件或目录路径。<permissions>
:监控的操作类型,可以是r
(读)、w
(写)、x
(执行)、a
(属性更改)的组合。<key>
:规则的键值,用于标识规则。
示例:
auditctl -w /etc/passwd -p rw -k passwd_access
解释:监控
/etc/passwd
文件的读写操作,并使用键值passwd_access
标识该规则。 - 语法:
-
-F
:指定过滤条件- 语法:
auditctl -a <action>,<filter> -F <field>=<value>
- 参数:
<field>
:过滤字段,如arch
(系统架构)、uid
(用户 ID)、gid
(组 ID)等。<value>
:过滤字段的值。
示例:
auditctl -a always,exit -F arch=b64 -S open -k file_open
解释:添加一条规则,总是记录 64 位系统架构下的
open
系统调用,并使用键值file_open
标识该规则。 - 语法:
-
-S
:指定系统调用- 语法:
auditctl -a <action>,<filter> -S <syscall>
- 参数:
<syscall>
:系统调用名称,如open
、read
、write
等。
示例:
auditctl -a always,exit -S open -k file_open
解释:添加一条规则,总是记录
open
系统调用,并使用键值file_open
标识该规则。 - 语法:
-
-k
:指定规则的键值- 语法:
auditctl -a <action>,<filter> -k <key>
- 参数:
<key>
:规则的键值,用于标识规则。
示例:
auditctl -a always,exit -S open -k file_open
解释:添加一条规则,总是记录
open
系统调用,并使用键值file_open
标识该规则。 - 语法:
系统调用分类
在 Linux 系统中,系统调用(System Call)是用户空间程序与内核交互的接口。通过监控系统调用,可以深入了解程序的行为,包括文件操作、进程管理、网络通信等。Audit 系统支持监控多种系统调用,以下是一些常见的分类:
文件操作相关系统调用
这些系统调用用于文件的创建、读取、写入、删除等操作。
常见系统调用
open
:打开文件。read
:读取文件内容。write
:写入文件内容。close
:关闭文件。unlink
:删除文件。rename
:重命名文件。mkdir
:创建目录。rmdir
:删除目录。
示例规则
监控 /etc/passwd
文件的读写操作:
auditctl -a always,exit -F arch=b64 -S open -S read -S write -F path=/etc/passwd -k passwd_access
进程管理相关系统调用
这些系统调用用于进程的创建、终止、权限切换等操作。
常见系统调用
fork
:创建子进程。execve
:执行新程序。exit
:终止进程。setuid
:设置用户 ID。setgid
:设置组 ID。kill
:发送信号给进程。
示例规则
监控 execve
系统调用(程序执行):
auditctl -a always,exit -F arch=b64 -S execve -k program_exec
网络通信相关系统调用
这些系统调用用于网络套接字的创建、连接、数据传输等操作。
常见系统调用
socket
:创建套接字。bind
:绑定套接字到地址。connect
:连接到远程地址。accept
:接受连接请求。send
:发送数据。recv
:接收数据。close
:关闭套接字。
示例规则
监控 socket
系统调用(网络套接字创建):
auditctl -a always,exit -F arch=b64 -S socket -k network_socket
权限管理相关系统调用
这些系统调用用于用户和权限的管理。
常见系统调用
chmod
:修改文件权限。chown
:修改文件所有者。setxattr
:设置文件扩展属性。capset
:设置进程的能力(capabilities)。
示例规则
监控 chmod
系统调用(文件权限修改):
auditctl -a always,exit -F arch=b64 -S chmod -k file_permission_change
用户登录和会话管理相关系统调用
这些系统调用用于用户登录、会话管理等操作。
常见系统调用
login
:用户登录。setuid
:切换用户 ID。setgid
:切换组 ID。setsid
:创建新会话。
示例规则
监控 setuid
系统调用(用户 ID 切换):
auditctl -a always,exit -F arch=b64 -S setuid -k user_switch
内存管理相关系统调用
这些系统调用用于内存的分配、释放等操作。
常见系统调用
mmap
:映射文件或设备到内存。munmap
:取消内存映射。mprotect
:设置内存保护。
示例规则
监控 mmap
系统调用(内存映射):
auditctl -a always,exit -F arch=b64 -S mmap -k memory_map
时间管理相关系统调用
这些系统调用用于获取或设置系统时间。
常见系统调用
gettimeofday
:获取当前时间。settimeofday
:设置系统时间。adjtimex
:调整系统时钟。
示例规则
监控 settimeofday
系统调用(系统时间修改):
auditctl -a always,exit -F arch=b64 -S settimeofday -k time_change
信号处理相关系统调用
这些系统调用用于信号的发送和处理。
常见系统调用
kill
:发送信号给进程。sigaction
:设置信号处理函数。signal
:设置信号处理函数。
示例规则
监控 kill
系统调用(信号发送):
auditctl -a always,exit -F arch=b64 -S kill -k signal_send
设备管理相关系统调用
这些系统调用用于设备的访问和控制。
常见系统调用
ioctl
:设备控制操作。open
:打开设备文件。close
:关闭设备文件。
示例规则
监控 ioctl
系统调用(设备控制):
auditctl -a always,exit -F arch=b64 -S ioctl -k device_control
其他常见系统调用
brk
:调整堆内存大小。clone
:创建新线程或进程。ptrace
:进程跟踪(用于调试)。mount
:挂载文件系统。umount
:卸载文件系统。
示例规则
监控 mount
系统调用(文件系统挂载):
auditctl -a always,exit -F arch=b64 -S mount -k filesystem_mount
典型用法
监控文件访问
-
监控
/etc/passwd
文件的读写操作:auditctl -w /etc/passwd -p rw -k passwd_access
-
查看相关日志:
ausearch -k passwd_access
监控用户登录
-
监控用户登录事件:
auditctl -a always,exit -F arch=b64 -S login -k user_login
-
查看相关日志:
ausearch -k user_login
监控系统调用
-
监控
open
系统调用:auditctl -a always,exit -F arch=b64 -S open -k file_open
-
查看相关日志:
ausearch -k file_open
日志管理与分析
Audit 日志默认存储在 /var/log/audit/audit.log
中。为了更好地管理日志,可以配置日志轮转。
-
编辑日志轮转配置:
vi /etc/logrotate.d/audit
-
添加以下内容:
/var/log/audit/audit.log { weekly rotate 4 compress missingok notifempty }
-
保存并退出编辑器。
-
手动测试日志轮转:
logrotate -f /etc/logrotate.d/audit
常见问题
1. Audit 日志文件过大
如果 Audit 日志文件过大,可以调整日志文件大小和保留数量:
vi /etc/audit/auditd.conf
修改 max_log_file
和 num_logs
参数。
2. Audit 规则不生效
确保 Audit 服务正在运行:
systemctl status auditd
如果服务未启动,可以启动服务:
systemctl start auditd
3. 如何永久保存 Audit 规则
Audit 规则默认在重启后失效。可以将规则添加到 /etc/audit/rules.d/audit.rules
文件中:
auditctl -l >> /etc/audit/rules.d/audit.rules