)
Linux命令-xhostX11 访问控制 简介 语法⚙️ 选项和参数 示例示例 1查看和修改访问控制状态示例 2xhost 的危险演示示例 3安全的替代方案——SSH X11 Forwarding示例 4使用 xauth 实现主机级授权替代 xhost示例 5xhost 在现代系统中的实际用法——允许本地用户切换⚠️ 注意 相关命令 总结快速参考xhost是 X Window 系统的主机级访问控制程序用于控制哪些主机可以连接到 X 服务器。它是最早的 X 安全机制极其粗粒度且不安全xhost 会完全禁用访问控制让任何主机都能访问你的 X 显示器。严重安全警告xhost 允许任意远程主机连接你的 X 显示器包括抓取屏幕内容、记录键盘输入、注入鼠标事件永远不要在生产环境的 X 会话中执行xhost 。现代安全实践使用xauth SSH X11 Forwarding 代替。 简介X Window 系统在架构上天然支持网络透明性——X 客户端可以在远程主机上运行通过网络将图形请求发送到本地 X 服务器。xhost是控制这种访问的第一道也是最弱的一道防线。访问控制的三层机制机制粒度安全性现状xhost主机级整个主机极低已过时xauth(MIT-MAGIC-COOKIE-1)会话级每个 cookie中等当前主流SSH X11 Forwarding用户级SSH 认证高推荐XSECURITY 扩展应用级细粒度权限最高新兴方案安装方式# Debian/Ubuntu$sudoapt-getinstallx11-xserver-utils# RHEL/CentOS/Fedora$sudoyuminstallxorg-x11-xauth# RHEL 7$sudodnfinstallxorg-x11-xauth# Fedora / RHEL 8# 验证$whichxhost /usr/bin/xhost 语法xhost[选项][[-]主机名]⚙️ 选项和参数参数说明主机名添加主机到允许列表-主机名从允许列表移除主机允许所有主机连接禁用所有访问控制极其危险-恢复默认仅允许当前列表中的主机(无参数)显示当前访问控制状态和允许列表SI:localuser:用户名允许指定本地用户Server Interpreted 方式-SI:localuser:用户名撤销指定本地用户 示例示例 1查看和修改访问控制状态# 查看当前访问控制状态$ xhost access control enabled, only authorized clients can connect SI:localuser:cyjia# 状态说明访问控制已启用仅授权客户端可连接# 当前允许本地用户 cyjia 任何已添加到列表的主机# 查看详细信息含主机列表$ xhost access control enabled, only authorized clients can connect INET:192.168.1.50 INET6:::1 LOCAL: SI:localuser:cyjia# INET: 特定 IPv4 主机# INET6: 特定 IPv6 主机# LOCAL: 所有本地连接Unix socket# SI:localuser: 特定本地用户示例 2xhost 的危险演示# ⚠️ 危险操作仅在受控测试环境中执行# 此演示展示 xhost 究竟有多危险# Step 1: 在本地执行 xhost $ xhost access control disabled, clients can connect from anyhost# Step 2: 从远程主机连接本地 X 服务器# 在远程主机上执行$exportDISPLAY192.168.1.100:0 $ xeyes# 结果远程的 xeyes 窗口出现在本地桌面上# 远程抓屏截取本地桌面$ xwd-display192.168.1.100:0-root-outscreenshot.xwd# 远程程序可以捕获整个屏幕内容# 远程键盘记录读取所有键盘事件$ xinput-display192.168.1.100:0 test-xi2--root# 输出所有键盘和鼠标事件包括密码输入# Step 3: 恢复安全状态$ xhost - access control enabled, only authorized clients can connect# 检查状态$ xhost access control enabled, only authorized clients can connect# 预期结果# xhost 后 → 任何主机可连接 → 演示远程抓屏/键盘记录 → xhost - 恢复安全示例 3安全的替代方案——SSH X11 Forwarding# 安全方式SSH X11 Forwarding # 这是推荐的远程 X 应用访问方式# 客户端从本地连接到远程$ssh-Xuserremote-host# -X: 启用 X11 Forwarding基本# -Y: 启用可信 X11 Forwarding跳过某些安全检查兼容性更好# SSH 登录后X11 转发自动生效userremote-host:~$echo$DISPLAYlocalhost:10.0# 注意远程的 DISPLAY 被设置为 localhost:10.0# SSH 创建了一个代理 X 服务器在本地端口转发到本地真正的 X 服务器userremote-host:~$ xclock# xclock 窗口在本地桌面上显示但实际运行在远程主机# SSH 自动处理了 xauth cookie无需手动 xhost 配置# SSH 服务端配置确保转发已启用$sudogrep-ix11 /etc/ssh/sshd_config X11ForwardingyesX11DisplayOffset10X11UseLocalhostyes# 没有 SSH 转发时调试$ssh-v-Xuserremote-host21|grep-ix11 debug1: Requesting X11 forwarding with authentication spoofing. debug1: X11 forwarding requested butDISPLAYnotset# 如果看到 DISPLAY not set检查远程 ~/.ssh/rc 或 /etc/ssh/sshd_config# 预期效果# ssh -X → 登录远程 → 运行 xclock → 图形在本地显示 → 全程加密无 xhost 需求示例 4使用 xauth 实现主机级授权替代 xhost# 不使用 xhost 而是通过 xauth 精确授权某个远程主机# Step 1: 在本地导出 X 认证 cookie$ xauth extract -$DISPLAY/tmp/xauth_cookie $chmod600/tmp/xauth_cookie# Step 2: 将 cookie 复制到远程主机$scp/tmp/xauth_cookie userremote:/tmp/# Step 3: 在远程主机导入 cookie 并设置 DISPLAY$sshuserremote userremote:~$ xauth merge /tmp/xauth_cookie userremote:~$exportDISPLAY192.168.1.100:0 userremote:~$ xclock# 成功xclock 窗口出现在本地桌面# 注意不需要 xhost 数据通过 X 协议传输非加密# Step 4: 更简洁的方式——管道方式$ xauth extract -$DISPLAY|sshuserremotexauth merge -userremote:~$exportDISPLAY192.168.1.100:0 userremote:~$ xeyes# Step 5: 清理userremote:~$ xauth remove$DISPLAY$rm/tmp/xauth_cookie# 对比# xhost → 允许所有主机密码无需验证# xauth 手动传输 → 仅持有正确 cookie 的主机可连接# SSH X11 Forwarding → 加密 自动 cookie 管理最佳方案示例 5xhost 在现代系统中的实际用法——允许本地用户切换# 场景从 root 用户切换到普通用户后X 连接被拒绝$sudo-i# echo $DISPLAY:0# xclockError: Cantopendisplay: :0# 原因xauth cookie 属于原始用户root 无法访问# 解决方式一使用 SI:localuser比 xhost 安全得多$ xhost SI:localuser:root localuser:root being added to access control list# 现在 root 可以访问 X 显示器# xclock # 正常显示$ xhost access control enabled, only authorized clients can connect SI:localuser:root SI:localuser:cyjia# 恢复$ xhost -SI:localuser:root localuser:root being removed from access control list# 解决方式二传递 xauth cookie推荐$ xauth list|grep$(hostname)/unix:0 myhost/unix:0 MIT-MAGIC-COOKIE-1 abc123def456...# 切换到 root 后添加相同的 cookie$sudoxauthaddmyhost/unix:0 MIT-MAGIC-COOKIE-1 abc123def456... $sudo-i# xclock # 正常显示# 预期效果root 用户成功访问 X 显示器无需使用危险的 xhost ⚠️ 注意为什么 xhost 是危险的xhost 攻击面任何能路由到你主机的机器局域网、甚至互联网如果没有防火墙都可以截取屏幕截图xwd -root记录所有按键键盘记录器注入鼠标点击和键盘输入远程控制你的桌面打开任意窗口显示内容读取剪贴板内容MIT-MAGIC-COOKIE-1 的局限虽然比 xhost 安全但 cookie 在网络中也是明文传输的可以被动窃听获取。SSH X11 Forwarding 通过加密通道解决此问题。现代发行版的默认配置大部分现代 Linux 发行版启动 X 时使用-nolisten tcpTCP 端口 6000 不监听。此时即使xhost 也只能影响本地 Unix socket 连接但不能依赖这个作为安全措施。# 检查你的 X 服务器是否监听 TCP$sudonetstat-tlnp|grep6000如果有输出说明 TCP 监听中 $sudoss-tlnp|grep6000同上# 确保 X 启动时不监听 TCP# 查看 Xorg 进程参数$psaux|grepXorg|grep-vgrep... /usr/lib/xorg/Xorg :0-seatseat0...-nolistentcp...# -nolisten tcp 标志存在即为安全 相关命令命令说明xauthX11 认证管理MIT-MAGIC-COOKIE-1现代安全方案ssh -XSSH X11 Forwarding加密安全的远程 X 访问xlsclients列出当前 X 显示器上的客户端xdpyinfoX 显示器综合信息查询XorgX 服务器程序命令行参数含-nolisten tcp 总结xhost是 X11 安全史上最重要的反面教材它完美展示了便利性优先于安全性的设计带来的后果xhost 是安全灾难完全开放 X 显示器等同于交出鼠标和键盘xhost 主机名也极弱主机级授权不能防止局域网内其他机器的攻击xhost SI:localuser是唯一的合理用法允许特定本地用户访问 X 显示器SSH X11 Forwarding 是唯一推荐方案加密传输 自动 cookie 管理 用户级认证如果必须在两台主机间共享 X 应用永远使用ssh -X而不是xhost 。记住见过xhost 的命令行就应该警惕它背后的安全风险。