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