UP | HOME

安全事件审计

Table of Contents

进程记账记录每条命令的执行信息,可用于追踪入侵途径

进程记账

进程记账是安全手段之一,管理员可借此追踪系统资源用量及其在不同用户间的分配,监控系统,并可在最低限度上追踪用户执行的命令

进程记账有利有弊。优势是可追溯入侵至入侵点;弊端在于产生海量日志,对磁盘空间要求较高

启用和使用进程记账

启用进程记账前,需执行:

$ service accounting enable
$ service accounting start

记账信息存储于 /var/account 目录

  • 首次启动记账服务时按需自动创建
  • 这些文件包含敏感信息,记录了所有用户执行过的每条命令
    • 仅 root 可写
    • 仅 root 与 wheel 组成员可读
    • 如果需同时阻止 wheel 成员读取,可将 /var/account 目录权限改为仅 root 可访问

启用后,记账即开始跟踪 CPU 信息、已执行命令等。所有记账日志均为二进制格式,须经 sa 查看。不加选项执行时,sa 打印每位用户的 调用次数总经过时间 (分钟)、 总 CPU 时间与用户时间 (分钟)及 平均 I/O 操作次数 等信息

要显示用户执行的命令,使用 lastcomm

$ lastcomm ls trhodes ttyp1
例如,此命令打印 trhodes 在 ttyp1 终端上所有 ls 的使用记录

安全事件审计概述

FreeBSD 操作系统支持 安全事件审计 。事件审计可对各类安全系统事件做可靠、精细、可配置的日志记录,包含 登录配置变更文件与网络访问 。这些日志可用于实时监控、入侵检测及事后分析

FreeBSD 实现了 Sun 发布的 Basic Security Module(BSM)API 及文件格式,与 Solaris 与 macOS 审计实现互通

接下来介绍事件审计的安装与配置,阐释审计策略,并提供一个审计配置示例

安全事件审计设施可生成极详细的系统活动日志。繁忙系统若配置为高细节级别,跟踪文件数据量可能极其庞大,某些配置下每周可超过数 GB

管理员应考虑高数据量审计配置对磁盘空间的需求

例如,可能需要为 /var/audit 分配专用文件系统,避免写满后影响其他文件系统

审计设施存在一些已知局限性。并非所有安全系统事件均可审计,且部分登录机制(如基于 Xorg 的显示管理器和第三方守护进程)无法正确为用户登录会话配置审计

关键术语

以下术语与安全事件审计相关:

  • 事件 event :可审计事件即审计子系统能够记录的任何事件
    • 安全事件示例包括 创建文件建立网络连接用户登录
    • 事件分 有归属 attributable ,可追溯至已认证用户 和 无归属 non-attributable 两类

      无归属事件例如认证前发生的错误密码尝试等
      
  • class :一组命名相关事件,用于选择表达式。常用事件类包括 文件创建 fc执行 ex登录_注销 lo
  • 记录 record :描述安全事件的审计日志条目。记录包括 事件类型执行主体(用户) 信息、 日期时间涉及的对象或参数 ,以及 成功失败 条件
  • 跟踪 trail :由一系列描述安全事件的审计记录组成的日志文件

    跟踪大致按事件完成时间排列。仅授权进程可向审计跟踪提交记录
    
  • 选择表达式 selection expression :一个字符串,包含前缀列表和审计事件类名称,用于匹配事件
  • 预选择 preselection :系统确定管理员关注哪些事件的过程

    预选择配置使用一系列选择表达式,确定对哪些用户审计哪些事件类
    
    以及同时适用于已认证和未认证进程的全局设置
    
  • 精简 reduction :从现有审计跟踪中筛选记录以供保存、打印或分析的过程;同样也是从审计跟踪中移除不需要的审计记录的过程

    管理员可借助精简实施审计数据保存策略
    
    例如,详细审计跟踪可保留一个月,之后可精简跟踪,仅保留登录信息以供归档
    

审计配置

事件审计的用户空间支持已随 FreeBSD 基础系统安装。GENERIC 内核默认提供内核支持

启用 auditd

$ service auditd enable

随后启动审计守护进程:

$ service auditd start

使用定制内核的用户,必须在其配置文件中加入:

options	AUDIT

事件选择表达式

选择表达式用于审计配置,确定应审计的事件。表达式包含待匹配的事件类列表,从左至右求值,合并两个表达式即前后拼接

Table 1: 汇总了默认审计事件类
类名 描述 操作
all 全部 匹配所有事件类
aa 认证与授权  
ad 管理 面向系统整体的管理操作
ap 应用程序 应用程序定义的操作
cl 文件关闭 审计对 close 系统调用的调用
ex 执行 审计程序执行命令行参数和环境变量的审计通过 audit_control 中的 policy 设置,使用 argv 和 envv 参数控制
fa 文件属性访问 审计对象属性的访问,如 stat(1) 和 pathconf(2)
fc 文件创建 审计文件创建相关事件
fd 文件删除 审计文件删除相关事件
fm 文件属性修改 审计文件属性修改相关事件,如 chown(8)、chflags(1) 和 flock(2)
fr 文件读取 审计读取数据或为读取而打开文件的事件
fw 文件写入 审计写入数据或写入/修改文件的事件
io ioctl 审计 ioctl 系统调用的使用
ip 进程间通信 审计各种形式的进程间通信,包括 POSIX 管道和 System V IPC 操作
lo 登录_注销 审计 login(1) 和 logout(1) 事件
na 无归属 审计无归属事件
no 无效类 不匹配任何审计事件
nt 网络 审计与网络操作相关的事件,如 connect(2) 和 accept(2)
ot 其他 审计其他杂项事件
pc 进程 审计进程操作,如 exec(3) 和 exit(3)
可修改配置文件 /etc/security/audit_class 和 /etc/security/audit_event 自定义上述审计事件类

每个审计事件类可附带前缀,表示匹配成功或失败的操作,以及该条目为该类及类型增加还是移除匹配。审计事件类前缀汇总如下:

Table 2: 汇总了默认审计事件类
前缀 操作
+ 审计该类中成功的事件
- 审计该类中失败的事件
^ 既不审计该类中成功也不审计失败的事件
^+ 不审计该类中成功的事件
^- 不审计该类中失败的事件
如果没有前缀,该事件成功与失败实例均受审计

以下示例选择字符串选择成功和失败的登录/注销事件,但仅选择成功的执行事件:

lo,+ex

配置文件

安全事件审计的以下配置文件位于路径 /etc/security 中:

/etc/security
			├── audit_control   -> 控制审计子系统
			├── audit_class     -> 审计类定义
			├── audit_event     -> 系统审计事件
			├── audit_user      -> 用户特定的审计要求
			└── audit_warn      -> 警告消息脚本
  • /etc/security/audit_control:控制审计子系统的各方面

    如默认审计类、审计日志卷上保留的最小磁盘空间以及最大审计跟踪大小
    
  • /etc/security/audit_class:包含审计类定义
  • /etc/security/audit_event:系统审计事件的文本名称与描述,以及每个事件所属的类列表
  • /etc/security/audit_user:用户特定的审计要求,在登录时与全局默认值合并
  • /etc/security/audit_warn:由 auditd 使用的可自定义 shell 脚本,用于在异常情况下生成警告消息

    例如审计记录空间即将耗尽或审计跟踪文件已完成轮替时
    

审计配置文件应谨慎编辑和维护,配置错误可能造成事件日志记录失当

多数情况下,管理员仅需修改 /etc/security/audit_control 和 /etc/security/audit_user

前者控制系统级审计属性与策略,后者可按用户精细调整审计
audit_control 文件

可在 /etc/security/audit_control 文件中指定审计子系统的若干默认值:

dir:/var/audit
dist:off
flags:lo,aa
minfree:5
naflags:lo,aa
policy:cnt,argv
filesz:2M
expire-after:10M

以上是基本系统中 /etc/security/audit_control 文件的默认值,其源代码位于 contrib/openbsm/etc/audit_control。

条目 作用 说明
dir 审计日志目录 设定一个或多个审计日志存储目录;如果有多个,则按顺序依次写满后切换;通常建议使用独立文件系统以避免写满影响其他系统组件
dist 分发(硬链接) 设为 on 或 yes 时,在 /var/audit/dist 中为所有审计跟踪文件创建硬链接
flags 默认预选择掩码(有归属事件) 定义系统范围内“有归属事件”的默认审计类;例如登录/注销成功与失败、认证与授权等事件
minfree 最小空闲空间 指定审计日志所在文件系统允许的最小剩余空间百分比
naflags 无归属事件掩码 指定“无归属事件”应审计的类别,例如登录/注销过程及认证与授权
policy 审计策略 以逗号分隔的策略标志列表;cnt 表示审计失败时系统继续运行(推荐),argv 表示记录 execve(2) 的命令行参数
filesz 跟踪文件大小限制 指定单个审计跟踪文件自动终止并轮替前的最大大小;0 表示禁用自动轮替;小于 512k 的值会被忽略并记录日志
expire-after 日志过期策略 指定审计日志文件的到期时间,到期后自动删除
audit_user 文件

管理员可在 /etc/security/audit_user 文件中为特定用户指定更多审计要求。每行以两个字段为用户配置审计:

  • alwaysaudit 字段指定始终对该用户审计的事件集
  • neveraudit 字段指定始终不对该用户审计的事件集

audit_user 文件默认值如下:

root:lo:no

想要为 www 用户审计文件创建和成功的命令执行

root:lo,+ex:no
www:fc,+ex:no

处理审计跟踪

由于审计跟踪以 BSM 二进制格式存储,FreeBSD 提供了若干内置工具用于修改或转换为文本。要将跟踪文件转换为简易文本格式,可使用 praudit 。此工具支持多种选择参数:事件类型、事件类、用户、事件日期或时间,以及操作所涉文件路径或对象。例如,以纯文本形式转储指定审计日志的全部内容

$ praudit /var/audit/审计日志
要精简审计跟踪文件以供分析、归档或打印,可使用 auditreduce

审计跟踪由一系列审计记录组成,每条记录由若干 令牌 token 构成,praudit 按顺序每行打印一个。每个令牌均属特定类型

例如 header(审计记录头)或 path(名称查找产生的文件路径)

以下为一条 execve 事件的示例:

header,133,10,execve(2),0,Mon Sep 25 15:58:03 2006, + 384 msec
exec arg,finger,doug
path,/usr/bin/finger
attribute,555,root,wheel,90,24918,104944
subject,robert,root,wheel,root,wheel,38439,38032,42086,128.232.9.100
return,success,0
trailer,133

此审计记录表示一次成功的 execve 调用,执行了 finger doug 命令

  • exec arg: 包含 shell 传递给内核的已处理命令行
  • path: 持有内核查找到的可执行文件路径
  • attribute: 令牌描述该二进制文件,含文件模式
  • subject: 令牌存储审计用户 ID、有效用户 ID 和组 ID、真实用户 ID 和组 ID、进程 ID、会话 ID、端口 ID 以及登录地址

    审计用户 ID 与真实用户 ID 不同
    
    用户 robert 执行此命令前已切换至 root 账户,但命令仍以原始认证用户审计
    
  • return: 令牌指示执行成功
  • trailer: 结束该记录

由于审计日志可能异常庞大,可使用 auditreduce 选取记录子集。以下示例选取审计日志文件中(AUDITFILE 为占位符,需替换为实际文件名,如 20240521140528.not_terminated)为用户 trhodes 产生的所有审计记录:

$ auditreduce -u trhodes /var/audit/AUDITFILE | praudit

audit 组默认为空,因此仅 root 可读 /var/audit 中的审计跟踪;将用户加入 audit 组可授予审计审阅权限

审计日志包含敏感信息,因此建议审慎授予审计审阅权限

使用审计管道进行实时监控

审计管道为 可克隆伪设备 ,应用程序可借此接入实时审计记录流,主要面向入侵检测和系统监控程序开发者

审计管道设备也为管理员提供了便捷的实时监控手段,不受审计跟踪文件所有权或日志轮替中断事件流的影响

要追踪实时审计事件流:

$ praudit /dev/auditpipe

默认情况下,审计管道设备节点仅可由 root 用户访问。要使 audit 组成员也能访问,可在 /etc/devfs.rules 中添加一条 devfs 规则:

add path 'auditpipe*' mode 0440 group audit

审计事件容易产生反馈循环:每查看一条审计事件便会生成更多审计事件

例如,如果审计了所有网络 I/O,并通过 SSH 会话运行 praudit,则会持续高速产生审计事件流

因为打印的每个事件都会触发新事件

因此建议在无细粒度 I/O 审计的会话中运行 praudit(接审计管道设备)

轮替与压缩审计跟踪文件

审计跟踪由内核写入,审计守护进程 auditd 管理

管理员不应使用 newsyslog.conf(5)  等工具直接轮替审计日志

应改用 audit 关闭审计、重新配置并轮替日志

以下命令令审计守护进程创建新审计日志,并通知内核切换。旧日志终止后重命名,可供管理员后续处理:

$ audit -n
如果 auditd 当前未运行,此命令失败并报错

在 /etc/crontab 中加入以下行,每 12 小时执行一次轮替:

0     */12       *       *       *       root    /usr/sbin/audit -n

保存 /etc/crontab 文件后此更改即生效

基于文件大小自动轮替审计跟踪文件可通过 audit_control 中的 filesz 实现

审计跟踪文件可能变得极大,审计守护进程关闭跟踪后,通常需压缩或归档。 audit_warn 脚本可针对各类审计事件执行自定义操作,包括跟踪在轮替时正常终止的情形。例如,可在 /etc/security/audit_warn 中添加以下内容,以在关闭时压缩审计跟踪:

#
# Compress audit trail files on close.
#
if [ "$1" = closefile ]; then
    gzip -9 $2
fi
其他归档操作可能包含复制跟踪文件至中央服务器、删除旧跟踪文件,或精简审计跟踪以移除不需要的记录

此脚本仅在审计跟踪文件正常终止时运行,非正常关机遗留的未终止跟踪则不触发
Next: OpenSSL Previous: Root桌面登录 Home: 安全管理