如何将X Window/VNC会话录制文件与认证用户名元数据关联生成可信审计记录
嗨,我完全懂你的处境——要搭建远程系统访问的可信审计记录,得把录制文件和已认证的用户名牢牢关联起来,还不能让用户察觉录制在运行,更不能依赖从会话内部启动工具(毕竟那样不仅会暴露,还可能被用户关掉)。结合rfbproxy和ffmpeg的特性,我给你几个贴合审计需求的可行方案:
1. 从RFB代理层捕获认证信息(最可信的方式)
rfbproxy作为VNC会话的中间代理,能直接拦截协议层面的认证交互,这是获取可信用户名的最佳途径,完全不受会话内部操作影响:
- 先调整VNC服务的监听配置:让VNC服务只监听本地
127.0.0.1(比如端口5900),然后用rfbproxy监听公网可访问的端口(比如5901),将流量转发到本地VNC端口。 - 改造rfbproxy(或用脚本包装),在认证成功的节点提取用户名,直接生成包含用户名的录制文件名,格式可以是
vnc-audit-<用户名>-<时间戳>.rfb。如果rfbproxy默认不输出认证用户名,你可以修改它的日志逻辑,把认证成功的用户名写入临时日志文件,再用脚本实时读取。 - 后续如果需要转成视频格式,直接用ffmpeg读取这个带用户名的rfb文件即可,文件名保持一致,自然完成关联:
这种方式的核心优势是用户名来源绝对可信,完全绕过会话内部的篡改风险,而且录制对用户完全透明。# 示例:启动带用户名捕获的rfbproxy(假设已通过脚本处理日志提取用户名) rfbproxy -l 0.0.0.0:5901 -r 127.0.0.1:5900 -o "vnc-audit-$(get-authenticated-user)-$(date +%Y%m%d%H%M%S).rfb" # 转成MP4视频 ffmpeg -i vnc-audit-john-20240520143000.rfb -crf 23 vnc-audit-john-20240520143000.mp4
2. 通过PAM/系统会话管理器触发录制
远程用户登录时必然会经过系统的PAM认证或会话管理流程,我们可以利用这个时机自动启动录制,直接从系统层面获取可信用户名:
- 找到VNC服务对应的PAM配置文件(比如
/etc/pam.d/vncserver),添加一行触发脚本的配置:session optional pam_exec.so /usr/local/bin/start-vnc-audit.sh - 编写
start-vnc-audit.sh脚本,通过PAM提供的环境变量获取用户名和会话DISPLAY,后台启动录制工具:#!/bin/bash # 从PAM环境变量获取可信用户名和显示端口 USERNAME=$PAM_USER DISPLAY=$PAM_XDISPLAY TIMESTAMP=$(date +%Y%m%d%H%M%S) AUDIT_DIR="/var/vnc-audit" mkdir -p $AUDIT_DIR # 用ffmpeg录制X11会话(后台运行,避免被用户察觉) nohup ffmpeg -f x11grab -i $DISPLAY -crf 23 ${AUDIT_DIR}/vnc-audit-${USERNAME}-${TIMESTAMP}.mp4 > /dev/null 2>&1 & # 或者用rfbproxy录制RFB流(如果需要保留原始协议数据) # VNC端口通常是5900 + DISPLAY编号,比如DISPLAY :1对应5901 # VNC_PORT=$((5900 + $(echo $DISPLAY | cut -d: -f2))) # nohup rfbproxy -l 127.0.0.1:$VNC_PORT -r 127.0.0.1:$VNC_PORT -o ${AUDIT_DIR}/vnc-audit-${USERNAME}-${TIMESTAMP}.rfb > /dev/null 2>&1 & - 把录制文件存到用户无权限访问的目录(比如
/var/vnc-audit),权限设置为仅审计人员可读,同时用nohup或systemd管理录制进程,确保用户在会话内看不到也杀不掉。
3. 基于X11会话属性关联用户名(适合已有X11会话的场景)
如果是X11远程会话,系统会为会话设置一些可读取的全局属性,你可以通过这些属性获取用户名,再关联到录制文件:
- 先确认当前X11会话的用户属性,比如用
xprop -display $DISPLAY -root _NET_WM_USER可以获取登录用户名。 - 启动ffmpeg时,先读取这个属性生成带用户名的文件名:
注意:这种方式的可信度稍低,因为如果用户有X11权限,可能会修改会话属性篡改用户名,所以更适合非高风险场景。DISPLAY=":1" # 提取X11会话的用户名 USERNAME=$(xprop -display $DISPLAY -root _NET_WM_USER | awk '{print $3}' | tr -d '"') ffmpeg -f x11grab -i $DISPLAY -crf 23 /var/vnc-audit/vnc-audit-${USERNAME}-$(date +%Y%m%d%H%M%S).mp4
核心注意事项
- 优先选择可信数据源:用户名必须来自系统认证层(PAM、RFB代理),绝对不能用会话内部的环境变量或用户输入,避免被篡改。
- 保持录制隐蔽性:录制进程要以root或专用审计用户启动,放到后台运行,不要在用户会话的进程列表中暴露。
- 权限管控:审计文件存储目录要严格限制权限,只有授权的审计人员才能访问,防止文件被篡改或删除。
内容的提问来源于stack exchange,提问作者symcbean
相关产品推荐
相关产品推荐

