在Ubuntu系统运维中,systemd-journald的日志若不进行安全转发,可能导致敏感信息泄露或日志审计缺失。核心解决方法是配置journald将日志安全地转发至远程syslog服务器(如rsyslog),并启用TLS加密与访问控制。你需要修改/etc/systemd/journald.conf文件,设置ForwardToSyslog=yes,并在rsyslog端配置TLS证书验证。下面我们一步步拆解配置细节与安全加固要点。

理解systemd-journald的日志转发机制

systemd-journald是Ubuntu默认的日志服务,负责收集内核、系统和服务日志。它默认将日志存储在/var/log/journal/目录的二进制文件中,但本地存储存在单点故障风险。通过转发到远程syslog服务器,可以实现日志集中管理、长期归档和安全备份。journald支持转发到传统syslog(如rsyslog)、控制台或内核日志缓冲区,其中远程转发是运维安全的关键一环。

配置journald启用syslog转发

首先编辑journald的主配置文件。使用sudo权限打开/etc/systemd/journald.conf,找到ForwardToSyslog参数。默认情况下该行被注释(以#开头),你需要取消注释并将其值设为yes:

# 启用转发到syslog
ForwardToSyslog=yes
# 可选:禁用本地存储以节省空间,但建议保留
# Storage=volatile

修改后重启journald服务:sudo systemctl restart systemd-journald。此时journald会将日志通过socket(/run/systemd/journal/syslog)发送给本地syslog守护进程。接下来需确保syslog服务(如rsyslog)正常运行并配置远程接收。

设置rsyslog接收远程日志并启用TLS加密

在Ubuntu中,rsyslog是常用的syslog实现。在日志接收服务器上,编辑/etc/rsyslog.conf,启用TCP/UDP模块并指定端口。为提高安全性,建议使用TCP with TLS而非明文UDP:

# 加载TCP和TLS模块
module(load="imtcp")
module(load="gtls")

# 定义TLS证书和密钥路径
global(
    DefaultNetstreamDriver="gtls"
    DefaultNetstreamDriverCAFile="/etc/ssl/ca.pem"
    DefaultNetstreamDriverCertFile="/etc/ssl/server-cert.pem"
    DefaultNetstreamDriverKeyFile="/etc/ssl/server-key.pem"
)

# 开启TCP监听并启用TLS
input(
    type="imtcp"
    port="6514"
    StreamDriver.Name="gtls"
    StreamDriver.Mode="1"
    StreamDriver.AuthMode="x509/name"
    PermittedPeer=["client.example.com"]
)

在日志发送端(即Ubuntu客户端),配置rsyslog将本地接收的journald日志转发到远程服务器。创建文件/etc/rsyslog.d/60-journald-forward.conf,内容如下:

# 加载TCP和TLS模块
module(load="omfwd")
module(load="gtls")

# 转发到远程服务器,使用TLS加密
action(
    type="omfwd"
    Target="logserver.example.com"
    Port="6514"
    Protocol="tcp"
    StreamDriver="gtls"
    StreamDriverMode="1"
    StreamDriverAuthMode="x509/name"
    StreamDriverPermittedPeers=["logserver.example.com"]
)

配置完成后,重启两端rsyslog服务:sudo systemctl restart rsyslog。使用tcpdump或ss命令验证连接是否在指定端口建立。

实施访问控制与身份验证

仅加密传输还不够,必须限制谁可以访问日志。在rsyslog服务器端,通过PermittedPeer参数限定客户端证书的CN(Common Name)。同时,配置防火墙(如UFW)只允许来自可信IP的日志端口访问:sudo ufw allow from 192.168.1.0/24 to any port 6514。在journald侧,可设置MaxLevelStore过滤敏感日志级别,例如避免调试信息被转发:

# 在journald.conf中限制转发日志级别
MaxLevelStore=info
MaxLevelSyslog=warning

此外,定期轮换TLS证书(建议每90天更新),并使用强密码保护私钥文件权限(chmod 600 /etc/ssl/*.pem)。

监控与故障排查实践

配置生效后,需持续监控日志流。在客户端使用journalctl -f观察实时日志,并通过logger命令测试转发:logger -p auth.warning "Test security log"。在服务器端检查/var/log/syslog或自定义的日志文件。如果日志未到达,依次排查:

(1)journald服务状态(systemctl status systemd-journald);

(2)rsyslog socket连接(ls -l /run/systemd/journal/syslog);

(3)TLS握手错误(查看/var/log/rsyslog.log中的netstream错误)。常见问题包括证书CN不匹配、防火墙阻塞或磁盘空间不足。

高级安全加固:日志完整性保护与审计

对于高安全环境,建议启用日志签名和完整性验证。journald支持通过Sealed=yes参数为本地日志添加加密签名,但远程转发时需依赖syslog的哈希校验。可在rsyslog配置中添加hash校验模块,或集成日志审计工具(如auditd)将安全事件单独转发。另一个关键点是日志保留策略:在journald.conf中设置MaxRetentionSec=1month避免磁盘溢出,同时在远程服务器使用logrotate压缩归档,并设置只读权限防止篡改。

总结:构建企业级日志安全体系

Ubuntu中systemd-journald的安全转发不是单一配置,而是一个涵盖加密、认证、访问控制和监控的体系。核心步骤包括:启用ForwardToSyslog、配置rsyslog with TLS、严格限制网络和证书访问、实施日志过滤与保留。定期审计日志流和更新安全策略,才能应对内部泄露和外部攻击风险。记住,安全的日志系统是合规运维(如等保2.0、GDPR)的基石,务必在测试环境验证后再部署到生产服务器。