一、简介

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 主要记录以下几种类型的日志:

  • 用户活动日志:记录用户登录、登出、执行命令等活动。
  • 文件访问日志:监控对特定文件或目录的读取、写入和执行操作。
  • 系统调用日志:记录特定系统调用的执行情况,例如 openreadwrite 等。
  • 权限变更日志:记录对系统权限和配置的修改,如用户添加、删除或权限更改。
  • 安全事件日志:记录与安全相关的事件,如 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:事件类型,如 SYSCALLUSER_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。
  • euidsuidfsuid:有效用户 ID、设置用户 ID 和文件系统用户 ID。
  • egidsgidfsgid:有效组 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