Ubuntu服务器日常运维中,最麻烦的不是服务宕机,而是出了问题之后翻遍/var/log找不到关键线索。很多团队的安全审计和故障排查效率低,根源在于日志散落在auth.log、syslog、kern.log、应用日志等多个文件里,格式不统一、时间戳错乱、被攻击者清理后无从追溯。集中收集安全日志不是为了“看起来规范”,而是为了在入侵发生后的黄金时间内快速还原攻击路径。下面直接讲如何在Ubuntu环境下搭建一套轻量、可靠、可落地的集中日志方案。
先明确要收集哪些安全日志
Ubuntu系统默认的rsyslog已经能采集大部分系统级日志,但安全排查需要重点关注几类:/var/log/auth.log记录SSH登录、sudo提权、PAM认证事件;/var/log/syslog包含内核和系统服务消息;/var/log/kern.log记录内核级异常;还有auditd的审计日志(如果安装了auditd)。应用层面,Nginx或Apache的访问日志和错误日志、数据库的慢查询和错误日志、自定义业务服务的运行日志都需要纳入。很多人只收集系统日志,结果应用层被注入后毫无感知。集中收集的前提是明确日志源,建议先用一条命令确认当前rsyslog是否在运行:
systemctl status rsyslog
如果没安装auditd,建议在安全要求较高的服务器上补装:
sudo apt update && sudo apt install auditd -y
auditd可以记录文件访问、用户操作、系统调用等细粒度事件,对于追踪内部违规和提权行为非常关键。
用rsyslog做本地汇聚和转发
Ubuntu自带rsyslog,它既能在本地把分散的日志统一格式,也能通过TCP/UDP把日志转发到远端集中服务器。推荐使用TCP协议,虽然性能略低于UDP,但能保证日志不丢失,安全审计场景下完整性比吞吐量重要。在需要被收集的Ubuntu服务器上,编辑/etc/rsyslog.conf或/etc/rsyslog.d/50-default.conf,添加转发规则:
# 将auth和authpriv日志转发到集中服务器 auth,authpriv.* @@192.168.1.100:514 # 转发所有系统日志(可选) *.* @@192.168.1.100:514
这里的@@表示使用TCP,单个@表示UDP。建议至少转发auth和authpriv,因为SSH暴力破解、sudo滥用都记录在这里。如果服务器数量多,可以在rsyslog配置中加入队列缓冲,避免网络抖动时丢日志:
$ActionQueueFileName fwdRule1 $ActionQueueMaxDiskSpace 1g $ActionQueueSaveOnShutdown on $ActionQueueType LinkedList $ActionResumeRetryCount -1
这些参数让rsyslog在远端不可达时先把日志缓存在本地磁盘,恢复后继续发送,对安全审计来说非常实用。
集中服务器端的接收配置
集中日志服务器同样建议用Ubuntu,安装rsyslog后开启TCP接收模块。编辑/etc/rsyslog.conf,取消或添加以下两行:
module(load="imtcp") input(type="imtcp" port="514")
然后创建接收规则,把不同来源的日志分开存放,便于后续检索:
$template RemoteLogs,"/var/log/remote/%HOSTNAME%/%PROGRAMNAME%.log" *.* ?RemoteLogs & stop
这样每台服务器的日志会按主机名分目录存储,排查时一眼就能定位是哪台机器的问题。重启rsyslog使配置生效:
sudo systemctl restart rsyslog
注意防火墙要放行514端口,但只对内部网段开放,避免日志端口暴露在公网。可以用ufw限制来源IP:
sudo ufw allow from 192.168.1.0/24 to any port 514 proto tcp
如果日志量很大,单台rsyslog服务器可能成为瓶颈,可以考虑用Kafka或Redis做缓冲层,但中小规模团队直接rsyslog接收加本地存储就足够。
日志切分和保留策略
集中收集后如果不做切分,日志文件会无限膨胀,最终拖垮磁盘I/O。Ubuntu上推荐用logrotate管理远端日志,创建/etc/logrotate.d/remote_logs:
/var/log/remote/*/*.log {
daily
rotate 30
compress
delaycompress
missingok
notifempty
sharedscripts
postrotate
systemctl reload rsyslog >/dev/null 2>&1 || true
endscript
}
这里保留30天,压缩旧日志。安全审计通常要求至少保留6个月,可以根据磁盘容量调整rotate值。如果磁盘紧张,可以把压缩后的日志同步到对象存储或NAS做冷备,rsyslog本身不负责长期归档,需要配合cron脚本或专用工具。
日志格式统一与时间戳处理
多台服务器日志集中后,最头疼的是时间不一致。如果各服务器没有配置NTP同步,日志里的时间戳会错乱,攻击路径分析时无法对齐事件顺序。务必在所有Ubuntu服务器上启用时间同步:
sudo timedatectl set-ntp true sudo systemctl enable systemd-timesyncd --now
rsyslog默认使用RFC 3164格式,时间戳精度只有秒级,对于安全事件分析不够用。建议在转发端和接收端都使用RFC 5424格式,包含毫秒级时间戳和更结构化的字段。在rsyslog配置中设置:
$ActionFileDefaultTemplate RSYSLOG_SyslogProtocol23Format
这样日志中会带有ISO 8601时间戳和明确的hostname、app-name、procid、msgid等字段,后续用脚本或工具解析时更可靠。如果应用日志格式混乱,可以在rsyslog中用模板重写,但更推荐在应用层直接输出JSON格式日志,rsyslog透传即可。
日志检索与快速排查思路
集中收集的最终目的是快速排查。如果只是把日志堆在/var/log/remote下,出了问题还是靠grep和less,效率依然低。建议在集中服务器上安装轻量级全文检索工具,比如用lnav直接查看和过滤多个日志文件:
sudo apt install lnav -y lnav /var/log/remote/
lnav能自动识别日志格式、按时间排序、高亮错误和警告,支持SQL查询日志内容,比grep直观得多。对于更复杂的查询需求,可以部署Grafana+Loki或Elasticsearch+Kibana,但会增加维护成本。中小团队可以先从lnav或简单的grep配合awk开始,等日志量上来再升级。
实际排查SSH暴力破解时,集中服务器上一条命令就能找出所有来源IP的失败次数:
grep "Failed password" /var/log/remote/*/auth.log | awk '{print $(NF-3)}' | sort | uniq -c | sort -nr | head -20
如果日志已经按主机名分目录,还能快速定位是哪台服务器被攻击。sudo提权记录同样可以跨服务器检索:
grep "sudo:" /var/log/remote/*/auth.log | grep "COMMAND"
这种集中检索能力是分散日志无法提供的。
安全加固:防止日志被篡改
集中日志服务器本身也是攻击目标。如果攻击者拿到集中服务器权限,删掉所有日志,前面的努力就白费了。至少要做三件事:第一,限制集中服务器的SSH访问,只允许运维堡垒机登录,使用密钥认证;第二,对日志目录设置不可变属性,防止误删和篡改:
sudo chattr +a /var/log/remote/*/*.log
chattr +a让日志文件只能追加不能删除,root用户也无法直接rm,除非先chattr -a。第三,定期把日志备份到离线存储或只写一次的介质,比如对象存储的合规保留模式。另外,rsyslog接收端可以配置TLS加密传输,防止日志在网络上被嗅探或篡改,但需要自建CA和证书,配置稍复杂,对安全要求高的环境值得投入。
监控日志收集链路本身
日志集中系统最怕的是静默故障——rsyslog进程死了、网络断了、磁盘满了,但没人发现,等到要查日志时才发现已经断了好几天。建议在集中服务器上配置简单的健康检查,比如每小时统计一次最近接收的日志条数,如果低于阈值就告警。可以用cron加脚本实现:
#!/bin/bash
count=$(find /var/log/remote/ -name "*.log" -mmin -60 -exec cat {} \; | wc -l)
if [ "$count" -lt 100 ]; then
echo "日志接收异常,最近一小时仅收到 $count 条日志" | mail -s "日志系统告警" admin@example.com
fi
更完善的做法是用Prometheus的node_exporter监控rsyslog的impstats输出,rsyslog可以开启统计模块:
module(load="impstats" interval="60" severity="7" log.syslog="off" log.file="/var/log/rsyslog-stats.log")
这样能实时看到每秒接收的日志量、队列长度、丢弃数量等指标,一旦异常立即告警。日志系统本身的可观测性不能忽视,否则它就会成为安全体系中最薄弱的盲区。
Ubuntu服务器安全日志集中收集不是一个复杂的工程,rsyslog加logrotate加lnav就能解决80%的需求。关键是把日志源定义清楚、传输链路可靠、存储有保留策略、检索有工具、系统本身有监控。这套方案跑通之后,安全事件排查时间能从小时级压缩到分钟级,而且日志不再因为单台服务器被入侵而丢失,这才是集中收集的核心价值。
