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
1516

被折叠的 条评论
为什么被折叠?



