一、简介
Linux 审计系统提供了一种方式来跟踪系统上与安全相关的信息,根据预配置的规则,审计会生成日志条目,来尽可能多地记录系统上所发生的事件的相关信息。对于关键任务环境而言至关重要,可用来确定安全策略的违反者及其所执行的操作,便于在发生网络入侵等安全事件时,能够为追踪溯源提供日志及时间节点的支撑。
在 Linux 服务器主机系统中常常使用 audit 相关工具来对账户管理、权限管理、文件系统管理、日志文件操作管理以及网络配置管理等资源的操作监控,并根据审计规则进行对应的日志记录,最后使用 syslog 服务进行将日志转发到企业的日志中心服务器上,以便于发生安全事件后溯源查询。
主要功能:
- 安全审计:
audit
用于记录与安全相关的事件,包括用户身份验证、文件访问、系统调用等。 - 合规性:帮助组织满足各种合规性要求(如 PCI-DSS、HIPAA 等),确保系统活动的可追溯性。
- 问题追踪:能够追踪系统中的可疑活动,帮助系统管理员识别潜在的安全威胁。
主要组件:
- auditd:审计守护进程,负责收集、记录和管理审计事件。
- auditctl:命令行工具,用于配置和控制审计规则。
- ausearch:用于搜索审计日志的工具,可以根据特定条件过滤和查找事件。
- aureport:用于生成审计报告的工具,提供易于理解的输出格式。
二、各步骤简叙
2.1 安装
# Debian/Ubuntu
sudo apt-get install auditd
# CentOS/RHEL
sudo yum install audit -y
# Fedora
sudo dnf install audit
# SUSE
sudo zypper install audit
2.2 配置文件
在 /etc/audit/目录下主要有3个配置文件:
- /etc/audit/auditd.conf:主要配置文件,定义了审计守护进程的行为和日志记录策略
- /etc/audit/audit.rules:用于定义审计规则,通常在系统启动时加载;在某些系统中,这个文件可能会被 /etc/audit/rules.d/audit.rules 文件覆盖
- /etc/audit/audit-stop.rules:在停止
auditd
守护进程时需要应用的审计规则,比如在服务停止时移除或禁用特定的审计规则,防止在下次启动时继续监控不再需要的事件;确保在停止审计守护进程时,相关的审计规则不会影响系统的正常运行。
/etc/audit/auditd.conf文件:
#
# This file controls the configuration of the audit daemon
#
# 是否记录本地事件,开启后,即使不手动编写审计规则,系统仍然会记录一些基本的事件
local_events = yes
# 是否将审计事件写入日志文件
write_logs = yes
# 审计日志文件的路径
log_file = /var/log/audit/audit.log
# 定义日志文件的组权限
log_group = root
# 指定审计日志的格式,默认 ENRICHED 将解析所有uid、gid、syscall、体系结构和套接字地址信息同时意味着需要更大的空间,更适合用于日常审计和调查活动。
# RAW 格式:只包含原始的系统调用信息,不包含额外的上下文信息,以减少日志文件大小和性能开销,更适合用于高性能环境。
log_format = RAW
# 定义日志刷新策略,none(日志不写到磁盘),incremental (日志写到磁盘),incremental-async (日志异步写到磁盘),data(保持部分数据和磁盘的一直同步),sync(每次记录都写到磁盘)
flush = INCREMENTAL_ASYNC
# 设置日志刷新的频率(以行数为单位)
freq = 50
# 设置单个审计日志文件的最大大小(单位为 MB)
max_log_file = 8
# 设置保留的旧日志文件数量
num_logs = 5
# 设置审计守护进程的优先级提升
priority_boost = 4
# 设置分发服务的服务质量(QoS),lossy 表示可以接受丢失一些日志
disp_qos = lossy
# 指定事件分发器程序的路径
dispatcher = /sbin/audispd
# 指定日志文件命名格式,NONE 表示不使用特定命名格式
name_format = NONE
# name = mydomain
# 定义日志文件达到最大大小后的操作,默认为轮询(ROTATE),其他可选值 ignore、syslog、suspend and keep_logs
max_log_file_action = ROTATE
# 设置剩余空间低于该值时的警告阈值(单位:MB)
space_left = 75
# 定义当剩余空间低于 space_left 时的操作,默认值为 syslog ,其他有效值为 ignore, syslog, rotate, email, exec, suspend, single, and halt.
space_left_action = SYSLOG
# 是否验证电子邮件地址
verify_email = yes
# 指定接收审计警告邮件的账户
action_mail_acct = root
# 设置在磁盘剩余空间低于该值时的阈值(单位:MB)
admin_space_left = 50
# 定义当剩余空间低于 admin_space_left 时的操作,默认值为 suspend(暂停审计) ,其他有效值为 ignore, syslog, rotate, exec, suspend, single, and halt.
admin_space_left_action = SUSPEND
# 设置磁盘已满时的操作
disk_full_action = SUSPEND
# 设置磁盘错误时的操作
disk_error_action = SUSPEND
# 是否使用 TCP Wrapper 来控制访问
use_libwrap = yes
# tcp_listen_port = 60
# 设置 TCP 监听队列的最大连接数
tcp_listen_queue = 5
# 每个地址允许的最大连接数,默认值为 1,最大值为 1024
tcp_max_per_addr = 1
# 监听端口范围
# tcp_client_ports = 1024-65535
# 客户端最大空闲时间(单位:秒),0 表示没有限制
tcp_client_max_idle = 0
# 是否启用 Kerberos 5 认证
enable_krb5 = no
# 指定 Kerberos 主体名称
krb5_principal = auditd
# krb5_key_file = /etc/audit/audit.key
# 是否启用网络分发审计事件
distribute_network = no
2.3 启动
# systemctl管理
systemctl start auditd
# 绝对路径启动
/usr/sbin/auditd
# 容器里启动,由于audit涉及到内核,需要以privilege权限启动才能正常使用
docker run --privileged -it your_image_name bash
2.4 auditctl
auditctl
是用于管理 Linux 审计系统 (auditd
) 的命令行工具,允许用户添加、删除和查看审计规则。
添加规则
auditctl -w /path/to/file -p rwxa -k key_name
-
-w
:监控指定的文件或目录
-p
- :指定权限,使用字母组合(不指定时默认监控所有事件):
-
r
:读取 -
w
:写入 -
x
:执行 -
a
:属性修改
-
-k
:为规则指定一个关键字,便于后续搜索日志。
为了在系统重启后自动加载规则,可以将规则添加到 /etc/audit/rules.d/
目录下的文件中。
echo "-w /etc/passwd -p wa -k passwd_changes" >> /etc/audit/rules.d/audit.rules
使用 auditctl -s
enabled 1 # 指示审计系统是否启用:1 启用,0 禁用
failure 1 # 指示当审计记录失败时的处理方式:1 记录失败信息,0 忽略失败
pid 1527 # 前审计守护进程 (auditd) 的进程 ID
rate_limit 0 # 设置审计事件的速率限制,用于防止过多事件导致的日志膨胀,后面的值表示每秒允许的最大事件数,0 不限制
rate_limit_action 1 # 当达到速率限制时的处理方式:1 记录到日志,0 忽略
backlog_limit 8192 # 审计事件的最大积压数量,值:表示可以在内存中等待处理的最大事件数
lost 0 # 表示由于速率限制或其他原因而丢失的事件数量
backlog 0 # 当前积压的事件数量
loginuid_immutable 0 unlocked # 指示 login UID 的可变性:1 不可变,0 可变
2.5 日志
auditd
生成的审计日志记录了系统中的各种安全事件,通常存储在 /var/log/audit/audit.log
中
日志类型
auditd
主要记录以下几种类型的日志:
- 用户活动日志:记录用户登录、登出、执行命令等活动。
- 文件访问日志:监控对特定文件或目录的读取、写入和执行操作。
- 系统调用日志:记录特定系统调用的执行情况,例如
open
、read
、write
等。 - 权限变更日志:记录对系统权限和配置的修改,如用户添加、删除或权限更改。
- 安全事件日志:记录与安全相关的事件,如 SELinux 相关的操作和其他安全策略的执行。
日志格式
审计日志的格式通常为文本格式,每条日志记录包含多个字段,如
type=SYSCALL msg=audit(1633044800.123:123): arch=c000003e syscall=2 success=yes exit=3 a0=0x7fffa3f4d720 a1=0x0 a2=0x0 a3=0x0 items=1 ppid=1234 pid=5678 auid=1000 uid=1000 gid=1000 euid=1000 suid=1000 fsuid=1000 egid=1000 sgid=1000 fsgid=1000 tty=pts0 ses=1 comm="cat" exe="/usr/bin/cat" key="file_access"
主要字段解释:
- type:事件类型,如
SYSCALL
、USER_LOGIN
等。 - msg:包含时间戳和事件 ID,格式为
audit(timestamp:ID)
。 - arch:系统架构(例如
c000003e
表示 x86_64)。 - syscall:系统调用编号,表示执行的系统调用。
- success:表示系统调用是否成功(
yes
或no
)。 - exit:系统调用的退出状态。
- a0, a1, a2, a3:系统调用的参数。
- items:相关项的数量。
- ppid:父进程 ID。
- pid:进程 ID。
- auid:审计用户 ID,表示启动进程的用户。
- uid:用户 ID。
- gid:组 ID。
- euid、suid、fsuid:有效用户 ID、设置用户 ID 和文件系统用户 ID。
- egid、sgid、fsgid:有效组 ID、设置组 ID 和文件系统组 ID。
- tty:终端类型。
- ses:会话 ID。
- comm:执行的命令。
- exe:命令的完整路径。
- key:与该事件关联的关键字,便于后续检索。
2.6 ausearch
ausearch
是 auditd
审计系统中用于查询和过滤审计日志的命令行工具。它允许用户根据多种条件检索特定的审计事件,帮助系统管理员分析和审计系统活动。
常用参数:
参数 | 描述 | 示例 |
-k | 根据关键字搜索 | ausearch -k file_access |
-c | 根据命令名过滤 | ausearch -c passwd |
-ts | 指定开始时间 | ausearch -ts today,ausearch -ts "18:00:00" |
-te | 指定结束时间 | ausearch -te now |
-ua | 根据审计用户 ID 过滤 | ausearch -ua 1000 |
-p | 根据进程 ID 过滤 | ausearch -p 1234 |
-m | 根据事件类型过滤 | ausearch -m USER_LOGIN |
-f | 根据文件路径过滤 | ausearch -f /etc/passwd |
-i | 以可读格式显示输出,转换事件代码为文本 | ausearch -i |
2.7 aureport
aureport
是 auditd
审计系统中的一个工具,用于生成审计报告,提供系统活动的汇总和统计信息。它可以帮助系统管理员快速了解审计日志中的重要信息。
常用参数
参数 | 描述 | 示例 |
--users | 生成用户活动的汇总报告 | aureport --users |
--comm | 生成命令执行的汇总报告 | aureport --comm |
--syscall | 生成系统调用的汇总报告 | aureport --syscall |
--file | 生成文件访问的汇总报告 | aureport --file |
--start,--end | 指定时间范围 | aureport --users --start today --end now |
--html | 生成 HTML 格式的报告 | aureport --users --html > user_report.html |
--csv | 生成 CSV 格式的报告 | aureport --comm --csv > command_report.csv |
示例
运行 aureport --users
================================================================================
# date login logout tty pid exec
================================================================================
2023-09-29 12:00:00 user1 12:30:00 pts/0 1234 bash
2023-09-29 12:05:00 user2 12:35:00 pts/1 5678 ssh
运行 aureport --comm
================================================================================
# command count
================================================================================
ssh 50
bash 30
passwd 10