默认情况下,Linux 不记录用户的每一步操作到系统级别的日志文件中。 但是,Linux 确实记录了一些与用户操作相关的信息,并且提供了多种方法来开启更详细的用户操作记录,以满足安全审计或故障排除的需求。
一、Linux 默认记录的信息:
- 用户登录和退出信息: Linux 会记录用户的登录 (login) 和退出 (logout) 事件。这些信息通常被记录在
/var/log/wtmp
和/var/log/btmp
文件中。你可以使用last
命令查看用户的登录历史,使用lastb
命令查看错误的登录尝试。 - 系统日志 (syslog 或 rsyslog): 系统的各种事件,包括一些与用户相关的事件,会被记录到系统日志中。日志文件位置和配置取决于 Linux 发行版和 syslog 服务配置(例如
/var/log/syslog
,/var/log/messages
,/var/log/auth.log
等)。然而,这些系统日志通常不包含用户执行的每一条命令的具体内容。 - Shell 历史记录: 大多数 Linux 发行版默认使用 Bash shell。Bash 会为每个用户维护一个命令历史记录文件,通常是用户家目录下的
.bash_history
文件。这个文件记录了用户在当前 shell 会话以及之前的 shell 会话中执行过的命令。但是,.bash_history
有以下局限性,使其不适合作为正式的安全审计日志:- 用户可修改: 用户可以编辑、删除或禁用
.bash_history
文件,甚至可以设置不记录命令历史。 - 非实时记录: 命令通常在 shell 会话结束时才写入
.bash_history
文件,并非实时记录。 - 非系统级别:
.bash_history
是用户级别的,不是系统级别的统一日志。 - 只记录命令,不记录执行结果: 只记录用户输入的命令,不记录命令执行的输出和详细过程。
- 用户可修改: 用户可以编辑、删除或禁用
二、如何开启用户操作记录(命令审计):
如果你需要记录用户的每步操作,特别是执行的命令,以便进行安全审计、追踪问题或满足合规性要求,可以采用以下方法开启更详细的命令记录:
1、使用 auditd
(Linux Audit System):
auditd
是 Linux 内核提供的强大的审计系统,可以监控和记录系统上发生的各种事件,包括用户执行的命令。它非常灵活和可配置,是企业环境中常用的审计工具。
1.安装 auditd
:
在大多数发行版上,可以使用包管理器安装 auditd
:
sudo apt-get update # Debian/Ubuntu
sudo apt-get install auditd
sudo yum update # CentOS/RHEL/Fedora
sudo yum install auditd
sudo dnf update # Fedora/CentOS 8+
sudo dnf install auditd
sudo zypper refresh # openSUSE
sudo zypper install auditd
2. 启动 auditd
服务:
sudo systemctl start auditd
sudo systemctl enable auditd # 设置开机启动
3.配置审计规则以记录命令执行:
auditd
通过规则来定义需要审计的事件。要记录用户执行的命令,可以添加以下规则。 可以使用 auditctl
命令动态添加规则,或者编辑规则配置文件 (通常是 /etc/audit/audit.rules
)。
使用 auditctl
动态添加规则(临时生效,重启失效):
sudo auditctl -w /usr/bin/bash -p x -k command_exec
sudo auditctl -w /usr/bin/sh -p x -k command_exec
sudo auditctl -w /usr/bin/sudo -p x -k command_exec
sudo auditctl -a always,exit -S execve -k command_exec
-w /usr/bin/bash -p x -k command_exec
:监控/usr/bin/bash
(Bash shell 可执行文件) 的x
(execute) 权限的访问,并标记为command_exec
关键字。 类似地,也监控了/usr/bin/sh
和/usr/bin/sudo
。-a always,exit -S execve -k command_exec
:这是一个更通用的规则,它审计所有execve
系统调用 (用于执行程序)。always,exit
表示总是审计,在系统调用退出时审计。-S execve
指定审计execve
系统调用。-k command_exec
同样是关键字标记。
将规则添加到 /etc/audit/audit.rules
(永久生效):
为了使规则永久生效,需要编辑 /etc/audit/audit.rules
文件,将上述规则添加到文件中。 例如,在文件末尾添加:
-w /usr/bin/bash -p x -k command_exec
-w /usr/bin/sh -p x -k command_exec
-w /usr/bin/sudo -p x -k command_exec
-a always,exit -S execve -k command_exec
然后重启 auditd
服务以使规则生效:
sudo systemctl restart auditd
4.查看审计日志:
auditd
的日志通常保存在 /var/log/audit/audit.log
文件中。 可以使用 ausearch
和 aureport
命令来搜索和分析审计日志。
-
使用
ausearch
搜索命令执行事件:
sudo ausearch -k command_exec
sudo ausearch -k command_exec -ts recent # 查看最近的事件
sudo ausearch -k command_exec -u <用户名> # 查看特定用户的事件
- 使用
aureport
生成审计报告:aureport
可以生成各种审计报告,例如事件摘要、用户活动报告等。
2、使用 process accounting
(进程统计):
process accounting
是另一种 Linux 内核提供的审计机制,它可以记录系统上运行的进程信息,包括执行命令的用户、命令名称、启动时间、运行时间、CPU 使用率等。 它比 auditd
简单一些,但功能相对较弱。
1.安装 process accounting
工具:
sudo apt-get update # Debian/Ubuntu
sudo apt-get install acct
sudo yum update # CentOS/RHEL/Fedora
sudo yum install psacct
sudo dnf update # Fedora/CentOS 8+
sudo dnf install psacct
sudo zypper refresh # openSUSE
sudo zypper install acct
不同的发行版,包名可能略有不同,例如 acct
或 psacct
。
2.启动 process accounting
服务:
sudo systemctl start acct
sudo systemctl enable acct # 设置开机启动
3.查看进程统计日志:
process accounting
的日志通常以二进制格式保存在 /var/account/pacct
或 /var/log/pacct
文件中 (具体位置取决于系统配置)。 可以使用 lastcomm
和 sa
命令来查看和分析进程统计日志。
-
使用
lastcomm
查看最近执行的命令:
lastcomm
lastcomm <用户名> # 查看特定用户的命令
lastcomm | grep <关键词> # 搜索包含关键词的命令
使用 sa
生成命令统计报告: sa
命令可以生成各种命令统计报告,例如命令执行频率、CPU 使用率等。
sa -u # 按用户显示命令统计信息
sa -m # 按内存使用量排序
sa -c # 显示命令和计数
3、利用 Shell 提示符和 history -a
结合 syslog
(较简单,但安全性较低)
这种方法相对简单,但安全性较低,更适合用于简单的命令记录,不建议用于高安全要求的环境。
1.配置 Shell 提示符 (PROMPT_COMMAND
):
可以在用户的 .bashrc
或全局的 /etc/bashrc
文件中设置 PROMPT_COMMAND
环境变量。 PROMPT_COMMAND
定义了一个在每次显示 shell 提示符之前执行的命令。 我们可以利用它将命令记录到系统日志 (syslog
) 中。
例如,在 .bashrc
文件中添加:
PROMPT_COMMAND='RETRN_VAL=$?;logger -p local6.notice "$(whoami) $(pwd) $(history 1 | sed "s/^ *[0-9]* *//; s/^[ ]*//" ) \$?=$RETRN_VAL"'
RETRN_VAL=$?
:保存上一个命令的退出状态码。logger -p local6.notice ...
:使用logger
命令将信息发送到syslog
,优先级为notice
,facility 为local6
。$(whoami)
:记录执行命令的用户名。$(pwd)
:记录当前工作目录。$(history 1 | sed "s/^ *[0-9]* *//; s/^[ ]*//" )
:获取最近执行的一条命令(即当前即将执行的命令),并使用sed
命令去除 history 命令的行号和前导空格,只保留命令内容。\$?=$RETRN_VAL
:记录上一个命令的退出状态码。
2.配置 syslog
或 rsyslog
接收和保存日志:
需要配置 syslog
或 rsyslog
服务,使其接收来自 local6.notice
facility 的日志,并将它们保存到指定的文件中。 例如,可以编辑 /etc/rsyslog.conf
文件,添加如下配置:
local6.notice /var/log/command.log
-
这将把
local6.notice
级别的日志记录到/var/log/command.log
文件中。 然后重启rsyslog
服务。
3.手动同步 history
到日志 (增强实时性):
默认情况下,.bash_history
是在 shell 会话退出时才写入的。 为了增强记录的实时性,可以在 PROMPT_COMMAND
中添加 history -a
命令,强制每次执行命令后立即将历史记录追加到 .bash_history
文件中。 尽管如此,这种方法仍然依赖于用户 shell 的配置,且安全性较低。
4、选择哪种方法?
- 安全性和完整性要求高:
auditd
是最佳选择,它提供最强大、最灵活、最安全的审计功能,适用于需要满足合规性、安全审计等严格要求的环境。 - 简单审计和资源有限:
process accounting
是一个相对简单且资源消耗较小的选择,适合对审计要求不高,但需要基本命令记录的场景。 - 快速简单记录,安全性要求不高: Shell 提示符结合
syslog
是一种最简单的记录方法,配置快速,但安全性较低,不适合生产环境或安全敏感场景,仅适用于个人开发或测试环境。
重要注意事项:
- 日志安全: 无论选择哪种方法,记录用户操作都会产生敏感信息。 务必保护好日志文件,防止未授权访问、修改或删除。 建议限制日志文件的访问权限,并考虑将日志传输到远程日志服务器进行集中管理和备份。
- 性能影响: 记录所有用户操作会对系统性能产生一定影响,特别是当系统负载较高时。
auditd
和process accounting
的性能影响相对较小,但如果使用 Shell 提示符方法,频繁写入日志可能会对 shell 性能产生轻微影响。 在生产环境中,需要根据实际情况评估性能影响,并进行适当的配置优化。 - 日志轮转: 命令日志会快速增长,需要配置日志轮转 (logrotate) 策略,定期轮转、压缩和归档日志,以防止磁盘空间被耗尽。
- 用户隐私: 记录用户操作可能涉及用户隐私,需要遵守相关的法律法规和公司政策。 在启用命令记录之前,应评估其必要性,并告知用户可能会记录其操作。
三、审计日志权限
1、权限说明
-
默认权限和
root
用户: 在 Linux 系统中,审计日志文件(例如auditd
的/var/log/audit/audit.log
,或process accounting
的日志文件,以及syslog
/rsyslog
记录的日志文件)通常由root
用户拥有和管理。root
用户拥有系统的最高权限,可以执行任何操作,包括读取、修改和删除系统上的任何文件,自然也包括审计日志文件。 -
sudo
权限: 如果用户通过sudo
命令获得了root
权限,或者被授予了可以直接执行rm
或文件管理命令的sudo
权限,那么他们也具备了删除审计日志的能力。 -
直接文件操作: 拥有
root
权限的用户可以直接使用rm
命令或其他文件管理工具(如find -delete
)删除审计日志文件。他们也可以清空日志文件的内容,例如使用> /var/log/audit/audit.log
或truncate -s 0 /var/log/audit/audit.log
命令。
2、为什么 "越级管理员" 可以删除审计日志?
操作系统的设计初衷是为了让管理员能够管理和维护系统,包括日志文件。 在某些情况下,管理员可能需要清理旧日志以释放磁盘空间,或者在系统故障排除时需要管理日志文件。 因此,操作系统默认赋予了管理员管理日志文件的权限。
3、安全风险:审计日志被删除的影响
如果 "越级管理员" 可以随意删除审计日志,会带来严重的安全风险:
- 掩盖恶意活动: 恶意管理员或被攻陷的管理员账号可以删除审计日志,从而掩盖其非法操作,例如未经授权的访问、数据泄露、系统破坏等。 这使得安全事件的追踪和调查变得极其困难,甚至不可能。
- 违反合规性要求: 许多行业和法规(例如 PCI DSS, HIPAA, SOX 等)要求组织必须保留完整的审计日志,以进行安全审计和合规性检查。 如果审计日志可以被轻易删除,将无法满足这些合规性要求。
- 内部威胁难以检测: 内部威胁(insider threat)是企业安全面临的重要挑战。 如果内部人员(特别是拥有高权限的管理员)可以删除审计日志,那么内部恶意行为将更难被发现和制止。
4、如何防止或检测审计日志被 "越级管理员" 删除?
虽然完全阻止 "越级管理员" 删除审计日志在技术上可能非常困难或不可能(因为他们拥有系统最高权限),但我们可以采取多种措施来降低风险,并提高检测日志删除行为的能力:
1.通用安全措施 (适用于 Linux 和 Windows):
-
最小权限原则 (Principle of Least Privilege): 严格控制管理员账号的数量和权限范围。 只授予用户完成其工作所需的最小权限,避免过度授权。 不是所有管理员都需要具备删除审计日志的权限。
-
职责分离 (Separation of Duties): 将系统管理职责进行分离,例如安全管理员负责审计策略和日志管理,而系统管理员负责日常系统维护。 不同的角色应由不同的人员担任,以形成相互制衡,减少单点故障和滥用权限的风险。
-
多因素身份验证 (MFA): 为所有管理员账号启用多因素身份验证,提高账号安全性,防止管理员账号被盗用。
-
实时监控和告警: 部署安全信息和事件管理 (SIEM) 系统或其他日志监控工具,实时监控审计日志,检测异常事件,例如日志被清除、日志文件被删除、审计策略被修改等。 一旦检测到可疑活动,立即发出告警并进行响应。
-
日志完整性保护:
- 数字签名或哈希: 对审计日志进行数字签名或定期计算哈希值,并将签名或哈希值安全地存储在其他地方(例如只读介质或独立的日志服务器)。 如果日志被篡改或删除,可以检测到日志的完整性受损。
- 日志链技术 (Blockchain-inspired techniques): 一些高级的日志管理系统或安全产品可能会采用类似于区块链的日志链技术,将日志记录链接起来,形成不可篡改的日志链,提高日志的防篡改能力。
-
日志备份和归档: 定期将审计日志备份到安全的、独立的存储介质或远程日志服务器。 即使本地日志被删除,仍然可以从备份中恢复日志数据。 备份介质的访问权限也应受到严格控制,防止备份被篡改或删除。
-
日志集中管理 (Centralized Logging): 将所有系统(包括 Linux 和 Windows 服务器、网络设备、安全设备等)的审计日志集中收集到专门的日志管理服务器 (例如 SIEM 系统)。 日志管理服务器应具有高安全性和高可用性,并严格控制访问权限。 集中日志管理可以提高日志的安全性和可审计性,并方便进行统一的日志分析和安全事件响应。
-
用户行为监控 (User Behavior Monitoring): 部署用户行为监控 (UBA) 或用户和实体行为分析 (UEBA) 系统,监控用户(包括管理员)的行为模式,检测异常行为,例如异常登录、权限滥用、敏感数据访问等。 UBA/UEBA 可以帮助发现内部威胁和管理员的恶意行为。
-
安全审计和定期审查: 定期进行安全审计,审查审计策略配置、日志管理措施、管理员权限分配等,确保审计系统有效运行,并及时发现和修复安全漏洞。 同时,定期审查审计日志,检查是否存在可疑活动。
2.针对 Linux 环境的特定措施:
-
auditd
的配置增强:- 远程日志服务器: 配置
auditd
将日志实时发送到远程的日志服务器。 即使本地日志被删除,远程服务器仍然保存着完整的日志副本。 - 不可变日志文件属性 (immutable attribute): 可以使用
chattr +i /var/log/audit/audit.log
命令为审计日志文件设置 immutable 属性,使其只能追加,不能删除或修改(即使是root
用户也需要先去除 immutable 属性才能删除)。 但这可能会影响日志轮转,需要仔细配置日志轮转策略。 - 限制
auditd
管理工具的访问: 严格控制auditctl
和augenrules
等auditd
管理工具的访问权限,只允许授权的安全管理员使用。
- 远程日志服务器: 配置
-
强化文件系统权限: 进一步限制审计日志目录和文件的访问权限,只允许
auditd
服务账户和授权的安全管理员账户读取。 避免将审计日志目录设置为 world-writable 或 group-writable。
虽然 "越级管理员" 在技术上通常有能力删除审计日志,但这并不意味着我们对此无能为力。 通过实施上述一系列安全措施,我们可以大大提高审计日志的安全性和完整性,降低日志被恶意删除的风险,并提高检测和响应此类安全事件的能力。 关键在于多层次的安全防护、职责分离、最小权限原则、实时监控和持续的安全审计。 安全是一个持续改进的过程,需要不断地评估风险,调整安全策略,并保持警惕。
四、总结:
Linux 默认不记录用户的每步操作到系统级别日志。 要开启用户操作记录,可以使用 auditd
(Linux Audit System) 或 process accounting
等工具。 auditd
功能强大,安全性高,适合高安全要求的环境; process accounting
相对简单,资源消耗小; Shell 提示符结合 syslog
方法最简单但安全性最低。 选择哪种方法取决于你的具体需求、安全要求和资源限制。 启用命令记录后,务必注意日志安全、性能影响、日志轮转和用户隐私等问题。