Tom Rhodes 原作 安全事件审计 概述 AUDIT 安全事件审计 MAC 在 &os; 7-CURRENT 开发分支上包含了对于基于 Sun 所发布的 BSM API 及文件格式的时间审计支持。 事件审计功能, 使得选择性地对涉及安全的系统事件进行记录成为可能, 这可进一步为出现问题之后的验尸式分析、 系统监控, 以及入侵检测所用。 经过在 &os; 7-CURRENT 中一段时间的沉淀之后, 这一支持将被合并到 &os; 6-STABLE 并出现在之后的发行版中。 FreeBSD 中的审计机制目前还是试验性的, 只有在仔细考量部署风险之后, 才应在生产系统上部署这一试验性的软件。 这一章将主要关注与安装和配置事件审计机制。 同时, 为了方便读者, 也介绍了审计策略, 并给出了一个实例加以说明。 读完这章, 您将了解: 事件审计是什么, 以及它如何工作。 如何在 &os; 上为用户和进程配置事件审计。 阅读这章之前, 您应该: 理解 &unix; 和 &os; 的基础知识 ()。 熟悉关于内核配置和编译的基本方法 ()。 熟悉安全知识以及如何在 &os; 运用它们 ()。 事件审计可能会产生大量的日志文件数据, 在某些配置中, 可能每周都会产生超过数 GB 的数据。 管理员应完整地阅读完这一章的内容, 以避免由于不当配置产生的自作自受型 DoS 在 &os; 中的事件审计机制, 与 &sun; 的基本安全模块, 即 BSM 库类似。 因此, 这些配置与 &solaris; 和 Mac OS X/Darwin 操作系统之间可以完全互换。 您需要了解的一些关键术语 在开始阅读这章之前, 首先需要解释一些关键的术语。 这是为了清除一些由于引入新术语而带来的困惑和阅读障碍。 事件 (event): 可审计事件是指能够被审计子系统记录的事件。 管理员可以配置审计哪些事件。 举例说来, 与安全有关的事件包括创建文件、 建立网络连接, 以及以某一用户身份登录, 等等。 任何事件必属于 有主 (attributable), 即可以最终归于某一用户身份, 或 无主(non-attributable) 二者之一。 举例而言, 无主事件可以是任何发生在登录过程成功之前的事件, 例如失败的登录尝试, 等等。 类 (class): 事件可以指定为一个或多个类, 通常这是基于事件的一般类别来进行的, 例如 创建文件访问文件, 或 网络。 登录和注销事件, 则指定为 lo 类。 通过使用类, 管理员能够指定更高层次的审计规则, 而无需一一指定每个需要进行记录的可审计操作。 记录 (record): 记录是描述安全事件的一个日志项。 典型的记录包括记录事件类型、 与事件有关的主体 (用户) 信息、 时间信息、 相关的任何对象信息, 以及事件所关联的操作是否成功的信息。 账目 (trail): 审计账目, 或日志文件, 包含了一系列描述安全事件的审计记录。 典型情况下, 审计账目基本上是以事件发生的时间顺序记录的。 只有获得授权的进程, 才能够向审计账目中提交记录。 前缀 (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 脚本。 审计文件的语法 配置文件的语法看上去可能有点怪异, 尽管用起来会很容易。 管理员必须非常谨慎的一件事是改变系统的默认值, 因为这样做可能会造成潜在的无法正确收集审计数据的问题。 审计子系统能够同时接受配置语法中的长短名字。 接下来, 我们将给出语法表。 下面是所支持的全部审计类: - 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 - 审计各种形式的进程间通信 (IPC), 包括 POSIX 管道和 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;。 下面是全部支持的审计前缀: none - 同时审计事件的成功和失败。 例如, 秩序列出一个事件类就可以同时审计其成功或失败。 + - 只审计成功事件。 - - 只审计失败事件。 使用 类, 无论是正还是负号作为前缀, 都会以极快的速度产生大量的数据。 其他用于改变默认配置值得前缀: ^- - 禁用对于失败事件的审计。 ^+ - 启用对于成功事件的审计。 ^ - 同时禁用成功和失败事件的审计。 配置文件 多数情况下, 在配置审计系统时, 管理员只需修改两个文件: audit_controlaudit_user。 第一个文件控制系统级的审计参数, 以及所有有主或无主事件的默认参数。 第二个文件用于调整针对具体用户的审计级别和性质。 传说中的 <filename>audit_control</filename> 文件 audit_control 文件包含了一些基本的默认值, 管理员通常会希望加以修改, 有时甚至是设置一些新的配置。 察看这个文件的内容, 我们会发现: dir:/var/audit flags:lo minfree:20 naflags:lo 这里的 用于设置审计日志的默认存放目录。 审计通常都会配置为保存在一个专用的文件系统之下, 以避免审计系统与其它子系统在文件系统满的时候所产生的冲突。 选项则用来设置系统级的默认。 目前的设置, 即 配置审计所有的 &man.login.1; 和 &man.logout.1; 动作。 而更为复杂的例子, 表示审计所有的系统 &man.login.1; 和 &man.logout.1; 动作、 所有管理动作, 以及所有系统中失败的动作, 但最后禁用对 , 以及 的失败常是。 尽管 会打开所有事件的失败常是, 但之后的选项中的 前缀则会改变相应的设置。 请注意前一节也说明了配置是从左到右读取的。 同样地, 较为靠右的值可以替代靠左的值所设定的默认。 参数定义了用于审计的文件系统上, 剩余空间的最小值。 这一百分比值是相对于保存审计日志的文件系统来计算的。 例如, 如果 指定了 /var/audit 设为两成 (20), 则当 /var 文件系统有八成 (80) 空间被填满时将会给出警告消息。 参数用于指定无主事件 — 也就是那些并不与特定用户关联的事件的审计。 <filename>audit_user</filename> 文件 audit_user 文件允许管理员决定哪些系统用户所产生的哪些类的事件应被记录在案。 下面是 audit_user 文件中的一些默认值: root:lo:no audit:fc:no 注意默认值将审计所有的 login/logout 事件, 而禁止审计所有其他由 root 完成的动作。 这一配置也会审计所有文件创建操作, 并禁止所有其他由 audit 用户完成的操作。 尽管事件审计并不依赖特殊的用户才能正常工作, 某些配置, 特别是使用了 MAC 的环境中, 却可能需要这个用户存在。 管理事件审计 由内核审计子系统写出的事件, 并不能以普通文本的形式加以修改或阅读。 这些数据以类似 &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 | praudit 这将选择保存在 AUDITFILE 中的所有由 trhodes 产生的审计日志。 还有许多其他选项可以在阅读审计记录时使用。 请参见前述命令的联机书册, 以获得进一步的解释。 审计日志文件的轮转 由于日志可靠性的要求, 审计计账只由内核写入, 且只能由 auditd 管理。 管理员不应尝试使用 &man.newsyslog.conf.5; 或其它工具来完成审计日志的轮转工作。 您应使用 audit 管理工具来关闭审计、 重新配置审计系统, 并完成日志轮转。 下面的命令将让审计服务创建新的审计日志, 并发信号给内核要求其使用新的日志。 旧日志将终止并被改名, 此时, 管理员就可以操作它了。 &prompt.root; audit -n 如果 auditd 服务程序没有在运行, 则前述命令将失败并给出错误提示。 /etc/crontab 加入如下设置, 将使 &man.cron.8; 每十二小时将日志轮转一次。 * */12 * * * root /usr/sbin/audit -n 这些修改会在您保存 /etc/crontab 后生效。 为其它用户指派审计复审权限 默认情况下, 只有 root 用户拥有读取系统审计日志的权限。 但您也可以将这种权限通过 audit 组的成员身份来指定给其它用户, 因为审计目录和记账文件都是属于这个组的, 而且是同组可读的。 由于阅读审计日志的内容会提供关于用户和进程的大量行为信息, 强烈建议在指派这一权限时谨慎行事。