易君召
易君召
发布于 2026-11-04 / 4 阅读
0

Linux 用户行为审计完整方案

核心目标:记录谁、什么时间、在哪台机器、执行了什么命令、操作结果、访问了哪些文件;区分两类审计:

  1. 系统自带日志(auth.log/secure):登录、sudo、su 这类认证事件,轻量、开箱即用

  2. auditd(Linux 内核审计框架):内核层审计,文件读写、进程创建、系统调用,生产环境做用户行为溯源首选

  3. 会话录制(tlog /script/asciinema):录制终端屏幕输入输出,可回放操作画面

重要前提:审计日志不能只存在本机,攻击者拿到权限第一件事就是删本地日志;生产务必转发到独立日志服务器(rsyslog、syslog-ng、Loki、ELK)。

一、先分清:各类工具适用场景对比

工具

审计层级

能力

缺点

rsyslog(auth 日志)

应用层

登录、sudo、su、ssh 登录

无法记录文件修改、普通命令、系统调用

auditd

内核层

文件监控、exec、chmod、进程、系统调用

配置复杂、日志量大,需要规则调优

tlog / terminal-recorder

终端层

完整会话回放,看到敲了什么命令

只能抓交互式终端,抓不到后台脚本、cron

bash HISTFILE(history)

shell 层

命令历史

用户可随意删除、修改 ~/.bash_history,不可靠

生产推荐组合:auditd(内核审计) + rsyslog(认证日志转发) + tlog(运维会话回放)

二、基础:认证行为审计(开箱即用,不用装包)

1. 日志文件位置

  • RHEL / openEuler / CentOS:/var/log/secure

  • Debian / Ubuntu:/var/log/auth.log 记录:SSH 登录、本地 tty 登录、su、sudo、密码认证失败、密钥登录。

查看示例:

# 查看所有登录、sudo提权事件
grep -E 'sshd|sudo|su' /var/log/secure
# 查看root登录记录
last root
# 查看所有用户最近登录
lastlog

2. sudo 日志增强(重点!追踪谁提权执行命令)

sudo 默认记录到 secure/auth.log,格式示例:

sudo:  user01 : TTY=pts/0 ; PWD=/home/user01 ; USER=root ; COMMAND=/usr/bin/systemctl restart nginx

风险:用户执行 sudo -i / sudo su 进入 root shell 之后,后续敲的命令 sudo 不再记录,这就是为什么需要 auditd 或者 tlog。

3. 加固 bash history(仅辅助,不能当审计依据)

用户随时可以 history -c、删除 .bash_history,只做辅助参考。 可以配置追加时间戳,放到 /etc/profile 全局:

export HISTTIMEFORMAT="%Y-%m-%d %H:%M:%S "
export HISTCONTROL=ignoredups
shopt -s histappend

三、核心:auditd 内核审计(生产标准方案)

auditd 在内核钩子上捕获事件,普通用户、拿到 root 也无法轻易绕过(除非卸载 auditd 或者修改规则)。

1. 安装启动

# RHEL/openEuler
yum install audit -y
systemctl enable --now auditd

# Debian/Ubuntu
apt install auditd audispd-plugins -y
systemctl enable --now auditd

主配置文件:/etc/audit/auditd.conf 重点参数:

log_file = /var/log/audit/audit.log
max_log_file = 8
max_log_file_action = ROTATE
space_left_action = SYSLOG
admin_space_left_action = SUSPEND

SUSPEND:磁盘满了停止审计,防止系统卡死;也可以设为 IGNORE,根据安全要求选择。

规则文件目录:/etc/audit/rules.d/,后缀 .rules,加载命令:

# 加载所有规则
augenrules --load
# 查看当前生效规则
auditctl -l

2. 常用审计规则(直接写到 /etc/audit/rules.d/user-audit.rules)

## 1. 监控执行所有命令(execve,记录用户执行的程序,最核心)
-a exit,always -F arch=b64 -S execve -k exec_cmd
-a exit,always -F arch=b32 -S execve -k exec_cmd

## 2. 监控账号文件修改(passwd、shadow、group、sudoers)
-w /etc/passwd -p rwxa -k user_passwd_change
-w /etc/shadow -p rwxa -k user_shadow_change
-w /etc/group -p rwxa -k group_change
-w /etc/sudoers -p rwxa -k sudoers_change

## 3. 监控ssh密钥目录
-w /root/.ssh/authorized_keys -p rwxa -k root_sshkey
-w /home/ -p rwxa -k user_sshkey -F dir

## 4. 监控修改权限、属主
-a exit,always -F arch=b64 -S chmod,fchmod,fchmodat -k chmod
-a exit,always -F arch=b64 -S chown,fchown,lchown -k chown

## 5. 监控删除、重命名文件
-a exit,always -F arch=b64 -S unlink,unlinkat,rename,renameat -k file_delete

## 6. 监控模块加载(root植入内核后门重点行为)
-a exit,always -F arch=b64 -S init_module,finit_module,delete_module -k kernel_module

⚠️ 注意:execve 全量审计会产生巨大日志量,高并发业务服务器谨慎开启;可以改成只审计 uid=0(root)的执行: -a exit,always -F arch=b64 -S execve -F auid=0 -k root_exec auid = 登录原始用户 ID(即便 sudo 切 root,auid 还是原来登录人的 ID!这是 auditd 最关键的字段)

3. auditd 查询工具 ausearch /aureport

# 按关键字查,查看所有执行命令事件
ausearch -k exec_cmd

# 查看root用户所有操作(auid是原始登录uid)
ausearch -ua 0

# 按时间范围查询
ausearch -ts today -te now -k user_shadow_change

# 生成审计汇总报表
aureport -x    # 执行命令报表
aureport -u    # 用户事件报表
aureport -f    # 文件访问报表

关键字段说明:

  • auid:审计 UID,登录原始用户,不会因为 su/sudo 切换身份改变,溯源核心字段!

  • uid:当前进程 uid(sudo 之后变成 0)

  • pid、ppid:进程树

  • exe:执行程序路径

  • key:我们自定义的标签,方便检索

四、终端会话录制:tlog(可回放操作画面)

tlog 是 cockpit 配套的终端录制工具,比 script 稳定,支持日志转发,适合运维人员登录操作回放。

局限:只能捕获交互式 PTY 终端,cron、后台脚本、API 调用无法捕获。

安装(RHEL/openEuler)

yum install tlog -y

配置 PAM,让所有 ssh 登录自动录制: 修改 /etc/pam.d/sshd,末尾添加:

session  required pam_tlog.so

配置 /etc/tlog/tlog.conf,日志输出到 syslog,方便转发。 回放命令:

tlog-play -r journal -M TLOG_ID=xxx

备选轻量方案 script(不推荐生产自动部署,容易丢记录)

# 手动录制
script -q /var/log/terminal/$(date +%Y%m%d_%H%M%S)_$USER.log

五、日志集中转发(重中之重,防日志被篡改删除)

使用 rsyslog 把 audit.log、secure/auth.log 统一推送到远端: 示例 rsyslog 配置 /etc/rsyslog.d/audit-forward.conf

# 转发audit日志
$ModLoad imfile
$InputFileName /var/log/audit/audit.log
$InputFileTag audit:
$InputFileStateFile audit-state
$InputFileSeverity info
$InputRunFileMonitor

# 远端syslog服务器地址,tcp协议
:tag,startswith,"audit:" @@192.168.1.100:514

远端可以用:rsyslog、Loki、Graylog、ELK、Splunk。

安全建议:远端 syslog 服务器禁止被审计主机账号登录,单向接收日志。

六、关键审计策略 & 避坑

  1. auid != uid:溯源一定要看 auid,不要看 uid;sudo 切 root 之后 uid=0,但 auid 还是登录用户

  2. auditd 规则不要无脑全开,execve 全量审计在高并发业务机 IO 和磁盘压力巨大,按需缩小范围

  3. auditd 本身可以被 root 停止:systemctl stop auditd;所以要监控 auditd 进程是否存活,一旦停止立刻告警

  4. 审计只负责记录,本身不能阻止操作;如果需要阻断,搭配 SELinux/AppArmor

  5. 不要依赖 .bash_history 做安全审计,属于用户态文件,可删除篡改

  6. 区分:登录审计(sshd)、提权审计(sudo)、内核行为审计(auditd)、终端回放(tlog),互补而不是替代

七、告警规则参考(对接 Prometheus/Alertmanager、zabbix)

需要监控并告警的审计事件:

  • /etc/shadow / /etc/sudoers / /root/.ssh/authorized_keys 被修改

  • 内核模块加载 / 删除(init_module)

  • 陌生 IP 登录、连续认证失败(暴力破解)

  • auditd 服务停止、audit 日志写入失败

  • root 执行高危命令(rm、dd、mkfs)

八、快速巡检脚本(一键检查审计状态)

#!/bin/bash
echo "==== auditd 状态 ===="
systemctl status auditd | head -5
echo -e "\n==== audit规则 ===="
auditctl -l
echo -e "\n==== 最近sudo操作 ===="
grep sudo /var/log/secure | tail -10
echo -e "\n==== audit日志最近10条exec ===="
ausearch -k exec_cmd --raw | tail -10

本文原创作者:易君召,详见:https://www.yijunzhao.cn/authors/yijunzhao,转载请注明出处。

原文链接 https://www.yijunzhao.cn/archives/linux-user-behavior-audit-complete-solution

欢迎访问 小易撩挨踢

https://www.yijunzhao.cn/