在CentOS服务器安全体系中,本地日志一旦被攻击者获取root权限后篡改或删除,就等于你的安全审计形同虚设。最直接有效的解决方案就是安装rsyslog或syslog-ng等日志收集工具,将系统日志、认证日志、内核日志等实时转发到一台独立的远程日志服务器上,实现日志的异地存储和防篡改。下面我把整套方案从安装配置到加固验证,一步一步给你讲透。
很多运维人员只关注防火墙和入侵检测,却忽略了日志本身的安全性。攻击者入侵后第一件事往往就是清除/var/log下的痕迹。如果你的日志只存在本机,那就等于把证据交给了攻击者。远程日志转发的核心逻辑很简单:本机产生日志后,通过UDP或TCP协议实时推送到远程服务器,远程服务器只接收、只存储、不允许回写,从物理层面杜绝篡改可能。
一、为什么必须做日志远程转发CentOS默认使用rsyslog作为日志守护进程,它本身就支持远程转发功能,不需要额外安装复杂的第三方软件。但默认情况下,rsyslog只监听本地的/dev/log套接字,不对外发送任何数据。你需要做的就是开启它的网络转发模块,把日志推出去。
做这件事有三个硬性理由。第一,合规要求。等保2.0和各类安全审计标准都明确要求日志留存不少于6个月,且日志需防篡改。第二,事故溯源。一旦发生入侵,本地日志可能已经被破坏,远程日志就是你最后的救命稻草。第三,集中管理。多台服务器的日志汇总到一台机器上,分析效率提升数倍,异常行为一目了然。
二、在CentOS上安装和配置rsyslogCentOS 7和CentOS 8/Stream都自带rsyslog,一般不需要额外安装。先确认一下版本和状态:
rsyslogd -v systemctl status rsyslog
如果没有安装,执行以下命令安装:
yum install -y rsyslog systemctl enable rsyslog systemctl start rsyslog
接下来修改rsyslog的主配置文件/etc/rsyslog.conf,在文件末尾添加远程转发规则。这里推荐使用TCP协议,因为TCP有确认机制,日志不容易丢失。如果你的网络环境对性能要求极高且能接受少量丢包,也可以用UDP。
打开配置文件:
vi /etc/rsyslog.conf
在文件末尾追加以下内容:
# 开启TCP转发模块 module(load="imtcp") input(type="imtcp" port="514") # 开启UDP转发模块 module(load="imudp") input(type="imudp" port="514") # 将所有日志转发到远程日志服务器 *.* @@192.168.1.100:514
这里@@表示使用TCP协议,如果用UDP则改成@。192.168.1.100是你的远程日志服务器IP,514是标准syslog端口。配置完成后重启rsyslog服务:
systemctl restart rsyslog
同时要确保防火墙放行514端口:
firewall-cmd --permanent --add-port=514/tcp firewall-cmd --permanent --add-port=514/udp firewall-cmd --reload三、远程日志服务器的搭建与加固
远程日志服务器同样建议使用CentOS或Rocky Linux,安装rsyslog后需要做几件关键的事。首先,修改/etc/rsyslog.conf,让它监听外部日志:
module(load="imtcp") input(type="imtcp" port="514") module(load="imudp") input(type="imudp" port="514")
然后创建日志存储目录并设置权限,确保只有root和特定用户可以写入:
mkdir -p /var/log/remote chmod 700 /var/log/remote chown root:root /var/log/remote
在rsyslog配置中指定日志按来源主机和日期分类存储:
$template RemoteLogs,"/var/log/remote/%HOSTNAME%/%PROGRAMNAME%.log" *.* ?RemoteLogs
这条规则的意思是,每台来源主机的日志单独建一个文件夹,每个程序的日志单独建一个文件,方便后续检索。重启远程服务器的rsyslog:
systemctl restart rsyslog
加固方面,远程日志服务器要做到以下几点。第一,关闭不必要的服务,只保留rsyslog和ssh。第二,设置日志文件为只追加模式,通过chattr命令锁定:
chattr +a /var/log/remote/*.log
chattr +a表示只能追加写入,不能删除和修改,即使root用户也无法直接篡改。第三,定期将日志备份到离线存储或只读介质上。第四,远程日志服务器本身要有独立的访问控制,建议使用密钥登录,禁用密码登录。
四、进阶方案:使用syslog-ng替代rsyslog如果你的环境对日志转发的灵活性要求更高,比如需要按条件过滤、需要加密传输,可以考虑syslog-ng。它的配置语法更现代,功能更强大。安装方法:
yum install -y syslog-ng systemctl enable syslog-ng systemctl start syslog-ng
syslog-ng的主配置文件是/etc/syslog-ng/syslog-ng.conf,核心转发配置如下:
source s_net {
network(transport("tcp") port(514));
};
destination d_remote {
file("/var/log/remote/${HOST}/${PROGRAM}.log");
};
log {
source(s_net);
destination(d_remote);
};
syslog-ng还支持TLS加密传输,如果你的日志经过公网或不可信网络,强烈建议开启加密。在destination中添加tls选项即可:
destination d_remote_tls {
network("192.168.1.100" port(6514) transport("tls")
tls(peer-verify(required)));
};
这样日志在传输过程中就是加密的,中间人无法窃取或篡改内容。
五、日志完整性校验:如何确认日志没被改过光转发还不够,你还需要一套机制来验证日志的完整性。最实用的方法是在远程服务器上定期对日志文件计算哈希值并记录。可以写一个简单的cron脚本:
#!/bin/bash
LOG_DIR="/var/log/remote"
HASH_FILE="/var/log/remote/hashes.sha256"
find $LOG_DIR -type f -name "*.log" -exec sha256sum {} \; > $HASH_FILE
chattr +i $HASH_FILE
把这个脚本加入crontab每天执行一次,chattr +i让哈希文件本身也不可修改。一旦有人动了日志文件,哈希值对不上,你立刻就能发现。另外还可以考虑使用auditd审计系统本身,监控/var/log/remote目录下的所有写操作:
auditctl -w /var/log/remote -p wa -k log_integrity
这条规则会记录所有对该目录的写入和属性修改操作,形成第二道防线。
六、常见问题排查和注意事项实际部署中经常遇到几个问题。第一,日志转发后远程服务器没收到数据。先用tcpdump抓包确认网络是否通:
tcpdump -i eth0 port 514 -nn
如果抓到了包但没写入文件,检查SELinux是否拦截了rsyslog的网络权限:
getsebool -a | grep rsyslog setsebool -P rsyslogd_can_network_connect on
第二,日志量太大导致远程服务器磁盘撑满。建议在远程服务器上配置logrotate定期轮转压缩:
/var/log/remote/*/*.log {
daily
rotate 90
compress
delaycompress
missingok
notifempty
}
第三,不要把所有日志都无脑转发。认证失败日志、sudo操作日志、内核告警日志是必须转发的,而一些debug级别的应用日志可以本地保留即可,减少网络带宽和存储压力。
七、总结:构建完整的日志防篡改体系CentOS上做日志远程转发并不复杂,核心就是rsyslog或syslog-ng的配置加上远程服务器的加固。但真正的防篡改不是单一动作,而是一套体系:本地产生、实时转发、异地存储、只追加锁定、哈希校验、审计监控,六个环节缺一不可。把这套方案落地之后,即使攻击者拿到了你服务器的root权限,他也无法抹掉自己的入侵痕迹,因为证据早已安全地躺在另一台机器上了。这才是真正意义上的安全闭环。
