我想使用Auditd记录所有用户的命令输入记录,但是我失败了,我仍然不知道怎么方便查看Auditd的具体命令记录。
比如我执行了:
cat /var/log/audit/audit.log
我只能查到类似如下的记录:
虽然有执行的工作路径、可执行文件名,也有参数,但并不是很直观,对吧 - -
文章目录
Ubuntu 20.04 Auditd使用教程
Auditd是Linux下的审计守护进程,用于记录系统中发生的所有事件(如文件访问,网络请求,命令执行等)。在Ubuntu 20.04上使用Auditd可以帮助管理员追踪与安全、合规性和操作行为相关的活动。
安装Auditd
首先需要在Ubuntu 20.04上安装Auditd。运行以下命令以通过apt-get包管理器进行安装:
sudo apt-get update
sudo apt-get install auditd audispd-plugins
这将会自动安装Auditd服务并启动它。
配置Auditd
安装完毕后,可以对Auditd进行配置以适应特定的环境。主要的配置文件位于/etc/audit/auditd.conf
。
sudo vi /etc/audit/auditd.conf
这个文件包含了很多选项,如:
log_file
:此参数定义了日志文件的路径。log_format
:定义了日志文件的格式。flush
:此参数控制了 auditd 如何将数据从内存缓冲区写入到磁盘。max_log_file
:此参数设定了每个审计日志文件的最大尺寸。max_log_file_action
:此参数决定了当审计日志文件达到最大尺寸时系统将采取何种行动。
修改这些参数以满足特定的需求,然后保存并退出编辑器。重新启动Auditd服务以使新的配置生效:
sudo systemctl restart auditd
关于配置文件/etc/audit/auditd.conf
原始文件
(下面是我ubuntu20.04 x86虚拟机安装的auditd.conf原始文件)
#
# This file controls the configuration of the audit daemon
#
local_events = yes
write_logs = yes
log_file = /var/log/audit/audit.log
log_group = adm
log_format = RAW
flush = INCREMENTAL_ASYNC
freq = 50
max_log_file = 8
num_logs = 5
priority_boost = 4
disp_qos = lossy
dispatcher = /sbin/audispd
name_format = NONE
##name = mydomain
max_log_file_action = ROTATE
space_left = 75
space_left_action = SYSLOG
verify_email = yes
action_mail_acct = root
admin_space_left = 50
admin_space_left_action = SUSPEND
disk_full_action = SUSPEND
disk_error_action = SUSPEND
use_libwrap = yes
##tcp_listen_port = 60
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
distribute_network = no
字段解释
这是 auditd.conf
配置文件中的各个参数的解释:
-
local_events = yes
:定义是否记录本地事件。 -
write_logs = yes
:决定是否写入审计日志。 -
log_file = /var/log/audit/audit.log
:定义日志文件的位置。 -
log_group = adm
:定义写入日志文件的组名。 -
log_format = RAW
:定义日志文件的格式。可以是RAW或者NOLOG。 -
flush = INCREMENTAL_ASYNC
:定义auditd如何将数据从内存缓冲区刷新到磁盘。 -
freq = 50
:与flush
参数一起使用,表示在达到此数量的未刷新记录时触发刷新操作。 -
max_log_file = 8
:定义每个日志文件的最大大小(以MB为单位)。 -
num_logs = 5
:定义要保留的日志文件数量。 -
priority_boost = 4
:定义在日志事件到达时auditd进程的优先级提升值。 -
disp_qos = lossy
:定义分发器的质量等级。 -
dispatcher = /sbin/audispd
:定义审计分发器的路径。 -
name_format = NONE
:定义机器名的格式。 -
max_log_file_action = ROTATE
:定义当日志文件达到最大大小时执行的动作。 -
space_left = 75
:定义在剩余指定的磁盘空间(以MB为单位)时执行动作。 -
space_left_action = SYSLOG
:定义在达到space_left
参数指定的空间时执行的动作。 -
verify_email = yes
:决定是否验证电子邮件地址。 -
action_mail_acct = root
:定义接收报警的电子邮件账户。 -
admin_space_left = 50
:定义管理员在剩余指定的磁盘空间(以MB为单位)时收到通知。 -
admin_space_left_action = SUSPEND
:定义在达到admin_space_left
参数指定的空间时执行的动作。 -
disk_full_action = SUSPEND
:定义在磁盘满时执行的动作。 -
disk_error_action = SUSPEND
:定义在发生磁盘错误时执行的动作。 -
use_libwrap = yes
:决定是否使用TCP包装库。 -
tcp_listen_queue = 5
:定义TCP侦听队列的大小。 -
tcp_max_per_addr = 1
:定义每个地址可以有多少个连接。 -
tcp_client_max_idle = 0
:定义客户端空闲超时时间。 -
enable_krb5 = no
:定义是否启用kerberos认证。 -
krb5_principal = auditd
:定义kerberos服务主体的名称。 -
distribute_network = no
:定义是否分发网络审计数据。
请注意,这些参数可能会根据你所使用的 auditd
版本和配置有所不同。如果需要详细信息或特定参数的解释,你应该查阅你所使用的系统版本的 auditd
手册页。
审计规则
Auditd使用审计规则来决定哪些事件需要被记录。这些规则通常保存在/etc/audit/rules.d/
目录下。
创建一个新的规则文件:
sudo vi /etc/audit/rules.d/audit.rules
在这个文件中可以添加各种规则,例如,如果想要记录所有对/etc/passwd
文件的更改,可以添加以下规则:
-w /etc/passwd -p wa -k passwd_changes
保存并退出编辑器后,重新启动Auditd服务以使新的规则生效:
sudo systemctl restart auditd
查看审计日志
审计日志文件默认位于/var/log/audit/audit.log
。运行以下命令查看此日志文件:
sudo less /var/log/audit/audit.log
也可以使用ausearch工具搜索审计日志:
sudo ausearch -k passwd_changes
这将返回所有与关键词"passwd_changes"相关的事件。
疑难技术点解析
1. 如何持久化审计规则? (注意持久化审计规则不是持久化日志存储,如何持久化日志存储我会在后面的示例中讲解)
对于上述定义的审计规则,一旦重启系统就会失效。要想让审计规则永久生效,必须使用-w
选项把它们写入到/etc/audit/rules.d/audit.rules
文件中,然后执行sudo augenrules
命令生成一个新的/etc/audit/audit.rules
文件。只有在/etc/audit/audit.rules
中的规则才会在系统启动时自动加载。
2. 如何处理大量审计日志?
如果Auditd生成了大量的日志,可能需要定期对其进行清理以避免占满硬盘空间。可以通过logrotate工具或者在auditd.conf
中设置适当的max_log_file
和max_log_file_action
参数来实现自动清理。
示例:使用Auditd监控所有用户命令输入记录,包括常用命令、运行脚本、pip安装、apt安装等(不搭配logrotate)
配置Auditd监控
如果你想监控所有用户的命令输入记录,包括常用命令、运行脚本、pip 安装、apt 安装等,那么最有效的方法是通过监控 execve
系统调用。无论用户执行什么样的命令或者启动什么样的程序,都会涉及到 execve
系统调用。
以下是如何设置 Auditd 规则来完成这个任务:
1. 确保已经安装 auditd 和 audispd-plugins
如果还没有安装,可以使用包管理器来安装它们。
例如,在基于 Debian 的系统上,可以使用 apt-get:
sudo apt-get install auditd audispd-plugins
2. 创建一个新的审计规则文件或者编辑现有的审计规则文件
你可以将此文件放在 /etc/audit/rules.d/
目录中。例如,创建一个名为 audit.rules
的文件:
sudo vi /etc/audit/rules.d/audit.rules
3. 在该文件中,添加以下行以便监控所有 execve
系统调用
-a always,exit -F arch=b64 -S execve -k execve_tracking
-a always,exit -F arch=b32 -S execve -k execve_tracking
这两条命令是用于配置Linux的审计系统(auditd)的规则,用以跟踪系统中所有尝试执行新程序的活动。
1.-a always,exit
:这表示该规则在系统调用结束时总是会被触发。
2.-F arch=b64
或-F arch=b32
:这是一个字段,指定了要审计的架构类型。b64 表示64位架构,而b32 表示32位架构。这两个规则分别覆盖了64位和32位的系统调用。
3.-S execve
:这是一个系统调用列表,只有这里列出的系统调用才会被审计。在这种情况下,我们只关注execve
系统调用,它通常在启动新进程时使用。
4.-k execve_tracking
:这是一个“关键字”标志,允许你将特定的事件或一组事件与关键字关联起来。在生成的审计日志中,可以通过这个关键字快速查找相关事件。
总的来说,这两条命令将监控并记录所有在32位和64位架构上尝试执行新程序(使用execve
系统调用)的操作,并将这些记录与关键字execve_tracking
关联,方便以后查找。
每当有用户尝试执行任何命令时(包括但不限于常用命令、运行脚本、pip 安装、apt 安装等),auditd 都会记录这个行为。
4. 保存并关闭文件,然后重启 auditd 服务以应用新的规则,如果想要永久生效,还需执行augenrules命令(持久化审计规则)
sudo service auditd restart
如果想要永久生效,还需执行augenrules命令合并规则到 /etc/audit/audit.rules 文件中,以使得重启时能够被加载:
sudo augenrules
不过我实际操作的时候,执行augenrules
提示/usr/sbin/augenrules: No change
,是不是执行service auditd restart
就能合并规则了,不用执行augenrules
命令?
5. 现在,每次用户执行命令时,auditd 就会生成一个日志条目。可以使用 ausearch
命令来查看这些条目
sudo ausearch -k execve_tracking
看不怎么懂啊,这是我刚刚执行过的命令?
6. 如果想要更详细的报告,你可以使用 aureport
命令
sudo aureport -i -x --start today
这也看不出啥啊?
注意,Auditd 的配置可能会根据你的特定需求和 Linux 发行版有所不同。始终确保按照适用于你的系统的最佳实践进行操作。同时,监控所有 execve
系统调用可能会产生大量的日志数据,因此在启用这些规则时,需要考虑存储和日志管理的问题。
配置日志持久化存储和自动清理
Auditd的配置文件 /etc/audit/auditd.conf
提供了多个选项来设置审计日志的持久化存储和自动清理。
持久化存储
在 auditd.conf
文件中,可以设置 log_file
参数指定日志文件的路径,并通过 flush
参数控制如何写入日志数据。例如:
log_file = /var/log/audit/audit.log
flush = INCREMENTAL_ASYNC
max_log_file_action = ROTATE
max_log_file = 1
num_logs = 2
这些设置将会把日志文件保存在 /var/log/audit/audit.log
,并使用异步增量方式写入数据。
(我把日志最大容量max_log_file设置为1MB,最大日志轮转数量num_logs设置2,方便我测试,测试没问题,再改为合适值)
同样,修改完后执行下面命令重启服务以使得配置生效:
sudo service auditd restart
关于log_file参数
在Auditd的配置中,log_file
参数是必需的。这个参数用于指定 Auditd 日志文件的存储路径。如果没有设置这个参数,Auditd 将无法正常启动。
在默认情况下,大多数 Linux 发行版的 /etc/audit/auditd.conf
配置文件已经预设了 log_file
参数,通常它被设置为 /var/log/audit/audit.log
。所以,即使你没有显式地指定 log_file
参数,Auditd 通常也会将日志写入到默认的路径。
然而,为了保证系统的稳定性和避免可能的错误,最佳实践是在配置文件中明确地指定 log_file
参数。这样,你就可以确保 Auditd 能够找到正确的路径并成功写入日志。
关于flush参数(控制 auditd 如何将数据从内存缓冲区写入到磁盘)
关于 flush
参数,它控制了 auditd 如何将数据从内存缓冲区写入到磁盘。以下是可用的选项:
-
none
:这意味着 auditd 不会主动刷新缓冲区。相反,它依赖于 Linux 的 pdflush 机制。注意,这可能导致在系统崩溃时丢失一些数据。 -
incremental
:这意味着 auditd 会周期性地(由freq
参数控制)刷新缓冲区。 -
data
:这意味着每次有事件被记录时,auditd 都会刷新缓冲区。这可以最大程度地减少在系统崩溃时丢失数据的风险,但会增加 I/O 负载。 -
sync
:这与data
类似,但更进一步。每次有事件被记录时,auditd 都会确保数据已经被物理写入到磁盘。这提供了最高级别的数据保护,但也会对性能产生显著影响。 -
incremental_async
:这是一种折中的方法,它结合了incremental
和data
的特点。auditd 会周期性地刷新缓冲区,但如果在两次刷新之间有太多的事件被记录(由flush_threshold
参数控制),它会立即刷新缓冲区。
自动清理旧日志
按照以上配置后,日志大小超过max_log_file会自动轮转并按照num_logs参数清理。
(弃用)示例:使用Auditd监控所有用户命令输入记录,包括常用命令、运行脚本、pip安装、apt安装等(需搭配logrotate)
配置Auditd监控
如果你想监控所有用户的命令输入记录,包括常用命令、运行脚本、pip 安装、apt 安装等,那么最有效的方法是通过监控 execve
系统调用。无论用户执行什么样的命令或者启动什么样的程序,都会涉及到 execve
系统调用。
以下是如何设置 Auditd 规则来完成这个任务:
1. 确保已经安装 auditd 和 audispd-plugins
如果还没有安装,可以使用包管理器来安装它们。
例如,在基于 Debian 的系统上,可以使用 apt-get:
sudo apt-get install auditd audispd-plugins
2. 创建一个新的审计规则文件或者编辑现有的审计规则文件
你可以将此文件放在 /etc/audit/rules.d/
目录中。例如,创建一个名为 audit.rules
的文件:
sudo vi /etc/audit/rules.d/audit.rules
3. 在该文件中,添加以下行以便监控所有 execve
系统调用
-a always,exit -F arch=b64 -S execve -k execve_tracking
-a always,exit -F arch=b32 -S execve -k execve_tracking
这两条命令是用于配置Linux的审计系统(auditd)的规则,用以跟踪系统中所有尝试执行新程序的活动。
1.-a always,exit
:这表示该规则在系统调用结束时总是会被触发。
2.-F arch=b64
或-F arch=b32
:这是一个字段,指定了要审计的架构类型。b64 表示64位架构,而b32 表示32位架构。这两个规则分别覆盖了64位和32位的系统调用。
3.-S execve
:这是一个系统调用列表,只有这里列出的系统调用才会被审计。在这种情况下,我们只关注execve
系统调用,它通常在启动新进程时使用。
4.-k execve_tracking
:这是一个“关键字”标志,允许你将特定的事件或一组事件与关键字关联起来。在生成的审计日志中,可以通过这个关键字快速查找相关事件。
总的来说,这两条命令将监控并记录所有在32位和64位架构上尝试执行新程序(使用execve
系统调用)的操作,并将这些记录与关键字execve_tracking
关联,方便以后查找。
每当有用户尝试执行任何命令时(包括但不限于常用命令、运行脚本、pip 安装、apt 安装等),auditd 都会记录这个行为。
4. 保存并关闭文件,然后重启 auditd 服务以应用新的规则,如果想要永久生效,还需执行augenrules命令(持久化审计规则)
sudo service auditd restart
如果想要永久生效,还需执行augenrules命令合并规则到 /etc/audit/audit.rules 文件中,以使得重启时能够被加载:
sudo augenrules
5. 现在,每次用户执行命令时,auditd 就会生成一个日志条目。可以使用 ausearch
命令来查看这些条目
sudo ausearch -k execve_tracking
6. 如果想要更详细的报告,你可以使用 aureport
命令
sudo aureport -i -x --start today
注意,Auditd 的配置可能会根据你的特定需求和 Linux 发行版有所不同。始终确保按照适用于你的系统的最佳实践进行操作。同时,监控所有 execve
系统调用可能会产生大量的日志数据,因此在启用这些规则时,需要考虑存储和日志管理的问题。
配置日志持久化存储和自动清理
Auditd的配置文件 /etc/audit/auditd.conf
提供了多个选项来设置审计日志的持久化存储和自动清理。
持久化存储
在 auditd.conf
文件中,可以设置 log_file
参数指定日志文件的路径,并通过 flush
参数控制如何写入日志数据。例如:
log_file = /var/log/audit/audit.log
flush = INCREMENTAL_ASYNC
这些设置将会把日志文件保存在 /var/log/audit/audit.log
,并使用异步增量方式写入数据。
关于log_file参数
在Auditd的配置中,log_file
参数是必需的。这个参数用于指定 Auditd 日志文件的存储路径。如果没有设置这个参数,Auditd 将无法正常启动。
在默认情况下,大多数 Linux 发行版的 /etc/audit/auditd.conf
配置文件已经预设了 log_file
参数,通常它被设置为 /var/log/audit/audit.log
。所以,即使你没有显式地指定 log_file
参数,Auditd 通常也会将日志写入到默认的路径。
然而,为了保证系统的稳定性和避免可能的错误,最佳实践是在配置文件中明确地指定 log_file
参数。这样,你就可以确保 Auditd 能够找到正确的路径并成功写入日志。
关于flush参数(控制 auditd 如何将数据从内存缓冲区写入到磁盘)
关于 flush
参数,它控制了 auditd 如何将数据从内存缓冲区写入到磁盘。以下是可用的选项:
-
none
:这意味着 auditd 不会主动刷新缓冲区。相反,它依赖于 Linux 的 pdflush 机制。注意,这可能导致在系统崩溃时丢失一些数据。 -
incremental
:这意味着 auditd 会周期性地(由freq
参数控制)刷新缓冲区。 -
data
:这意味着每次有事件被记录时,auditd 都会刷新缓冲区。这可以最大程度地减少在系统崩溃时丢失数据的风险,但会增加 I/O 负载。 -
sync
:这与data
类似,但更进一步。每次有事件被记录时,auditd 都会确保数据已经被物理写入到磁盘。这提供了最高级别的数据保护,但也会对性能产生显著影响。 -
incremental_async
:这是一种折中的方法,它结合了incremental
和data
的特点。auditd 会周期性地刷新缓冲区,但如果在两次刷新之间有太多的事件被记录(由flush_threshold
参数控制),它会立即刷新缓冲区。
自动清理旧日志(需搭配logrotate)
auditd.conf
文件还提供了两个参数用于控制当日志文件达到一定大小时如何处理:max_log_file
和 max_log_file_action
。
-
max_log_file
用于设置每个日志文件的最大大小(单位为MB)。例如,如果你想让每个日志文件不超过100MB,你可以这样设置:max_log_file = 100
-
max_log_file_action
用于设置当日志文件达到最大大小时采取什么行动。可选的行动有IGNORE
(忽略)、SYSLOG
(通过 syslog 发出警告)、SUSPEND
(暂停审计)以及ROTATE
(轮转日志文件)。例如,如果你想在日志文件满时自动轮转文件,你可以这样设置:max_log_file_action = ROTATE
这样,当 audit.log
文件达到100MB时,auditd 将会自动轮转日志文件。即将当前的 audit.log
文件重命名为 audit.log.1
,然后创建一个新的 audit.log
文件继续写入。旧的日志文件可以根据需要手动删除,或者通过其他工具(如 logrotate)进行自动清理。
请注意,所有这些设置都需要重新启动 auditd 服务才能生效:
sudo systemctl restart auditd
另外,值得注意的是,日志文件可能包含敏感信息,因此应确保它们的安全存储,并只允许授权用户访问。
其他疑问
关于为何添加规则后,需要执行augenrules命令
当将规则添加到 /etc/audit/rules.d/audit.rules
文件中并保存时,这些规则已经被写入到了文件系统中。然而,要使这些规则在系统启动时自动加载,还需要执行 augenrules
命令。
augenrules
是一个工具,它会遍历 /etc/audit/rules.d/
目录下的所有 .rules
文件(包括你修改的 audit.rules
文件),并合并这些文件中的规则到 /etc/audit/audit.rules
文件中。auditd
服务在启动时,会读取 /etc/audit/audit.rules
文件中的规则。
因此,即使已经在 /etc/audit/rules.d/audit.rules
文件中保存了规则,如果没有执行 augenrules
命令,那么在系统重启后,auditd
服务可能无法加载到这些新添加的规则,因为它们没有被合并到 /etc/audit/audit.rules
文件中。
关于直接执行 service auditd restart
,它只对当前运行的系统有效。也就是说,如果你修改了 /etc/audit/rules.d/audit.rules
文件并重启了 auditd
服务,那么新添加的规则会立即生效。然而,如果你在未执行 augenrules
的情况下重启了系统,那么新添加的规则可能无法生效,因为它们没有被合并到 /etc/audit/audit.rules
文件中。(这个机制,或许是为了方便测试的)