Ubuntu服务器上线后最容易忽略的不是防火墙,而是操作记录。很多安全事件发生后无法追溯,根本原因是没有部署系统级的审计机制。操作记录不只是“谁登录过”,还包括执行了什么命令、改了什么文件、从哪个IP接入、在什么时间做了什么变更。下面直接讲如何在Ubuntu服务器上建立一套可用的安全审计系统操作记录方案。

审计系统操作记录的核心组件

Ubuntu服务器记录操作行为主要依赖三个层面:系统日志服务(journald/rsyslog)、Shell历史记录、以及Linux审计框架(auditd)。单纯看/var/log/auth.log只能看到登录认证信息,看不到用户登录后具体执行了什么操作。要做到完整追溯,必须把这三个层面组合起来。

第一步是确认rsyslog和journald正常运行。Ubuntu 20.04及之后的版本默认使用systemd-journald收集日志,rsyslog负责将日志持久化到/var/log/目录。执行以下命令检查服务状态:

systemctl status systemd-journald rsyslog

如果rsyslog没有启用,执行:

sudo apt update
sudo apt install rsyslog -y
sudo systemctl enable rsyslog --now

journald默认将日志存储在/run/log/journal,重启后会丢失。建议开启持久化存储:

sudo mkdir -p /var/log/journal
sudo systemd-tmpfiles --create --prefix /var/log/journal
sudo systemctl restart systemd-journald

这样操作记录就不会因为重启而消失。

记录所有用户登录和认证事件

Ubuntu默认的auth.log已经能记录SSH登录、sudo使用、su切换等认证相关事件。但默认级别可能不够详细。检查/etc/rsyslog.conf以及/etc/rsyslog.d/50-default.conf中关于auth日志的配置:

auth,authpriv.*                 /var/log/auth.log

星号表示记录所有级别的auth和authpriv日志。如果没有这一行,手动添加后重启rsyslog:

sudo systemctl restart rsyslog

对于SSH登录,建议在/etc/ssh/sshd_config中提高日志详细程度:

LogLevel VERBOSE

修改后重启SSH服务:

sudo systemctl restart sshd

这样auth.log中会记录更详细的SSH连接信息,包括客户端尝试的认证方法、断开原因等。

Shell历史记录加固

普通用户登录后执行的命令默认记录在~/.bash_history中,但存在几个问题:默认只在退出Shell时写入、不同会话可能互相覆盖、用户可以自行删除或修改。要解决这些问题,需要在/etc/bash.bashrc和/etc/profile.d/中加入实时记录和增强格式。

在/etc/profile.d/audit_shell.sh中创建以下内容:

# 实时记录命令历史
export PROMPT_COMMAND='history -a; history -c; history -r'
# 记录时间戳
export HISTTIMEFORMAT="%F %T "
# 增加历史记录条数
export HISTSIZE=5000
export HISTFILESIZE=10000
# 忽略重复命令和空白开头的命令
export HISTCONTROL=ignoreboth
# 追加而不是覆盖
shopt -s histappend

创建文件后赋予执行权限:

sudo chmod +x /etc/profile.d/audit_shell.sh

这样每个新登录的用户都会自动加载这些配置。但要注意,bash_history本质上不是安全审计工具,用户仍然可以通过unset HISTFILE等方式绕过。所以还需要auditd进行内核级审计。

使用auditd记录关键文件和系统调用

auditd是Linux内核提供的审计框架,可以记录文件访问、系统调用、用户操作等底层事件。Ubuntu安装auditd:

sudo apt install auditd audispd-plugins -y
sudo systemctl enable auditd --now

安装后默认会记录一些基本事件。要记录所有用户执行的命令,需要添加系统调用规则。在/etc/audit/rules.d/audit.rules中加入:

# 记录所有用户执行的命令
-a always,exit -F arch=b64 -S execve -k command_exec
-a always,exit -F arch=b32 -S execve -k command_exec
# 记录sudo使用
-w /etc/sudoers -p wa -k sudoers_change
-w /etc/sudoers.d/ -p wa -k sudoers_change
# 记录密码文件变更
-w /etc/passwd -p wa -k passwd_change
-w /etc/shadow -p wa -k shadow_change
# 记录SSH配置变更
-w /etc/ssh/sshd_config -p wa -k sshd_config_change

保存后重启auditd使规则生效:

sudo systemctl restart auditd

查看审计日志使用ausearch命令。例如查询所有命令执行记录:

sudo ausearch -k command_exec -ts today

查询某个用户的操作:

sudo ausearch -ua username -i

auditd的日志默认保存在/var/log/audit/audit.log。这个文件增长很快,需要配置日志轮转。Ubuntu默认安装了logrotate,检查/etc/logrotate.d/auditd配置,确保设置了合理的保留周期和大小限制。

记录文件系统变更

除了命令执行,服务器上的关键文件被修改也是安全审计的重点。可以使用auditd的文件监控规则,也可以部署AIDE(Advanced Intrusion Detection Environment)来做文件完整性校验。

安装AIDE:

sudo apt install aide -y
sudo aideinit

初始化完成后,AIDE会生成一个基准数据库/var/lib/aide/aide.db。之后定期执行检查:

sudo aide.wrapper --check

如果文件被修改,AIDE会输出差异报告。建议将AIDE检查加入cron定时任务,每天执行一次并将结果发送到管理员邮箱或写入日志文件。

对于关键目录的实时监控,可以在audit.rules中添加:

# 监控/etc目录下配置文件的修改
-w /etc/ -p wa -k etc_changes
# 监控网站目录
-w /var/www/ -p wa -k www_changes
# 监控二进制目录
-w /usr/bin/ -p wa -k bin_changes
-w /usr/sbin/ -p wa -k sbin_changes

注意不要监控过于频繁读写的目录,否则会产生大量日志影响性能。

记录用户操作会话

对于需要完整回放用户操作场景,可以部署会话记录工具。script命令可以记录终端会话,但需要用户主动开启。更可靠的方式是使用tlog或者配置SSH强制会话录制。

Ubuntu仓库中有tlog包,可以配合SSH使用。安装:

sudo apt install tlog -y

配置SSH强制录制,在/etc/ssh/sshd_config中添加:

ForceCommand tlog-rec-session

这样所有SSH登录用户的会话都会被录制下来,包括输入和输出。录制文件默认存放在/var/tmp/tlog/目录。回放使用:

tlog-play -i /var/tmp/tlog/录制文件

需要注意的是,tlog录制会占用磁盘空间,需要配置定期清理策略。同时录制文件包含敏感信息,必须限制访问权限。

集中化日志管理

单台服务器的操作记录只能在本机查看,如果服务器被入侵,攻击者可能清除本地日志。因此需要将日志集中发送到独立的日志服务器。Ubuntu使用rsyslog可以轻松实现远程日志转发。

在审计服务器上配置rsyslog接收端,编辑/etc/rsyslog.conf,取消注释:

module(load="imudp")
input(type="imudp" port="514")

然后在客户端服务器上配置转发规则,在/etc/rsyslog.d/50-remote.conf中添加:

*.* @日志服务器IP:514

重启rsyslog后,所有日志都会实时发送到日志服务器。对于auditd日志,需要额外配置audisp插件转发。编辑/etc/audit/plugins.d/au-remote.conf:

active = yes
direction = out
path = /sbin/audisp-remote
type = always

并配置/etc/audit/audisp-remote.conf中的远程服务器地址。

日志分析和告警

操作记录的价值在于分析和及时告警。Ubuntu上可以部署简单的日志分析工具,例如使用logwatch定期生成报告,或者使用更高级的Wazuh、Osquery等工具进行实时分析。

安装logwatch:

sudo apt install logwatch -y

配置每日报告发送到管理员邮箱:

sudo logwatch --detail High --mailto admin@example.com --service All --range today

对于实时告警,可以使用fail2ban监控认证失败并自动封禁IP。安装:

sudo apt install fail2ban -y
sudo systemctl enable fail2ban --now

默认配置会监控SSH登录失败,连续失败多次后自动封禁来源IP。可以通过/etc/fail2ban/jail.local自定义规则,例如监控sudo失败、增加封禁时间等。

权限控制和防篡改

审计系统本身也需要保护。攻击者如果获得root权限,可以停止auditd、删除日志、修改规则。需要采取额外措施:

1. 限制日志文件权限,只有root和特定组可以读取:

sudo chmod 640 /var/log/auth.log
sudo chmod 640 /var/log/audit/audit.log

2. 使用chattr设置日志文件不可修改:

sudo chattr +a /var/log/auth.log
sudo chattr +a /var/log/audit/audit.log

加a属性后文件只能追加不能删除或修改。攻击者即使有root权限也无法直接清除日志。

3. 配置auditd的不可变模式。在audit.rules末尾添加:

-e 2

这样audit规则在运行期间无法被修改,只有重启才能更改。但要注意,启用不可变模式后修改规则需要重启服务器,在测试环境中先验证规则正确性。

定期审计和报告

操作记录系统部署完成后,需要定期检查审计日志,发现异常行为。建议建立每日、每周的审计流程:

每日检查项包括:失败的登录尝试、新增用户、sudo使用记录、关键文件变更。可以使用以下命令快速提取:

# 查看今日失败登录
sudo grep "Failed password" /var/log/auth.log | grep "$(date +%b\ %d)"
# 查看今日sudo使用
sudo grep "sudo" /var/log/auth.log | grep "$(date +%b\ %d)"
# 查看今日新增用户
sudo grep "useradd" /var/log/auth.log | grep "$(date +%b\ %d)"

每周检查项包括:auditd命令执行统计、文件完整性报告、日志服务器存储空间。可以编写脚本自动生成报告,通过cron定时执行。

对于多台服务器,建议部署统一的日志分析平台。轻量级方案可以使用Loki+Grafana,重量级方案可以使用ELK或Wazuh。这些工具可以提供可视化仪表盘和复杂的查询能力,大幅提高审计效率。

实际部署中的注意事项

在Ubuntu服务器上部署审计系统时,有几个常见问题需要提前考虑。首先是性能影响。auditd记录所有execve系统调用会消耗CPU和磁盘IO,在高负载服务器上可能影响业务性能。建议先在测试环境评估,根据实际负载调整规则范围,例如只记录特定用户或特定目录下的命令执行。

其次是日志存储空间。完整的操作记录会快速增长,特别是auditd日志。需要合理配置logrotate,设置日志大小上限和保留周期。对于会话录制,更要严格控制存储空间,避免磁盘被写满导致服务不可用。

第三是合规性要求。不同行业对操作记录的保留时间有不同要求,例如金融行业通常要求保存至少6个月。需要根据实际合规要求配置日志归档策略,将历史日志压缩归档到独立存储。

最后是审计系统的可用性。审计系统本身故障不应影响正常业务。auditd在极端情况下可能阻塞系统调用,建议在audit.rules中使用-b参数设置合理的backlog限制,避免审计队列溢出影响系统稳定性。

通过以上配置,Ubuntu服务器可以建立一套完整的操作记录审计体系,覆盖登录认证、命令执行、文件变更、会话回放等关键环节。这套体系能够帮助管理员在安全事件发生后快速定位问题、追溯责任,同时也能对潜在的攻击者形成威慑。