https://documentation.suse.com/sles/15-SP1/html/SLES-all/cha-audit-comp.html
sudo apt install auditd
sudo systemctl enable auditd
sudo systemctl start auditd
以下所有命令均需要root权限,请自行添加sudo或切换到root会话。
如果想让规则永久生效,可把传递给auditctl
的参数添加到/etc/audit/rules.d/audit.rules
文件里,每条命令一行。
例如,要让auditctl -e 2
开机自动生效,则把-e 2
作为单独一行添加到/etc/audit/rules.d/audit.rules
文件里。
要让/etc/audit/rules.d/audit.rules
文件里的规则立即生效,可以执行augenrules --load
命令。
注意:在audit.rules
里尽量不要给字符串加引号,否则可能不起作用。
# 禁用审计
auditctl -e 0
# 启用审计
auditctl -e 1
# 强制启用审计(设为2后,重启前不能再调整为0或1)
auditctl -e 2
auditctl -s
示例输出:
enabled 2 # 0:禁用;1:启用;2:强制启用(重启前不能关闭)
failure 1 # 0:写审计日志失败时静默;1:失败时打印内核日志;2:失败时 kernel panic
pid 569 # 当前用户pid
rate_limit 0 # 日志速率限制,每秒条数,0不限制
backlog_limit 8192 # 日志缓冲条数上限
lost 20 # 因限制而丢失的日志条数
backlog 0 # 尚未写入磁盘的日志条数
backlog_wait_time 60000 # 写入磁盘等待的秒数,超时还未写入则丢弃
loginuid_immutable 0 unlocked # 是否已启用登录UID不可变特性,启用后无法利用root权限来冒充其他用户
auditctl -l
auditctl -D
/etc/audit/rules.d/*.rules
加载审计规则augenrules --load
设置在审计日志写入磁盘失败时采取的措施。
写入失败不一定是因为IO问题(磁盘满了等情况),也可能是因为达到了下面设置的速率限制。
# 保持静默
auditctl -f 0
# 打印内核日志
auditctl -f 1
# 产生 kernel panic 使系统停止运行(不会进行磁盘同步,可能会丢失文件)
auditctl -f 2
如果超过速率限制,则丢弃日志并执行-f
设定的动作。设为0不限制。
auditctl -r 每秒消息条数
# 例如每秒100条
auditctl -r 100
如果未完成写入的日志条数超过限制,则丢弃日志并执行-f
设定的动作。设为0不限制。
auditctl -b 缓冲条数上限
# 例如1000条
auditctl -b 1000
以下所有命令均需要root权限,请自行添加sudo或切换到root会话。
如果想让规则永久生效,可把传递给auditctl
的参数添加到/etc/audit/audit.rules
文件里,每条命令一行。
例如,要让auditctl -w /etc -p rx
开机自动生效,则把-w /etc -p rx
作为单独一行添加到/etc/audit/audit.rules
文件里。
auditctl -w <文件或目录路径> [-p (r|w|x|a)] [-k <搜索关键字>]
### -p 的参数值:r 读;w 写;x 执行;a 获取文件状态(stat系统调用)
### -k 用于给给审计日志条目加自定义关键字,方便搜索(不要使用特殊字符,可能不生效。在`audit.rules`文件里指定时不要加引号)
### 例子
# 审计对 /etc/passwd 的访问
auditctl -w /etc/passwd
# 审计对 /etc/group 的写入
auditctl -w /etc/group -p w
# 审计对 /etc/shadow 的读取,把审核记录标记为“read_shadow”
auditctl -w /etc/shadow -p r -k read_shadow
如果要删除规则,把-w
改成-W
即可,如:
# 删除这条规则
auditctl -W /etc/shadow -p r -k read_shadow
# 列出审计模块支持的系统调用名称和id列表
ausyscall (b32|b64|<架构名称>) --dump
# 例子
ausyscall --dump # 列出本机默认模式的系统调用
ausyscall b32 --dump # 列出本机32位模式的系统调用
ausyscall b64 --dump # 列出本机64位模式的系统调用
ausyscall aarch64 --dump # 列出指定架构的系统调用
用户和程序在Linux中的大部分操作都可以通过系统调用方式进行审计,以下是添加系统调用审计规则的方法:
# 添加系统调用审计规则到规则列表的末尾
auditctl -a <规则列表>,<操作> [-S <系统调用名称或id>]... [-F <条件字段><操作符><条件值>]... [-k <搜索关键字>]
auditctl -a <操作>,<规则列表> [-S <系统调用名称或id>]... [-F <条件字段><操作符><条件值>]... [-k <搜索关键字>]
# 添加到规则列表的开头
auditctl -A <规则列表>,<操作> [-S <系统调用名称或id>]... [-F <条件字段><操作符><条件值>]... [-k <搜索关键字>]
auditctl -A <操作>,<规则列表> [-S <系统调用名称或id>]... [-F <条件字段><操作符><条件值>]... [-k <搜索关键字>]
# 删除规则
auditctl -d <规则列表>,<操作> [-S <系统调用名称或id>]... [-F <条件字段><操作符><条件值>]... [-k <搜索关键字>]
auditctl -d <操作>,<规则列表> [-S <系统调用名称或id>]... [-F <条件字段><操作符><条件值>]... [-k <搜索关键字>]
-S
指定要匹配的系统调用,-F
指定要匹配的条件规则,两者均可传递多个。-S
或-F
参数。-S all
。-S
,则所有匹配-F
的系统调用都会被记录。-F
参数。-k
用于给审计日志条目加自定义关键字,方便搜索。注意不要使用特殊字符,可能不生效。在audit.rules
文件里指定时不要加引号。操作
never
:用于忽略特定的审计事件,匹配的事件将不记录在审计日志中。always
:将匹配的规则记录在审计日志中。规则列表
task
:在创建新进程/线程时触发该审计规则。exit
:在每次系统调用完成时触发该审计规则。user
:用于过滤第三方程序(比如SSH服务器)发来的审计日志,与never
操作配合使用。exclude
:用于过滤不想看到的事件,与never
操作配合使用(即使传递always
,也被视为never
)。filesystem
:用于过滤不想看到的文件系统事件,与never
配合使用。系统调用名称或id
ausyscall [架构] --dump
命令查看审计模块支持的系统调用名称和id。all
,表示所有系统调用。-S openat,mkdirat
。-F arch=(b32|b64)
来明确指定要匹配的架构,否则可能会产生意外结果(在某一边匹配到无关调用)。操作符
=
:相等或赋值(具体是比较操作还是赋值操作取决于条件字段的类型)!=
:不相等<
:小于>
:大于<=
:小于或等于>=
:大于或等于&
:按位与,结果不为0则视为匹配。&=
:按位与并更新掩码,用于操作位域字段,在某些情况下与=
效果相同。条件字段
用户和用户组
uid
:User ID. May be numeric or the user account name.auid
:审计用户id,是用户最初登录时的uid。可传递uid数值或用户名。euid
:有效用户id(经历sudo等一系列用户切换后最终生效的uid),可传递uid数值或用户名。suid
:Saved User ID. See getresuid(2) man page.gid
:进行用户切换前的egid
:有效用户组id(经历sudo等一系列用户切换后最终生效的gid),可传递gid数值或用户组名称。sgid
:Saved Group ID. See getresgid(2) man page.fsgid
:文件系统的用户组id,可传递gid数值或用户组名称。fsuid
:文件系统的用户id,可传递uid数值或用户名。设备和文件系统
devmajor
:设备的 Major Numberdevminor
:设备的 Minor Numberfiletype
:文件类型,可以是:file
,dir
,socket
,link
,character
,block
,fifo
。inode
:操作对象在虚拟文件系统中的 inode 号。dir
:要监控的目录绝对路径,会监控当前目录及其中的所有内容,和-w
参数效果相同。仅可用于exit
规则列表。path
:要监控的文件绝对路径,和-w
参数效果相同。仅可用于exit
规则列表。perm
:按访问权限过滤,可以是以下值:r
读;w
写;x
执行;a
获取文件状态。仅可用于exit
规则列表。-p
参数作用相同。进程和线程
arch
:指令集架构,可通过 uname -m
命令获取,也可使用 b32
代表本机32位模式,b64
代表本机64位模式。exe
:可执行程序的绝对路径,只支持=
和!=
操作,每条规则只能出现一次。pid
:进程id。ppid
:父进程id。其他
a0
, a1
, a2
, a3
:系统调用的前4个参数,只支持数值,不支持字符串。exit
:系统调用的返回值。如果返回值是错误号(errno
),也可用对应的枚举名称代替(比如EACCES
等,参见man errno
)。key
:设置搜索关键字,与-k
参数作用相同。msgtype
:事件记录类型,仅可用于exclude
和user
规则列表,用于排除指定的事件。pers
:操作系统特定的数值saddr_fam
:网络类型,IPv4为2
,IPv6为10
。sessionid
:用户的登录会话id。success
:如果系统调用的返回值(exit
字段的值)大于等于0
,success
的值为1
,否则值为0
。SELinux(未使用)
obj_uid
:Object's UIDobj_gid
:Object's GIDobj_user
:Resource's SE Linux Userobj_role
:Resource's SE Linux Roleobj_type
:Resource's SE Linux Typeobj_lev_low
:Resource's SE Linux Low Levelobj_lev_high
:Resource's SE Linux High Levelsubj_user
:Program's SE Linux Usersubj_role
:Program's SE Linux Rolesubj_type
:Program's SE Linux Typesubj_sen
:Program's SE Linux Sensitivitysubj_clr
:Program's SE Linux Clearance以下是一些查询条件示例,完整的查询条件参数列表详见ausearch --help
。
ausearch -i
ausearch -i -k <搜索关键字>
注意:搜索关键字须为审核规则里通过-k
参数或-F key=
字段指定的值,其他值无效。支持部分匹配。
ausearch -i -f <要搜索的文件名>
# 例如,搜索所有和ping命令有关的记录
ausearch -i -f ping
root用户:
# 设置审计规则
auditctl -a always,exit -F arch=b64 -S execve -F uid=1000 -k uid1000exec
auditctl -a always,exit -F arch=b32 -S execve -F uid=1000 -k uid1000exec
uid 1000:
cat /etc/passwd
ping baidu.com
root用户:
# 查看审计日志
ausearch -i -k uid1000exec
将打印 uid 1000 执行命令的记录。
root用户:
# 设置审计规则
# 通过 realpath $(command -v vim) 找到 vim 的实际路径是 /usr/bin/vim.basic
auditctl -a always,exit -F arch=b64 -S openat -F uid=1000 -F exe=/usr/bin/vim.basic -k uid1000vim
auditctl -a always,exit -F arch=b32 -S openat -F uid=1000 -F exe=/usr/bin/vim.basic -k uid1000vim
uid 1000:
vim ~/test.txt
root用户:
# 查看审计日志
ausearch -i -k uid1000vim
将打印 uid 1000 通过 vim 打开文件的记录(包括 ~/test.txt
,以及 vim
在运行过程中打开的其他文件)。
root用户:
# 设置审计规则
auditctl -a always,exit -F arch=b64 -S connect -F uid=1000 -F success=1 -k uid1000conn
auditctl -a always,exit -F arch=b32 -S connect -F uid=1000 -F success=1 -k uid1000conn
uid 1000:
curl https://www.baidu.com/
root用户:
# 查看审计日志
ausearch -i -k uid1000conn
将打印 uid 1000 打开的 IP 和端口。