Loading

理解Linux Audit Service

一、概述

Linux audit通过分析系统上正在发生的细节信息,能够有效帮助您提高系统的安全。但是,它本身不提供额外的安全性保障----它不会保护你的系统免受代码故障或者任何类型的漏洞攻击。Audit服务对跟踪这些安全问题非常有用,并且有效帮助我们采取何种针对性的安全措施。

Audit由几个组件组成,每个组件都为整个框架提供重要功能。Linux audit(kauditd) 内核模块拦截系统调用并记录相关事件。 auditd守护进程将审计报告写入磁盘。各种命令行实用程序负责显示,查询和存档审计跟踪。

1. 将用户与进程关联

Audit将进程映射到启动它们的用户标识。这使得管理员或安全人员能够精确地跟踪哪个用户拥有哪个进程并且可能在系统上进行恶意操作。

2. 审查审计线索

Linux Audit 提供了将审计报告写入磁盘并将其转换为可读格式的工具。

3. 审查特定的审计事件

Audit提供了一个实用程序,允许您筛选特定感兴趣事件的审计报告。你可以根据下面的内容过滤:

  • User
  • Group
  • Audit ID
  • Remote Host Name
  • Remote Host Address
  • System Call
  • System Call Arguments
  • File
  • File Operations
  • Success or Failure

4. 应用选择性审计

Audit提供了筛选感兴趣事件的审计报告并调整审计以仅记录所选事件的手段。您可以创建自己的一组规则,并让审计守护进程仅记录您感兴趣的规则。

5. 保证报告数据的可用性

审计报告由root拥有,因此只能由root用户移除。未经授权的用户不能删除审计日志。

6. 防止审计数据丢失

如果内核内存不足,审计守护进程的积压被超过,或者超过了速率限制,审计可以触发系统关闭,以防止事件逃离审计的控制。此关闭将立即停止由审核内核组件触发的系统,而不会将最新日志同步到磁盘。默认配置是将警告记录到系统日志中,而不是挂起系统。

如果系统在记录时磁盘空间不足,则可以将审计系统配置为执行干净关闭。缺省配置指示审计守护程序在磁盘空间不足时停止记录。

二、Linux Audit Service 架构

​ (Linux Audit framwork)

(1)组件

1.auditd
审计守护进程负责将通过审计内核接口生成并由应用程序和系统活动触发的审计消息写入磁盘。审计守护进程启动的方式由systemd控制。审计系统功能(启动时)由/etc/audit/auditd.conf控制。

2.auditctl
auditctl实用程序控制审计系统。它控制审计界面的日志生成参数和内核设置,以及确定哪些事件被跟踪的规则集。

3. audit rules
文件/etc/audit/audit.rules包含一系列auditctl命令,它们在启动审计守护程序后立即在系统引导时加载。

4. aureport
aureport实用程序允许您从审核事件日志中创建自定义报告。这种报告生成可以很容易地编写脚本,输出可以被各种其他应用程序使用,例如,绘制这些结果。

5. ausearch
ausearch实用程序可以使用各种密钥或记录格式的其他特征在审计日志文件中搜索某些事件。

6.audispd
审计调度程序守护进程(audispd)可用于将事件通知转发给其他应用程序,而不是将它们写入审计日志中的磁盘(或除此之外)。

7.autrace
autrace实用程序以与strace类似的方式跟踪各个进程。 autrace的输出被记录到审计日志中。打印上次登录用户的列表,与上次类似。 aulast通过审计日志(或给定的审计日志文件)进行搜索,并根据审计日志中的时间范围显示所有用户登录和注销的列表。

8.aulastlog
为类似于lastlog的机器的所有用户打印上次登录。登录名称,端口和上次登录时间将被打印。

(2) Audit 进程的配置

Audit进程的配置文件是保存在/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 = 5
disp_qos = lossy
dispatcher = /sbin/audispd
name_format = NONE
##name = mydomain
max_log_file = 6
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
cp_client_max_idle = 0

1. log_file
审计日志文件的完整路径。如果您配置守护进程向除默认/var/log/audit/外的目录中写日志文件时,一定要修改它上面的文件权限,使得只有根用户有读、写和执行权限。所有其他用户都不能访问这个目录或这个目录中的日志文件。

2. log_format
写日志时要使用的格式。当设置为RAW时,数据会以从内核中检索到的格式写到日志文件中。当设置为NOLOG时,数据不会写到日志文件中,但是如果用dispatcher选项指定了一个,则数据仍然会发送到审计事件调度程序中。

3. priority_boost
审计应采用多少优先级推进守护进程。必须是非负数。0表示没有变化。

4. flush
多长时间向日志文件中写一次数据。值可以是NONE、INCREMENTAL、DATA和SYNC之一。如果设置为NONE,则不需要做特殊努力来将数据刷新到日志文件中。如果设置为INCREMENTAL,则用freq选项的值确定多长时间发生一次向磁盘的刷新。如果设置为DATA,则审计数据和日志文件一直是同步的。如果设置为SYNC,则每次写到日志文件时,数据和元数据是同步的。

5. freq
如果flush设置为INCREMETNAL,审计守护进程在写到日志文件中前从内核中接收的记录数。

6. num_logs
max_log_file_action设置为ROTATE时要保存的日志文件数目。必须是0~99之间的数。如果设置为小于2,则不会循环日志。如果递增了日志文件的数目,就可能有必要递增/etc/audit/audit.rules中的内核backlog设置值,以便留出日志循环的时间。如果没有设置num_logs值,它就默认为0,意味着从来不循环日志文件。

7. dispatcher
当启动这个守护进程时,由审计守护进程自动启动程序。所有守护进程都传递给这个程序。可以用它来进一步定制报表或者以与您的自定义分析程序兼容的不同格式产生它们。自定义程序的示例代码可以在/usr/share/doc/audit- /skeleton.c中找到。由于调度程序用根用户特权运行,因此使用这个选项时要极其小心。这个选项不是必需的。

8. disp_qos
控制调度程序与审计守护进程之间的通信类型。有效值为lossy和lossless。如果设置为lossy,若审计守护进程与调度程序之间的缓冲区已满 (缓冲区为128千字节),则发送给调度程序的引入事件会被丢弃。然而,只要log_format没有设置为nolog,事件就仍然会写到磁盘中。如果设置为lossless,则在向调度程序发送事件之前和将日志写到磁盘之前,调度程序会等待缓冲区有足够的空间。

9. max_log_file
以兆字节表示的最大日志文件容量。当达到这个容量时,会执行max_log_file _action指定的动作。

10. 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参数,因此不会删除日志文件。

11. space_left
以兆字节表示的磁盘空间数量。当达到这个水平时,会采取space_left_action参数中的动作。

12. 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,则系统会关闭。

13. action_mail_acct
负责维护审计守护进程和日志的管理员的电子邮件地址。如果地址没有主机名,则假定主机名为本地地址,比如root。必须安装sendmail并配置为向指定电子邮件地址发送电子邮件。

14. admin_space_left
以兆字节表示的磁盘空间数量。用这个选项设置比space_left_action更多的主动性动作,以防万一space_left_action没有让管理员释放任何磁盘空间。这个值应小于space_left_action。如果达到这个水平,则会采取admin_space_left_action所指定的动作。

15. admin_space_left_action
当自由磁盘空间量达到admin_space_left指定的值时,则采取动作。有效值为IGNORE、SYSLOG、EMAIL、SUSPEND、SINGLE和HALT。与这些值关联的动作与space_left_action中的相同。

16. disk_full_action
如果含有这个审计文件的分区已满,则采取这个动作。可能值为IGNORE、SYSLOG、SUSPEND、SINGLE和HALT。与这些值关联的动作与space_left_action中的相同。
提示:
如果不循环审计日志文件,则含有/var/log/audit/的分区可能变满并引起系统错误。因此,建议让/var/log/audit/位于一个单独的专用分区。

17. disk_error_action
如果在写审计日志或循环日志文件时检测到错误时采取的动作。值必须是IGNORE、SYSLOG、SUSPEND、SINGLE和HALT之一。与这些值关的动作与space_left_action中的相同。
/etc/sysconfig/auditd文件可以用来设置带EXTRAOPTIONS参数的auditd的命令行选项。唯一的命令行选项-f以调试模式安排守护进程。如果启用了调试模式,则会出现标准错误消息而不是日志文件。AUDITD_LANG设置值可以用来修改守护进程的位置。如果设置为 none,则所有位置信息会从审计环境中删除。如果AUDITD_CLEAN _STOP选项设置为yes,则当用service auditd stop命令停止守护进程时,会删除审计规则与观察器。

18. tcp_listen_port
指定Audit进程监听的端口区间(1~65535)

19. tcp_listen_queue
设置暂时挂起连接的最大值,不要设置太小的值,因为在某些情况下,例如断电后,挂起连接的数量可能会很高。

20. tcp_client_ports
设置允许的客户端端口号范围。

21. tcp_client_max_idle
指定客户端最大挂起次数在一定的时间内。

22. tcp_max_per_addr
表示允许来自一个IP地址的并发连接数的数值。

(3)Audit系统的控制命令

1. auditctl
“auditctl -e” 控制Audit功能的开关
“auditctl -f” 设置错误级别[0..2] 0=silent, 1=printk, 2=panic
“auditctl -r” 控制Audit消息的速率
“auditctl -b” 设置Audit服务的最大缓存空间,如果缓存空间满了,指定的错误级别动作会被触发。
“auditctl -s” 查看Audit进程当前的状态
AUDIT_STATUS: enabled=1 flag=2 pid=3105 rate_limit=0 backlog_limit=8192 lost=0(丢失的Audit消息数) backlog=0(未输出的Audit缓冲区大小)

2. audit rules
要添加审计规则,可在/etc/audit/audit.rules文件中用下面的语法:
-a ,

audit rule 规则定义在auditctl(8)中。

如:
添加一条audit规则,记录maj用户的所用open系统调用
#auditctl-a entry,always -S open -F uid=500
open表示:要查看某一特定用户打开的文件
在另一个终端以maj用户登录,登录后执行一个ls命令即可

删除这条audit规则
#auditctl-d entry,always -S open -F uid=500

如不想看到用户登陆类型的消息,可以如下添加规则:
#auditctl -a exclude,always -F msgtype=USER_LOGIN
这里过滤是以“消息类型”为对象的。

监视/etc/passwd文件被读、写、执行、修改文件属性的操作记录
#auditctl -w /etc/passwd -p rwax

查看程序所有的系统调用
#auditctl -a entry,always-S all -F pid=1005

查看指定用户打开的文件
#auditctl -a exit,always-S open -F auid=510

查看不成功的open系统调用
auditctl-a exit,always -S open -F success!=0

(4) Audit log

type=SYSCALL msg=audit(1234874638.599:5207): arch=c000003e syscall=2 success=yes exit=4 a0=62fb60 a1=0 a2=31 a3=0 items=1 ppid=25400 pid
=25616 auid=0 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=pts1 ses=1164 comm="less" exe="/usr/bin/less" key="doc_log"
type=CWD msg=audit(1234874638.599:5207):  cwd="/root"
type=PATH msg=audit(1234874638.599:5207): item=0 name="/var/log/audit/audit.log" inode=1219041 dev=08:06 mode=0100644 ouid=0 ogid=0 rdev=00:00

type: audit消息类型, 消息类型有100多种,可以查看https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/6/html/security_guide/sec-audit_record_types
msg: 消息的ID, 它有两个部分组成, 分号之前的是Unix的时间戳,分号之后的是真正的event ID, 同一个应用程序的相同system call拥有相同的event ID, 同一个应用的不同system call则不同。
arch: 调用system call的CPU构架, 可以通过ausearch -i来指定搜索相关的log。
syscall: system call的类型, 可以查看https://github.com/torvalds/linux/blob/master/arch/sh/include/asm/unistd.h。
success: system call是成功或者失败。
exit: system call的返回值。
a0 to a3: 系统调用的前四个参数的数字化,可以通过ausearch解码查看。
items: 传递到应用程序的字符串数量。
ppid: 父进程的PID。
pid: 该进程的PID。
auid: audit ID, 针对某一用户一个进程会被分配一个audit ID, 该audit ID会被传递给子进程,尽管在系统中用户切换,该audit ID将始终保持一致。 这样我们可以针对对某一用户进行trace。
uid: user ID。
gid: group ID。
euid, suid, fsuid: Effective user ID, set user ID, and file system user ID.
egid, sgid, fsgid: Effective group ID, set group ID, and file system group ID.
tty: 应用程序开启的终端,这种情况下pseudo-terminal used in an SSH session.
ses: 用户登录的session ID.
comm: 出现在任务列表中,应用程序的名称。
exe: 二进制程序的解析路径。
subj: 进程执行时selinux上下文
key: 如果audit了很多的目录文件,分配一个key string方便后面我们通过ausearch去过滤这类log。
cwd: 进程的执行目录.
另一种audit log格式:
inode: 指出了与文件或目录相对应的inode number,可以通过下面的命令查看inode对应的文件或目录:find/ -inum -print.
dev: 指出文件或目录对应的device ID,在例子中,对应/dev/fd/0这个设备.
mode: 对应文件或目录的权限,这里0100600被解析为-rw-------.
ouid: 对应文件的owner’s user ID.
ogid: 对应文件的owner’s group ID.、

转:https://www.cnblogs.com/liquan2005/p/9226116.html

posted @ 2022-01-24 09:28  五月的麦田  阅读(1002)  评论(0编辑  收藏  举报