Tom
Rhodes
原作
内核事件审计
概述
AUDIT
内核事件审计
MAC
在 &os; 6.0 操作系统的发行版本中, 包含了基于 &posix;.1e 草案,
以及 &sun; BSM 实现的事件审计机制。
事件审计功能使得选择性地记录与安全有关的系统事件成为可能,
而这些日志可以帮助人们完成系统分析、 监视, 以及安全评估等工作。
这一章将主要关注与安装和配置事件审计机制。
同时, 为了方便读者, 也介绍了审计策略,
并给出了一个实例加以说明。
读完这章, 您将了解:
事件审计是什么, 以及它如何工作。
如何在 &os; 上为用户和进程配置事件审计。
阅读这章之前, 您应该:
理解 &unix; 和 &os; 的基础知识
()。
熟悉关于内核配置和编译的基本方法
()。
熟悉安全知识以及如何在 &os; 运用它们 ()。
事件审计可能会产生大量的日志文件数据, 在某些配置中,
可能每周都会产生超过数 GB 的数据。 管理员应完整地阅读完这一章的内容,
以避免由于不当配置产生的自作自受型 DoS。
在 &os; 中的事件审计机制, 与 &sun; 的基本安全模块,
即 BSM 库类似。 因此, 这些配置与 &solaris;
和 Darwin 操作系统之间可以完全互换。
您需要了解的一些关键术语
在开始阅读这章之前, 首先需要解释一些关键的术语。
这是为了清除一些由于引入新术语而带来的困惑和阅读障碍。
类(class): 类用于区分系统中不同的动作类型。
例如, 使用 &man.login.1; 这一行为就可以放在一个类里。
事件(event): 可以把事件理解为发生在系统中的动作。
例如, 创建文件就是一个事件。
记录(record): 记录是关于某一特定动作的日志内容。
前缀(prefix): 前缀指用于切换成功和失败审计事件的配置单元。
安装审计支持
对于事件审计的支持, 已经随标准的 installworld
过程完成。 管理员可以通过查看
/etc/security 的内容来确认这一点。
您应能看到一些名字以 audit 开头的文件,
例如 audit_event。
此外, 还必须加入内核部分的支持。
这可以通过在本地的内核配置文件中加入下面一行来实现:
options AUDIT
接下来, 您应按照
中所介绍的步骤来完成一次内核的编译和安装。
一旦完成, 可以通过下列 &man.rc.conf.5; 配置来启动审计服务:
auditd_enable="YES"
默认不启用的那些功能可以在此处以 选项来增加。
对审计进行配置
默认情况下, 所有配置都可以通过
/etc/security 下的文件来完成。
要启动审计服务, 下面这些文件必须存在:
audit_class - 包含对于审计类的定义。
audit_control - 控制审计子系统的特性,
例如默认审计类、 在审计日志所在的卷上保留的最小空间, 等等。
audit_event - 定义内核审计事件。
它们多数都对应于某些系统调用。
audit_user - 针对特定用户进行的事件审计。
用户名在这里并不必须出现。
audit_warn - 用于 auditd 生成警告信息的
shell 脚本。
如果由于某些原因这些文件并不存在,
则可以很容易地用下列命令来安装:
&prompt.root; cd /usr/src/contrib/bsm/etc && make install
审计文件的语法
配置文件的语法看上去可能有点怪异, 尽管用起来会很容易。
管理员必须非常谨慎的一件事是改变系统的默认值,
因为这样做可能会造成潜在的无法正确收集审计数据的问题。
审计子系统能够同时接受配置语法中的长短名字。 接下来,
我们将给出语法表。
下面是所支持的全部审计类:
- all -
设置全部审计标志。
- administrative
- 所有在系统上所进行的管理性操作。
- application -
应用程序定义的动作。
- file_close -
审计对 close 系统调用的操作。
- exec -
审计程序或实用工具的执行。
- file_attr_acc
- 审计访问对象属性, 例如
&man.stat.1;、 &man.pathconf.2; 以及类似事件。
- file_creation
- 审计创建了文件的事件。
- file_deletion
- 审计所发生的文件删除事件。
- file_attr_mod
- 审计文件属性发生变化的事件,
例如 &man.chown.8;、 &man.chflags.1;、 &man.flock.2;,
等等。
- file_read
- 审计读取数据、 文件以读方式打开等事件。
- file_write -
审计写入数据、 文件以写方式打开等事件。
- ioctl -
审计对 &man.ioctl.2; 系统调用的使用。
- ipc - 审计
System V IPC 操作。
- login_logout -
审计系统中发生的 &man.login.1; 和 &man.logout.1; 事件。
- non_attrib -
审计无法归类的事件。
- no_class -
空类, 用于禁用事件审计。
- network -
与网络操作有关的事件, 例如
&man.connect.2; 和 &man.accept.2;。
- other -
审计各类杂项事件。
- process -
审计进程操作, 例如 &man.exec.3; 和
&man.exit.3;。
- tfm -
I HAVE NO CLUE!
下面是全部支持的审计前缀:
none - 同时审计事件的成功和失败。
例如, 秩序列出一个事件类就可以同时审计其成功或失败。
+ - 只审计成功事件。
- - 只审计失败事件。
使用 类, 无论是正还是负号作为前缀,
都会以极快的速度产生大量的数据。
其他用于改变默认配置值得前缀:
^- - 禁用对于失败事件的审计。
^+ - 启用对于成功事件的审计。
^ - 同时禁用成功和失败事件的审计。
配置文件
配置是在两个文件中进行设置的。 第一个文件是
audit_control 而第二个是
audit_user。 第一个文件是系统级的,
用于控制系统中的所有事件统计。 而后一个则可以实现细粒度的用户级审计。
传说中的 audit_control 文件
audit_control 文件包含了一些基本的默认值,
管理员通常会希望加以修改, 有时甚至是设置一些新的配置。
察看这个文件的内容, 我们会发现:
dir:/var/audit
flags:lo,ad,-all,^-fa,^-fc,^-cl
minfree:20
naflags:lo
这里的 表示默认存放审计日志的目录。
则用来设置系统级的默认。
目前的设置, 即
表示审计所有的系统
&man.login.1; 和 &man.logout.1; 动作、 所有管理动作,
以及所有系统中失败的动作, 但最后禁用对 、
, 以及 的失败常是。
尽管 会打开所有事件的失败常是,
但之后的选项中的 前缀则会改变相应的设置。
请注意前一节也说明了配置是从左到右读取的。 同样地,
较为靠右的值可以替代靠左的值所设定的默认。
参数定义了用于审计的文件系统上,
剩余空间的最小值。 这一百分比值是相对于保存审计日志的文件系统来计算的。
例如, 如果 指定了
/var/audit 而
设为两成 (20), 则当
/var 文件系统有八成
(80) 空间被填满时将会给出警告消息。
参数用于指定不可归类的审计标志;
比如说, 无法归类于系统上某一特定用户的事件类。 这可以通过在
audit_user 配置文件中的设置来改变。
audit_user 文件
audit_user 允许管理员将某些事件直接映射到特定用户。
这提供了针对所有系统用户的精细控制机制。
下面是 audit_user 文件中的一些默认值:
root:lo:no
audit:fc:no
注意默认值将审计所有的
login/logout
事件, 而禁止审计所有其他由
root 完成的动作。
这一配置也会审计所有文件创建操作,
并禁止所有其他由 audit
用户完成的操作。 尽管事件审计并不依赖特殊的用户才能正常工作,
某些配置, 特别是使用了 MAC 的环境中,
却可能需要这个用户存在。
管理事件审计
来自 auditd 服务的数据,
并不能以普通的文本形式进行修改或阅读。 数据以类似 &man.ktrace.1;
和 &man.kdump.1 的形式存储, 也就是说, 只能通过
praudit 或 auditreduce
工具来查看它们。
所提供的两个工具是为了不同的用途而准备的。
例如, praudit 将转存整个事件日志的内容,
并保存成普通的文本文件。 要将整个审计日志转存, 可使用:
&prompt.root; praudit /var/audit/AUDITFILE
这里 AUDITFILE 是希望查看的审计日志。
由于审计日志可能包含大量的数据,
管理员可能更希望选择某一特定用户的相关事件。
要达到这个目的, 可以使用下面的命令,
这里我们选择的用户是 trhodes:
&prompt.root; auditreduce -e trhodes /var/audit/AUDITFILE
这将选择保存在 AUDITFILE 中的所有由
trhodes 产生的审计日志。
还有许多其他选项可以在阅读审计记录时使用。 请参见前述命令的联机书册,
以获得进一步的解释。
审计日志文件的轮转
手工轮转日志文件将给系统造成混乱。 因此, 在
&man.newsyslog.conf.5; 中加入一行配置是不起作用的。
那么如何让日志轮转呢? 这可以通过给
audit 适当的参数来关闭事件审计,
并安全地完成轮转操作。 下面的命令将为管理员完成全部所需的操作:
&prompt.root; audit -n
如果 auditd 服务程序没有在运行,
则前述命令将失败并给出错误提示。
在 /etc/crontab 加入如下设置,
将使 &man.cron.8; 每十二小时将日志轮转一次。
* */12 * * * root /usr/sbin/audit -n
这些修改会在您保存 /etc/crontab 后生效。