CentOS系统在服务器领域装机量巨大,但运维人员最头疼的问题之一就是日志分散在各台机器上。当服务器被攻破后,攻击者第一件事往往是清理本地日志,一旦rm -rf下去,所有入侵痕迹荡然无存。解决这个死穴的核心方案就是把日志实时甩出本地,集中存储到远程日志服务器上,再配合分析工具做威胁检测。

rsyslog远程传输的核心配置

CentOS 7和8默认自带的rsyslog已经足够强大,不需要额外安装什么花哨工具。要让日志离开本地,关键在于配置rsyslog的转发规则。先看服务端配置,这台机器专门接收所有服务器的日志。编辑/etc/rsyslog.conf,去掉下面几行的注释,开启TCP和UDP监听。TCP可靠但稍慢,UDP快速但可能丢包,生产环境建议两个都开,关键安全日志走TCP。

# 服务端 /etc/rsyslog.conf
module(load="imtcp")
input(type="imtcp" port="514")

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

接下来要指定日志存放位置。很多人直接把所有日志混在一个文件里,后期分析时简直是灾难。推荐按客户端IP和时间动态创建目录结构,这样每个服务器的日志自动归档到独立文件夹。在rsyslog.conf里添加模板定义和规则。

# 定义日志存储模板,按IP和日期分目录
$template RemoteLogs,"/var/log/remote/%FROMHOST-IP%/%$YEAR%-%$MONTH%-%$DAY%.log"
*.* ?RemoteLogs

重启rsyslog服务后,服务端就开始监听514端口了。客户端配置更简单,只需要在/etc/rsyslog.conf末尾加一行转发规则。@表示UDP,@@表示TCP。如果网络不稳定,建议用TCP加队列缓冲,防止日志丢失。

# 客户端配置,把所有日志通过TCP发送到远程服务器192.168.1.100
*.* @@192.168.1.100:514

# 更稳健的配置,启用磁盘队列防止网络中断时丢日志
$ActionQueueFileName queue
$ActionQueueMaxDiskSpace 1g
$ActionQueueSaveOnShutdown on
$ActionQueueType LinkedList
$ActionResumeRetryCount -1
*.* @@192.168.1.100:514

防火墙别忘了放行。CentOS 7/8默认firewalld,执行firewall-cmd --add-port=514/tcp --permanent再reload。很多运维在这步卡住,客户端日志发不出去,排查半天发现是防火墙拦了。另外SELinux也可能阻止rsyslog写自定义目录,如果日志文件没生成,检查audit日志看avc拒绝记录,临时调整上下文类型即可。

日志存储策略与轮转管理

集中存储后日志量会爆炸式增长。几十台服务器一天轻松产生几十GB日志,不做好轮转磁盘很快撑满。logrotate是标配,但默认配置只处理/var/log下的固定文件名,而远程日志按IP和日期动态生成,需要自定义logrotate规则。

# /etc/logrotate.d/remote_logs
/var/log/remote/*/*.log {
    daily
    rotate 30
    missingok
    notifempty
    compress
    delaycompress
    sharedscripts
    postrotate
        /bin/kill -HUP $(cat /var/run/syslogd.pid 2>/dev/null) 2>/dev/null || true
    endscript
}

压缩日志时注意delaycompress,保证当天日志不压缩,方便实时分析工具读取。rotate保留天数根据磁盘容量和安全合规要求定,金融行业通常要求保存6个月以上。如果磁盘IO压力大,可以考虑把旧日志归档到对象存储或廉价NAS上。

安全日志的关键字段与完整性保护

日志集中了不代表安全了。攻击者如果拿到rsyslog服务器的root权限,照样能删日志。所以日志完整性保护必须做。最简单有效的办法是日志服务器本身也把关键安全日志转发到另一台加固过的只写主机上,形成链条。更深层的保护是在日志生成时就做哈希签名,rsyslog支持通过omrelp模块使用RELP协议传输,保证传输过程不丢不篡改。

需要重点收集的安全日志包括/var/log/secure中的SSH登录记录、sudo执行记录、用户创建删除;/var/log/audit/audit.log中的系统调用审计;以及应用层面的nginx访问日志、数据库查询日志。特别是SSH暴力破解,通过集中分析能立刻发现异常IP在多个服务器之间的横向移动轨迹。单机看日志看不出这个IP同时撞了10台机器,集中起来一目了然。

使用Logwatch快速生成日报

日志集中后如果每天手动翻看,运维就别想干别的了。Logwatch是CentOS上老牌的日志分析报告工具,能自动解析syslog、audit、应用日志,生成可读性很强的日报。安装简单,yum install logwatch即可。配置文件在/usr/share/logwatch/default.conf/logwatch.conf,关键参数调整输出详细级别和报告范围。

# /etc/logwatch/conf/logwatch.conf
Detail = High
Range = yesterday
Service = All
MailTo = admin@example.com
Format = html

Logwatch默认只扫描本机日志,现在日志集中在/var/log/remote下,需要修改它的搜索路径。在logwatch配置里指定LogDir参数指向远程日志目录。每天早上一封邮件,列出所有服务器上失败的SSH登录次数、新增用户、sudo异常、磁盘空间告警等,比人工巡检效率高太多。不过Logwatch只能做静态分析,无法实时告警,适合做日报周报。

实时威胁检测与自动化响应

日报的时效性不够,攻击可能半夜发生,第二天早上看报告时数据早被偷光了。需要实时分析引擎。开源方案中Wazuh是个不错的选择,它基于OSSEC发展而来,天然兼容CentOS。Wazuh的架构是每台服务器装agent,把日志和完整性检查结果推送到manager节点,manager再对接Elasticsearch做全文索引和可视化。

Wazuh自带大量开箱即用的检测规则,比如连续5次SSH登录失败触发告警、检测到反弹shell命令、发现新增crontab后门等。规则文件在/var/ossec/ruleset/rules下,可以按自己业务定制。比如公司内部只允许从堡垒机IP登录,那么任何其他IP成功登录SSH都算高危事件,加一条自定义规则就行。

# 自定义规则,非堡垒机IP登录SSH成功立即告警

    5715
    !192.168.1.10
    SSH login from non-bastion host
    custom_ssh,

告警后的自动化响应同样重要。Wazuh的active response功能可以在检测到高危事件时自动执行脚本,比如把攻击IP加入iptables黑名单、禁用被入侵的用户账号。但自动封禁要谨慎配置白名单,别把CEO的IP给封了。建议高危告警先走人工确认,中低危的暴力破解类可以自动封禁5分钟。

大规模部署的性能优化

当客户端超过100台时,单机rsyslog会成为瓶颈。优化方向有几个。首先是rsyslog的队列机制,默认内存队列满了会丢日志,改成磁盘辅助队列保证不丢。其次考虑前端加负载均衡,用HAProxy或LVS把日志流分发到多台rsyslog后端,每台后端存储一部分客户端的日志。Elasticsearch集群也需要合理规划分片数,日志类数据写入量大,分片过多会拖垮集群。

另一个容易被忽略的优化点是时间同步。所有服务器的时钟必须通过NTP保持一致,否则日志时间线混乱,出了安全事件根本没法溯源。CentOS上chronyd是默认时间同步服务,确保每台机器都指向同一台NTP服务器,日志服务器本身也要同步。时间差超过几秒就会导致关联分析失效,比如A服务器显示攻击发生在10:00:01,B服务器显示10:00:05,看起来像两个独立事件,实际是同一波攻击。

审计合规与长期归档

等保2.0和各类合规要求明确规定日志保存期限和不可篡改性。技术上可以通过把日志实时同步到写一次读多次的存储介质上实现,比如刻录蓝光盘或者使用支持对象锁定的S3兼容存储。rsyslog的omfile模块支持通过named pipe把日志流送给外部归档脚本,脚本负责计算哈希后存入归档系统。归档日志的哈希值定期校验,发现篡改立即告警。

如果公司有SIEM/SOC团队,集中后的日志通过syslog转发或者kafka消息队列对接过去即可。CentOS层面要做的就是保证日志从产生到进入分析平台这条链路不中断、不丢数据、不被篡改。很多安全事件事后复盘时发现日志链路早就断了几个月没人发现,这种运维盲区比没有日志更可怕,因为它制造了虚假的安全感。

最后强调一点,日志服务器本身的安全加固不能忽视。这台机器掌握了所有服务器的运行状态和安全事件,一旦被拿下后果不堪设想。最小化安装,只开SSH和rsyslog端口,SSH仅允许密钥登录且限制来源IP,系统审计规则重点监控/var/log/remote目录的删除操作。定期检查日志服务器的登录记录和进程列表,确保它本身没有被入侵的迹象。