关键在于sudo日志进入rsyslog管道再转发:需配置Defaults syslog=authpriv,rsyslog精准转发authpriv.*至远程服务器,并在服务端按facility和IP分离存储,确保提权操作实时、可靠、可审计。

要让 sudo 的提权操作日志实时远传至集中日志服务器,关键不是“sudo配合rsyslog”,而是让 sudo 日志进入 rsyslog 管道,再由 rsyslog 转发出去。Linux 默认已将 sudo 日志写入 /var/log/auth.log(Debian/Ubuntu)或 /var/log/secure(RHEL/CentOS),而这些文件本身由 rsyslog 监控并归类——但默认只本地存储。真正要实现“实时远传”,需确保:
- sudo 日志被 rsyslog 正确捕获(通常已默认支持)
- rsyslog 将对应 facility(主要是
auth和authpriv)的日志转发到远程服务器 - 服务端能按来源、程序名等可靠接收并分离存储
以下是具体、可落地的配置步骤:
确保 sudo 日志被正确记录到 syslog
sudo 默认通过 syslog() 系统调用向 auth 或 authpriv facility 发送日志。确认 /etc/sudoers 中没有禁用日志(如 Defaults !syslog),且推荐显式启用:
# 推荐在 /etc/sudoers 中添加(用 visudo 编辑) Defaults syslog=authpriv Defaults log_year, logfile=/var/log/sudo.log
⚠️ 注意:
log_year和logfile是本地落盘选项,不影响远程传输;真正决定是否进 syslog 的是syslog=设置。authpriv比auth更严格,适合敏感提权行为,且默认被 rsyslog 收集。
验证是否生效:执行 sudo id 后,运行
journalctl -t sudo | tail -3 # 或 grep sudo /var/log/auth.log | tail -3
应能看到类似 pam_unix(sudo:session): session opened for user root by user(uid=1000) 的记录。
配置 rsyslog 客户端转发 auth/authpriv 日志
不要盲目转发 *.*,应精准匹配提权相关日志,减少冗余和安全暴露:
-
auth.*:常规认证事件(login、ssh、su) -
authpriv.*:特权操作(sudo、sudoers、pam_rootok)→ 这才是 sudo 提权的核心日志
编辑 /etc/rsyslog.d/50-sudo-remote.conf(新建独立配置更清晰):
# 启用 TCP 转发(可靠,防丢日志) authpriv.* @@192.168.17.160:514;RSYSLOG_ForwardFormat auth.* @@192.168.17.160:514;RSYSLOG_ForwardFormat # 可选:加队列保障网络波动时不丢 sudo 日志 $ActionQueueFileName fwd_sudo $ActionQueueMaxDiskSpace 500m $ActionQueueSaveOnShutdown on $ActionQueueTimeoutShutdown 10000
✅
@@表示 TCP(比@UDP 更可靠);192.168.17.160替换为你的日志服务器真实 IP
✅RSYSLOG_ForwardFormat是标准格式模板,兼容多数服务端解析
✅ 单独为 sudo 相关日志设队列,避免其他日志挤占缓冲
保存后重启:
sudo systemctl restart rsyslog
服务端接收并按客户端分离存储(含 sudo 日志识别)
服务端需启用 TCP 监听,并用模板把 authpriv 日志单独归类,便于审计:
在 /etc/rsyslog.d/30-remote-sudo.conf 中写:
module(load="imtcp")
input(type="imtcp" port="514")
# 按源 IP + facility 分目录存储,突出 authpriv
template(name="SudoLogTemplate" type="string"
string="/var/log/remote/%FROMHOST-IP%/authpriv-%PROGRAMNAME%.log")
if $syslogfacility-text == 'authpriv' then ?SudoLogTemplate
& stop
# 其他 auth 日志也分存(可选)
template(name="AuthLogTemplate" type="string"
string="/var/log/remote/%FROMHOST-IP%/auth-%PROGRAMNAME%.log")
if $syslogfacility-text == 'auth' then ?AuthLogTemplate
& stop创建目录并赋权:
sudo mkdir -p /var/log/remote/192.168.17.161/ sudo chown syslog:adm /var/log/remote
重启服务端 rsyslog:
sudo systemctl restart rsyslog
验证 sudo 日志是否真正远传成功
-
在客户端执行提权操作:
sudo ls /root
-
立即在服务端检查:
# 查看对应 IP 下的 authpriv 日志 sudo tail -f /var/log/remote/192.168.17.161/authpriv-sudo.log
应看到类似:
Jul 21 22:05:12 client-host sudo: user : TTY=pts/0 ; PWD=/home/user ; USER=root ; COMMAND=/bin/ls /root
-
若无输出,排查方向:
-
sudo systemctl status rsyslog(客户端和服务端都查是否有 error) -
sudo ss -tlnp | grep :514(服务端确认 514/tcp 是否监听) -
sudo ufw status或sudo firewall-cmd --list-ports(确认 514/tcp 放行) -
journalctl -u rsyslog -n 50 --no-pager | grep -i "fail\|reject"(找连接拒绝线索)
-
不复杂但容易忽略细节。核心就三点:sudo 写进 authpriv → rsyslog 抓住 authpriv 并 TCP 转发 → 服务端按 facility+IP 分离落盘。

















