9.7 安全审计(Audit)
9.7 安全审计(Audit)
CGSL 内核有用日志记录事件的能力,比如记录系统调用和文件访问。然后,管理员可以评审这些日志,确定可能存在的安全裂口,比如失败的登录尝试,或者用户对系统文件不成功的访问,这种功能称为审计(Audit),CGSL 审计功能由 auditd 服务提供。要使用审计系统,可采用下面的步骤:
(1) 配置审计守护进程(auditd)。
(2) 添加审计规则和观察器来收集所需的数据。
(3) 启动守护进程,它启用了内核中的审计系统并开始进行日志记录。
(4) 通过生成审计报表和搜索日志来周期性地分析数据。
9.7.1 配置审计守护进程(auditd)
审计守护进程(auditd)的默认配置文件为/etc/audit/auditd.conf,用户可以修改该文件定制产生的审计日志。配置文件示例如下:
|
log_file = /var/log/audit/audit.log
log_format = RAW
log_group = root
priority_boost = 4
flush = INCREMENTAL
freq = 20
num_logs = 4
disp_qos = lossy
dispatcher = /sbin/audispd
name_format = NONE
##name = mydomain
max_log_file = 5
max_log_file_action = ROTATE
space_left = 75
space_left_action = SYSLOG
action_mail_acct = root
admin_space_left = 50
admin_space_left_action = SUSPEND
disk_full_action = SUSPEND
disk_error_action = SUSPEND
##tcp_listen_port =
tcp_listen_queue = 5
tcp_max_per_addr = 1
##tcp_client_ports = 1024-65535
tcp_client_max_idle = 0
enable_krb5 = no
krb5_principal = auditd
##krb5_key_file = /etc/audit/audit.key
|
其中,
log_file
审计日志文件的完整路径。
log_format
写日志时要使用的格式。
priority_boost
审计应采用多少优先级推进守护进程。必须是非负数。0 表示没有变化。
flush
多长时间向日志文件中写一次数据。值可以是 NONE、INCREMENTAL、DATA 和 SYNC 之一。如果设置为 NONE,则不需要做特殊努力来将数据刷新到日志文件中。如果设置为 INCREMENTAL,则用 freq 选项的值确定多长时间发生一次向磁盘的刷新。如果设置为
DATA,则审计数据和日志文件一直是同步的。如果设置为SYNC,则每次写到日志文件时,数据和元数据是同步的。
freq
如果 flush 设置为 INCREMETNAL,审计守护进程在写到日志文件中前从内核中接收的记录数。
num_logs
max_log_file_action 设置为 ROTATE 时要保存的日志文件数目。必须是 0~99 之间的数。如果设置为小于 2,则不会循环日志。默认为 0,意味着从来不循环日志文件。
dispatcher
当启动这个守护进程时,由审计守护进程自动启动程序。所有守护进程都传递给这个程序。可以用它来进一步定制报表或者以与您的自定义分析程序兼容的不同格式产生它们。非必须选项。
disp_qos
控制调度程序与审计守护进程之间的通信类型。有效值为 lossy 和 lossless。如果设置为 lossy,若审计守护进程与调度程序之间的缓冲区已满(缓冲区为 128 千字节),则发送给调度程序的引入事件会被丢弃。然而,只要 log_format 没有设置为 nolog,事件就仍然会写到磁盘中。如果设置为 lossless,则在向调度程序发送事件之前和将日志写到磁盘之前,调度程序会等待缓冲区有足够的空间。
max_log_file
以兆字节表示的最大日志文件容量。当达到这个容量时,会执行 max_log_file_action 指定的动作。
max_log_file_action
当达到 max_log_file 的日志文件大小时采取的动作。值必须是 IGNORE、SYSLOG、SUSPEND、ROTATE 和 KEEP_LOGS 之一。如果设置为 IGNORE,则在日志文件达到 max_log_file 后不采取动作。如果设置为 SYSLOG,则当达到文件容量时会向系统日志/var/log/messages 中写入一条警告。如果设置为 SUSPEND,则当达到文件容量后不会向日志文件写入审计消息。如果设置为ROTATE,则当达到指定文件容量后会循环日志文件,但是只会保存一定数目的老文件,这个数目由 num_logs 参数指定。老文件的文件名将为 audit.log.N,其中 N 是一个数字。这个数字越大,则文件越老。如果设置为 KEEP_LOGS,则会循环日志文件,但是会忽略 num_logs 参数,因此不会删除日志文件。
space_left
以兆字节表示的磁盘空间数量。当达到这个水平时,会采取 space_left_action 参数中。
space_left_action
当磁盘空间量达到 space_left 中的值时,采取这个动作。有效值为 IGNORE、SYSLOG、EMAIL、SUSPEND、SINGLE 和 HALT。如果设置为 IGNORE,则不采取动作。如果设置为 SYSLOG,则向系统日志/var/log/messages 写一条警告消息。如果设置为 EMAIL,则从 action_mail_acct 向这个地址发送一封电子邮件,并向/var/log/messages 中写一条警告消息。如果设置为 SUSPEND,则不再向审计日志文件中写警告消息。如果设置为 SINGLE,则系统将在单用户模式下。如果设置为 SALT,则系统会关闭。
action_mail_acct
负责维护审计守护进程和日志的管理员的电子邮件地址。如果地址没有主机名,则假定主机名为本地地址,比如 root。必须安装 sendmail 并配置为向指定电子邮件地址发送电子邮件。
admin_space_left
以兆字节表示的磁盘空间数量。用这个选项设置比 space_left_action 更多的主动性动作,以防万一 space_left_action 没有让管理员释放任何磁盘空间。这个值应小于 space_left_action。如果达到这个水平,则会采取 admin_space_left_action 所指定的动作。
admin_space_left_action
当自由磁盘空间量达到 admin_space_left 指定的值时,则采取动作。有效值为 IGNORE、SYSLOG、EMAIL、SUSPEND、SINGLE 和 HALT。与这些值关联的动作与 space_left_action 中的相同。
disk_full_action
如果含有这个审计文件的分区已满,则采取这个动作。可能值为 IGNORE、SYSLOG、SUSPEND、SINGLE 和 HALT。与这些值关联的动作与 space_left _action 中的相同。
如果不循环审计日志文件,则含有/var/log/audit/的分区可能变满并引起系统错误。因此,建议让/var/log/audit/位于一个单独的专用分区。
disk_error_action
如果在写审计日志或循环日志文件时,检测到错误时采取的动作。其值必须是 IGNORE、SYSLOG、SUSPEND、SINGLE 和 HALT 之一。这些值的含义与 space_left_action 中的相同。
9.7.2 编写审计规则
要添加审计规则,可在/etc/audit/audit.rules 文件中使用下面的语法:
-a <list>,<action> <options>
●列表名(list)必须是下列名称之一
task
每个任务的列表。只有当创建任务时才使用。只有在创建时就已知的字段(比如 UID)才可以用在这个列表中。
entry
系统调用条目列表。当进入系统调用确定是否应创建审计时使用。
exit
系统调用退出列表。当退出系统调用以确定是否应创建审计时使用。
user
用户消息过滤器列表。内核在将用户空间事件传递给审计守护进程之前使用这个列表过滤用户空间事件。有效的字段只有 uid、auid、gid 和 pid。
exclude
事件类型排除过滤器列表。用于过滤管理员不想看到的事件。用 msgtype 字段指定您不想记录到日志中的消息。
●动作(action)必须下面的参数之一:
never
不生成审计记录。
always
分配审计上下文,总是把它填充在系统调用条目中,总是在系统调用退出时写一个审计记录。
●<options>可以包括下面几个选项中的一个或多个。
-S <syscall>
根据名称或数字指定一个系统调用,要指定所有系统调用,可使用 all 作为系统调用名称。如果程序使用了这个系统调用,则开始一个审计记录。可以为相同的规则指定多个系统调用,每个系统调用必须用-S 启动。在相同的规则中指定多个系统调用。
- F <name[=,!=,<,>,<=]value>
指定一个规则字段。如果为一个规则指定了多个字段,则只有所有字段都为真才能启动一个审计记录。每个规则都必须用-F 启动,最多可以指定 64 个规则。如果用用户名和组名作为字段,而不是用 UID 和 GID,则会将它们解析为 UID 和 GID 以进行匹配。下面是有效的字段名:
pid 进程 ID。
ppid 父进程的进程 ID。
uid 用户 ID。
euid 有效用户 ID。
suid 设置用户 ID。
fsuid 文件系统用户 ID。
gid 组 ID。
egid 有效组 ID。
sgid 设置组ID。
fsgid 文件系统组 ID。
auid 审计 ID,或者用户登录时使用的原始 ID。
msgtype 消息类型号。只应用在排除过滤器列表上。
pers OS Personality Number。
Arch 系统调用的处理器体系结构。指定精确的体系结构,比如 i686(可以通过 uname -m 命令检索)或者指定 b32 来使用 32 位系统调用表,或指定 b64 来使用 64 位系统调用表。
inode Inode Number。
exit 从系统调用中退出值。
success 系统调用的成功值。1 表是真/是,0 表示假/否。
a0,a1,a2,a3 分别表示系统调用的前 4 个参数。只能用数字值。
Key 设置用来标记事件的审计日志事件消息的过滤键。当添加观察器时,类似于使用-k 选项。
obj_user 资源的 SELinux 用户。
obj_role 资源的 SELinux 角色。
obj_type 资源的 SELinux 类型。
obj_lev_low 资源的 SELinux 低级别。
obj_lev_high 资源的 SELinux 高级别。
subj_role 程序的 SELinux 角色。
subj_type 程序的 SELinux 类型。
subj_sen 程序的 SELinux 敏感性。
subj_clr 程序的 SELinux 安全级别(clearance)。
-a 选项向列表末尾添加规则。要向列表开头添加规则,可用-A 替换-a。删除语法相同的规则,用-d 替换-a。要删除所有规则,可指定-D 选项。审计规则示例:
|
#Record all file opens from user 501
#Use with caution since this can quickly
#produce a large quantity of records
-a exit,always -S open -F uid=501 -F key=501open
#Record file permission changes
-a entry,always -S chmod
|
审计规则日志消息例子:
|
type=SYSCALL msg=audit(1168206647.422:5227): arch=c000003e
syscall=success=no exit=-2 a0=7fff37fc5a40 a1=0 a2=2aaaaaaab000 a3=0
items=1 ppid=26640 pid=2716 auid=501 uid=501 gid=501 euid=501 suid=501
fsuid=501 egid=501 sgid=501 fsgid=501 tty=pts5 comm="vim"
exe="/usr/bin/vim" key="501open"。 |
9.7.3 使用审计监控文件
CGSL 审计系统也允许管理员监控文件和目录。通过设置观察器在一个文件或目录上,可以监控文件和目录上发生的指定动作,如:打开、读写和执行。
示例如下:
/etc/security/
/etc/selinux/
/etc/bashrc
/etc/profile |
-w /etc/security -p wa -k ETC_SECURITY
-w /etc/selinux -p wa -k ETC_SELINUX
-w /etc/bashrc -p wa -k ETC_BASHRC
-w /etc/profile -p wa -k ETC_PROFILE |
其中,-w 表示观察(watch)的对象,即需要观察的文件或目录;-p 用于指定观察的动作,wa 表示观察“write”和“append”动作,即当被观察对象发生“write”和“append”动作时,记录相关的审计日志信息;-k用于指定本条规则的 key,利用该关键字可以过滤指定规则相关的审计日志信息。
设置好审计规则后,auditd 服务将根据设定的规则,对指定文件和目录进行监控,并将
相关的审计日志信息默认记录于/var/log/audit/audit.log 文件中,用户可以通过该日志文件查看相关的审计信息。由于记录的审计信息量比较大,也可以使用 ausearch 工具通过审计规则中设定的 key 来对审计信息进行过滤,获取用户需要的信息,如:如果需要查看/etc/selinux/目录相关的审计信息,可以使用如下命令来获取:
#ausearch -k ETC_SELINUX
审计观察器的示例日志如下:
|
time->Mon Dec 20 10:16:05 2010
type=CONFIG_CHANGE msg=audit(1292811365.978:24): auid=4294967295
op=add rule key="ETC_SELINUX" list=4 res=1 |
提示:如果在运行守护进程时通过修改配置文件/etc/audit/audit.rules 修改审计规则,则须要以根用户身份用 systemctl auditd restart 命令启用修改。