Linux auditd 服务

Linux 审计系统提供了一种方式来跟踪系统上与安全相关的信息。根据预配置的规则,审计会生成日志条目,来尽可能多地记录系统上所发生的事件的相关信息。对于关键任务环境而言至关重要,可用来确定安全策略的违反者及其所执行的操作。审计不会为您的系统提供额外的安全,而是用于发现系统上使用的安全策略的违规。可以通过其他安全措施(如 SELinux)进一步防止这些违规。 [1]

以下列表总结了审计可以在其日志文件中记录的一些信息:

  • 事件的日期、时间、类型和结果.
  • 主题和对象的敏感度标签。
  • 事件与触发事件的用户身份的关联。
  • 对审计配置的所有修改,以及对访问审计日志文件的尝试。
  • 所有身份验证机制的使用,如 SSH 和 Kerberos 等。
  • 对任何受信任数据库的修改,如 /etc/passwd。
  • 尝试将信息导入系统或从系统导出。
  • 根据用户身份、主题和对象标签以及其他属性包含或排除事件。

使用案例

  • 监视文件访问
    审计可以跟踪文件或目录是否已被访问、修改、执行或者文件的属性是否已改变。例如,这有助于检测对重要文件的访问,并在其中一个文件损坏时提供审计跟踪。
  • 监控系统调用
    可将审计配置为在每次使用特定系统调用时生成日志条目。例如,这可用于通过监控 settimeofdayclock_adjtime 和其他与时间相关的系统调用来跟踪对系统时间的修改。
  • 记录用户运行的命令
    审计可以跟踪文件是否已被执行,因此可以定义一个规则以记录每次特定命令的执行。例如,可以对 /bin 目录中的每个可执行文件定义一个规则。然后,可以按用户 ID 搜索生成的日志条目,以生成每个用户所执行的命令的审计跟踪。
  • 记录系统路径名称的执行
    除了观察在规则调用时将路径转换为 inode 的文件访问之外,审计现在还可以观察路径的执行,即使路径在规则调用中不存在,或者在规则调用后文件被替换了。这允许规则在升级程序可执行文件后或甚至在其安装之前继续运行。
  • 记录安全事件
    pam_faillock 认证模块能够记录失败的登录尝试。也可以将审计设置为记录失败的登录尝试,并提供有关试图登录的用户的附加信息。
  • 搜索事件
    审计提供了 ausearch 工具,可用于过滤日志条目,并根据多个条件提供完整的审计跟踪。
  • 运行总结报告
    aureport 实用程序可用于生成记录事件的日常报告等。然后,系统管理员可以分析这些报告,并进一步调查可疑的活动。
  • 监控网络访问
    iptablesebtables 工具可以配置为触发审计事件,允许系统管理员监控网络访问。

    系统性能可能会受到影响,具体取决于审计所收集的信息量。

审计系统架构

审计系统由两个主要部分组成: 用户空间应用程序和工具 ,以及 内核端系统调用处理 。内核组件接收用户空间应用程序的系统调用,并通过以下过滤器对其进行过滤: usertaskfstypeexit[1]

用户空间审计守护进程 从内核收集信息,并在日志文件中创建条目。其他审计用户空间工具审计守护进程内核审计组件审计日志文件 进行交互:

  • audisp - Audit 分配程序守护进程与 Audit 守护进程交互,并将事件发送到其他应用程序,以便进一步处理。此守护进程的目的是提供插件机制,以便实时分析程序可以与审计事件交互。
  • auditctl - 审计控制实用程序与内核审计组件交互,以管理规则并控制事件生成进程的多个设置和参数。
  • 其余的审计工具会将审计日志文件的内容作为输入,并根据用户的要求生成输出。例如,aureport 工具生成所有记录的事件的报告。

安装 audit 软件包

要使用审计系统,必须在系统中安装了 audit 软件包。audit 软件包(auditaudit-libs)默认安装在 Red Hat Enterprise Linux 7 中。如果您没有安装这些软件包,请以 root 用户身份执行以下命令来安装审计和依赖项:

yum install audit

Ubuntu 参考以下命令安装

apt install auditd

主要服务为 auditd.service

关键配置文件为 /etc/audit/auditd.conf

配置审计服务

Audit 守护进程可以在 /etc/audit/auditd.conf 文件中配置。此文件由 修改审计守护进程行为 的配置参数组成。哈希符号(#)后面的空行和文本将被忽略。详情请查看 auditd.conf(5) man page

auditd 常用配置参数说明

Parameter Descriptions Examples
log_file 审计日志全路径 log_file = /var/log/audit/audit.log
max_log_file 审计日志的最大大小,以 MB 为单位 max_log_file = 8
max_log_file_action 在达到 max_log_file 中设置的限制后,决定要采取什么操作,应设置为 keep_logs 以防止审计日志文件被覆盖。
- ignore : 忽略,什么也不做
- syslog : 向 syslog 发送一个告警信息
- suspend : 不再写入审计日志,进程依然运行
- rotate : 日志轮转(logs with higher numbers are older than logs with lower numbers
num_logs 如果 max_log_file_action 配置为 rotate,用于指定要保留的日志文件数量。 要设置为 2-999 才有效
space_left 指定磁盘上剩余的可用空间量,会触发 space_left_action 参数中设置的操作
- 如果 space_left 的值指定为整数,它将解释为绝对大小(MiB)。
- 果该值指定为 百分比(例如 5%),则审计守护进程会根据包含 log_file 的文件系统的大小计算绝对大小(以 MB 为单位)。
space_left = 75
space_left = 75%
space_left_action 建议参数设置为 emailexec。可选值包括:
- ignore
- syslog
- rotate
- Email : Email 帐号信息配置在 action_mail_acct
- exec : 执行脚本
- suspend
- singleauditd 服务会将系统设置为单用户模式
- haltauditd 服务会关闭操作系统
admin_space_left 指定触发 admin_space_left_action 参数中设置的操作的绝对最小可用空间量,必须将其设置为一个值,以便有足够的空间来记录管理员执行的操作。 此参数的数字值应小于 space_left 的数字值 。还可以设置为百分比(例如 1%),以便审计守护进程根据磁盘分区计算数值。
admin_space_left_action 应设置为 single 来将系统置于 单用户模式 ,并允许管理员释放一些磁盘空间。
disk_full_action 没有可用空间时触发的操作,必须设置为 haltsingle。当审计无法记录事件时,这可确保系统关闭或以单用户模式运行。
disk_error_action 指定当在包含审计日志文件的分区上检测到错误时触发的操作,必须设置为 syslogsinglehalt,具体取决于您处理硬件故障的本地安全策略。
flush 应设置为 incremental_async 。它与 freq 参数结合使用,该参数决定了在强制与硬盘进行硬盘同步前可以将多少条记录发送到磁盘。freq 参数应设置为 100。这些参数可确保审计事件数据与磁盘上的日志文件同步,同时保持良好的活动性能。

定义审计规则

可以通过以下方式设置审计规则:

  • 在命令行中使用 auditctl 工具。请注意, 这些规则在重启后不会保留
  • /etc/audit/audit.rules 文件中。

auditctl

auditctl 常见控制选项,可参考 auditctl -hman auditctl

选项 说明 示例
-b backlog 在内核中设置现有审计缓冲区的最大数量,默认值 64 auditctl -b 8192
-f [0..2] 在检测到关键错误(failure flag)时执行的操作,默认为 1。可选值: 0=silent1=printk2=panic
常见关键错误包括:
- backlog limit exceeded
- out of kernel memory
- rate limit exceeded
-e [0..2] 配置启动开关。
- When 0 is passed, this can be used to temporarily disable auditing.
- When 1 is passed as an argument, it will enable auditing.
- To lock the audit configuration so that it can’t be changed, pass a 2 as the argument.
Locking the configuration is intended to be the last command in audit.rules for anyone wishing this feature to be active. Any attempt to change the configuration in this mode will be audited and denied. The configuration can only be changed by rebooting the machine.
-r rate 设置每秒生成的消息率 messages/sec (0=none) 。默认为 0 。如果超过限制,内核将会根据 failure flag 采取对应的动作
-s 报告审计系统状态。会报告以下内容:
- 内核中参数 -e, -f, -r-b 的值
- PID(如果为 0 表示审计未启动)
- lost 的值表示内核审计队列溢出(kernel audit queue overflowing)导致丢失的事件数量
- backlog 的值表示处于队列中正在等待 auditd 读取的事件的数量。
auditctl -s -i 组合使用会将 auditctl -s 中显示的数值翻译为对应的字符值
-l 列出所有当前载入的审计规则
-D 删除所有的规则和监视(watch),也可以通过 -k 指定关键字
-m text 发送用户空间的消息到 auditd,消息类型为 USER 类型,可以用来测试 auditd

auditctl 定义审计规则常用选项,可参考 auditctl -hman auditctl

选项 说明 示例
-w path 针对 path 定义的文件系统对象添加一个 watch 规则。因为其内部实现是通过追踪文件的 inode,监控 / 或者使用通配符指定 path 是不支持的。
它可以用 -F path-F dir 来代替监控文件和目录,这个选项主要是为了向后兼容,推荐使用 -F 选项替代
-w 选项只能配合 -p-k 选项使用
-W path 删除针对 path 定义的文件系统对象的 watch 规则,要删除的规则必须和定义时的规则精确匹配
-p [rwxa] 权限 r=read, w=write, x=execute, a=attribute
-k key 可选的随即字符串,用于识别特定的规则

定义文件系统审计规则

要定义文件系统审计规则,请使用以下语法:

auditctl -w path_to_file -p permissions -k key_name

例如,要定义一条规则,记录对 /etc/passwd 文件的所有 访问以及 /etc/passwd 文件的每个属性,请执行以下命令:

auditctl -w /etc/passwd -p wa -k passwd_changes

检查审计日志,在添加审计规则时,审计日志会记录以下日志:

/var/log/audit/audit.log
type=CONFIG_CHANGE msg=audit(1729837815.559:368452): auid=1001 ses=48825 subj=kernel op=add_rule key="passwd_changes" list=4 res=1

加入此时删除系统上的某个用户,审计日志会记录以下内容:

/var/log/audit/audit.log
type=SYSCALL msg=audit(1729837888.712:368453): arch=c000003e syscall=2 success=yes exit=5 a0=55dc6b214ac0 a1=20902 a2=ffffff00 a3=8 items=1 ppid=29173 pid=18424 auid=1001 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=pts1 ses=48825 comm="userdel" exe="/usr/sbin/userdel" subj=kernel key="passwd_changes"
type=CWD msg=audit(1729837888.712:368453): cwd="/root"
type=PATH msg=audit(1729837888.712:368453): item=0 name="/etc/passwd" inode=106612 dev=103:01 mode=0100644 ouid=0 ogid=0 rdev=00:00 obj=unlabeled nametype=NORMAL cap_fp=0 cap_fi=0 cap_fe=0 cap_fver=0 cap_frootid=0
type=PROCTITLE msg=audit(1729837888.712:368453): proctitle=7573657264656C0063656E746F73
type=DEL_USER msg=audit(1729837888.713:368454): pid=18424 uid=0 auid=1001 ses=48825 subj=kernel msg='op=delete-user id=1000 exe="/usr/sbin/userdel" hostname=nginx_server addr=? terminal=pts/1 res=success'
type=USER_MGMT msg=audit(1729837888.713:368455): pid=18424 uid=0 auid=1001 ses=48825 subj=kernel msg='op=deleting-user-from-group grp="adm" id=1000 exe="/usr/sbin/userdel" hostname=nginx_server addr=? terminal=pts/1 res=success'
type=USER_MGMT msg=audit(1729837888.713:368456): pid=18424 uid=0 auid=1001 ses=48825 subj=kernel msg='op=deleting-user-from-group grp="systemd-journal" id=1000 exe="/usr/sbin/userdel" hostname=nginx_server addr=? terminal=pts/1 res=success'
type=DEL_GROUP msg=audit(1729837888.713:368457): pid=18424 uid=0 auid=1001 ses=48825 subj=kernel msg='op=delete-group grp="centos" acct="centos" exe="/usr/sbin/userdel" hostname=nginx_server addr=? terminal=pts/1 res=success'
type=GRP_MGMT msg=audit(1729837888.713:368458): pid=18424 uid=0 auid=1001 ses=48825 subj=kernel msg='op=delete-shadow-group grp="centos" acct="centos" exe="/usr/sbin/userdel" hostname=nginx_server addr=? terminal=pts/1 res=success'
type=USER_MGMT msg=audit(1729837888.713:368459): pid=18424 uid=0 auid=1001 ses=48825 subj=kernel msg='op=deleting-user-from-shadow-group grp="adm" id=1000 exe="/usr/sbin/userdel" hostname=nginx_server addr=? terminal=pts/1 res=success'
type=USER_MGMT msg=audit(1729837888.714:368460): pid=18424 uid=0 auid=1001 ses=48825 subj=kernel msg='op=deleting-user-from-shadow-group grp="systemd-journal" id=1000 exe="/usr/sbin/userdel" hostname=nginx_server addr=? terminal=pts/1 res=success'
type=SYSCALL msg=audit(1729837888.716:368461): arch=c000003e syscall=82 success=yes exit=0 a0=7fffce030120 a1=55dc6b214ac0 a2=7fffce030090 a3=2f6e6962732f3a78 items=5 ppid=29173 pid=18424 auid=1001 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=pts1 ses=48825 comm="userdel" exe="/usr/sbin/userdel" subj=kernel key="passwd_changes"
type=CWD msg=audit(1729837888.716:368461): cwd="/root"
type=PATH msg=audit(1729837888.716:368461): item=0 name="/etc/" inode=68 dev=103:01 mode=040755 ouid=0 ogid=0 rdev=00:00 obj=unlabeled nametype=PARENT cap_fp=0 cap_fi=0 cap_fe=0 cap_fver=0 cap_frootid=0
type=PATH msg=audit(1729837888.716:368461): item=1 name="/etc/" inode=68 dev=103:01 mode=040755 ouid=0 ogid=0 rdev=00:00 obj=unlabeled nametype=PARENT cap_fp=0 cap_fi=0 cap_fe=0 cap_fver=0 cap_frootid=0
type=PATH msg=audit(1729837888.716:368461): item=2 name="/etc/passwd+" inode=642300 dev=103:01 mode=0100644 ouid=0 ogid=0 rdev=00:00 obj=unlabeled nametype=DELETE cap_fp=0 cap_fi=0 cap_fe=0 cap_fver=0 cap_frootid=0
type=PATH msg=audit(1729837888.716:368461): item=3 name="/etc/passwd" inode=106612 dev=103:01 mode=0100644 ouid=0 ogid=0 rdev=00:00 obj=unlabeled nametype=DELETE cap_fp=0 cap_fi=0 cap_fe=0 cap_fver=0 cap_frootid=0
type=PATH msg=audit(1729837888.716:368461): item=4 name="/etc/passwd" inode=642300 dev=103:01 mode=0100644 ouid=0 ogid=0 rdev=00:00 obj=unlabeled nametype=CREATE cap_fp=0 cap_fi=0 cap_fe=0 cap_fver=0 cap_frootid=0
type=PROCTITLE msg=audit(1729837888.716:368461): proctitle=7573657264656C0063656E746F73

其中的很多原始内容不适合人类阅读和理解,为了方便人类阅读和理解,可以使用 ausearch -i 对其中的内容进行翻译 ,如以下输出中,会对上面示例中的内容如 proctitle=7573657264656C0063656E746F73 进行翻译

# ausearch -k passwd_changes -i
----
type=PROCTITLE msg=audit(10/25/2024 14:30:15.559:368452) : proctitle=auditctl -w /etc/passwd -p wa -k passwd_changes
type=SYSCALL msg=audit(10/25/2024 14:30:15.559:368452) : arch=x86_64 syscall=sendto success=yes exit=1084 a0=0x4 a1=0x7fff7ce41fa0 a2=0x43c a3=0x0 items=0 ppid=29173 pid=18303 auid=qqc uid=root gid=root euid=root suid=root fsuid=root egid=root sgid=root fsgid=root tty=pts1 ses=48825 comm=auditctl exe=/usr/sbin/auditctl subj=kernel key=(null)
type=CONFIG_CHANGE msg=audit(10/25/2024 14:30:15.559:368452) : auid=qqc ses=48825 subj=kernel op=add_rule key=passwd_changes list=exit res=yes
----
type=PROCTITLE msg=audit(10/25/2024 14:31:28.712:368453) : proctitle=userdel centos
type=PATH msg=audit(10/25/2024 14:31:28.712:368453) : item=0 name=/etc/passwd inode=106612 dev=103:01 mode=file,644 ouid=root ogid=root rdev=00:00 obj=unlabeled nametype=NORMAL cap_fp=none cap_fi=none cap_fe=0 cap_fver=0 cap_frootid=0
type=CWD msg=audit(10/25/2024 14:31:28.712:368453) : cwd=/root
type=SYSCALL msg=audit(10/25/2024 14:31:28.712:368453) : arch=x86_64 syscall=open success=yes exit=5 a0=0x55dc6b214ac0 a1=O_RDWR|O_NOCTTY|O_NONBLOCK|O_NOFOLLOW a2=0xffffff00 a3=0x8 items=1 ppid=29173 pid=18424 auid=qqc uid=root gid=root euid=root suid=root fsuid=root egid=root sgid=root fsgid=root tty=pts1 ses=48825 comm=userdel exe=/usr/sbin/userdel subj=kernel key=passwd_changes
----
type=PROCTITLE msg=audit(10/25/2024 14:31:28.716:368461) : proctitle=userdel centos
type=PATH msg=audit(10/25/2024 14:31:28.716:368461) : item=4 name=/etc/passwd inode=642300 dev=103:01 mode=file,644 ouid=root ogid=root rdev=00:00 obj=unlabeled nametype=CREATE cap_fp=none cap_fi=none cap_fe=0 cap_fver=0 cap_frootid=0
type=PATH msg=audit(10/25/2024 14:31:28.716:368461) : item=3 name=/etc/passwd inode=106612 dev=103:01 mode=file,644 ouid=root ogid=root rdev=00:00 obj=unlabeled nametype=DELETE cap_fp=none cap_fi=none cap_fe=0 cap_fver=0 cap_frootid=0
type=PATH msg=audit(10/25/2024 14:31:28.716:368461) : item=2 name=/etc/passwd+ inode=642300 dev=103:01 mode=file,644 ouid=root ogid=root rdev=00:00 obj=unlabeled nametype=DELETE cap_fp=none cap_fi=none cap_fe=0 cap_fver=0 cap_frootid=0
type=PATH msg=audit(10/25/2024 14:31:28.716:368461) : item=1 name=/etc/ inode=68 dev=103:01 mode=dir,755 ouid=root ogid=root rdev=00:00 obj=unlabeled nametype=PARENT cap_fp=none cap_fi=none cap_fe=0 cap_fver=0 cap_frootid=0
type=PATH msg=audit(10/25/2024 14:31:28.716:368461) : item=0 name=/etc/ inode=68 dev=103:01 mode=dir,755 ouid=root ogid=root rdev=00:00 obj=unlabeled nametype=PARENT cap_fp=none cap_fi=none cap_fe=0 cap_fver=0 cap_frootid=0
type=CWD msg=audit(10/25/2024 14:31:28.716:368461) : cwd=/root
type=SYSCALL msg=audit(10/25/2024 14:31:28.716:368461) : arch=x86_64 syscall=rename success=yes exit=0 a0=0x7fffce030120 a1=0x55dc6b214ac0 a2=0x7fffce030090 a3=0x2f6e6962732f3a78 items=5 ppid=29173 pid=18424 auid=qqc uid=root gid=root euid=root suid=root fsuid=root egid=root sgid=root fsgid=root tty=pts1 ses=48825 comm=userdel exe=/usr/sbin/userdel subj=kernel key=passwd_changes

审计日志内容分析参考

参考链接

第 7 章 系统审计

脚注