SSH堡垒机与SOCKS代理的出站连接审计方案咨询
看起来你现在需要解决的是Debian 12堡垒机下,覆盖SSH跳转和SOCKS5代理两种场景的出站TCP连接审计问题,还要满足ISO合规和SIEM接入的要求——我之前在客户的合规项目里刚好处理过几乎一模一样的场景,给你一套可落地的方案:
先明确你的核心需求
你需要的是无死角覆盖两种访问方式的出站连接日志,每条日志必须关联到具体的技术人员账号,同时日志格式要能被RSyslog正常转发到SIEM。
现有auditctl规则的不足
你提到的auditctl -a always, exit -S connect规则其实是个不错的起点,但它只追踪了connect系统调用,没区分IPv4/IPv6,也没做用户上下文的强关联,而且对于SOCKS代理这种由SSH进程发起的连接,需要确保规则能捕捉到SSH进程的系统调用。
我的完整解决方案
1. 用auditd做核心审计(覆盖所有场景)
Debian 12的auditd已经很成熟,只要规则配置正确,能完美捕捉所有出站TCP连接,包括SOCKS代理的:
首先,添加完整的auditd规则:
# 追踪64位系统下所有成功和失败的IPv4 connect调用,标记为outbound-tcp auditctl -a always,exit -F arch=b64 -S connect -F a0=2 -F exit=0 -k outbound-tcp auditctl -a always,exit -F arch=b64 -S connect -F a0=2 -F exit!=-EPERM -k outbound-tcp # 追踪IPv6的connect调用 auditctl -a always,exit -F arch=b64 -S connect -F a0=10 -F exit=0 -k outbound-tcp-ipv6 auditctl -a always,exit -F arch=b64 -S connect -F a0=10 -F exit!=-EPERM -k outbound-tcp-ipv6
然后把这些规则保存到持久化文件,避免重启后丢失:
# 把当前规则导出到规则文件 auditctl -l > /etc/audit/rules.d/99-outbound-tcp-audit.rules # 重启auditd服务 systemctl restart auditd
这条规则会追踪所有进程的connect系统调用,并且在日志里包含auid(发起连接的用户ID)、saddr(目标IP)、dport(目标端口)这些关键字段——哪怕是SOCKS代理的连接,因为SOCKS是由用户启动的SSH进程发起的,auditd会通过auid关联到对应的技术人员账号。
2. 处理SOCKS代理的日志关联
SOCKS代理的连接是由ssh -D启动的进程发起的,auditd的日志里会显示comm=ssh,结合auid就能明确是哪个用户在使用SOCKS代理访问哪个目标。你可以用ausearch测试一下:
ausearch -k outbound-tcp -ua <你的测试用户UID>
输出的日志里会有十六进制的saddr,SIEM工具一般都能自动解析成明文IP,或者你可以在RSyslog里加个简单的解析规则(不过大部分SIEM都能处理)。
3. 可选:用iptables做日志备份
如果担心auditd有遗漏(比如某些特殊进程绕过了系统调用追踪),可以给每个用户的出站连接加iptables日志作为补充:
# 给用户UID为1001的出站连接打标记 iptables -t mangle -A OUTPUT -m owner --uid-owner 1001 -j MARK --set-mark 1001 # 记录这个标记的出站连接,日志前缀带上UID iptables -t filter -A OUTPUT -m mark --mark 1001 -j LOG --log-prefix "OUTBOUND_USER_1001: " --log-level info
这种方式的好处是日志更简洁,直接能在syslog里看到,但需要给每个用户单独配置,适合用户数量不多的团队。
4. 确保SIEM能正确解析字段
不管用auditd还是iptables,都要确保SIEM能提取到以下核心字段:
auid/UID:对应技术人员的堡垒机账号- 目标IP地址(auditd里的
saddr,iptables里的DST) - 目标端口(auditd里的
dport,iptables里的DPT) - 进程名(auditd里的
comm,区分是SSH跳转还是SOCKS代理)
验证步骤
配置完后一定要做测试:
- 用技术人员账号登录堡垒机,通过
ssh -J跳转到一台测试服务器,检查SIEM里是否有对应的日志 - 启动SOCKS代理
ssh -D 1080 localhost(或者直接用堡垒机的SOCKS配置),然后用curl测试:curl -x socks5://localhost:1080 http://testip.cn,检查SIEM里是否有对应的出站连接日志,并且关联到正确的用户名
备注:内容来源于stack exchange,提问作者Rodolfo Saccani

