X11 跨主机共享:FamilyWild 的妙用
Sharing an X11 Server Across Hosts with FamilyWild
在容器、chroot 或 SSH 环境中运行 X11 应用时,你是否常被 Authorization required 错误困扰?问题往往出在 .Xauthority 文件中的 hostname 不匹配。文章揭示了只需修改一个二进制字段,将 FamilyLocal 改为 FamilyWild,即可让 Cookie 匹配任意主机名。这种方法比使用 xhost + 更安全,因为它保留了 Cookie 验证机制,仅移除了主机名限制。通过简单的 sed 命令生成便携式 .Xauthority 文件,即可轻松实现跨环境 X11 转发,同时保持必要的安全隔离。
xhost + 虽然能让一切运行,但它完全关闭了基于主机的访问控制,让任何客户端都能无需 Cookie 连接显示,而 FamilyWild Cookie 则能在移除主机名限制的同时,依然要求客户端出示密钥,从而锁住大门。
HN 评论区
17- somat
把 X 当作一种共享的网络附加显示器来运行挺有趣的,当然,由于所有窗口操作都必须通过 CLI 工具完成,它实际上只适合作为一种大型控制室风格的显示方案。
不过,对于任何人来说,能随手把一个应用扔到主显示器的大屏幕上,还是挺酷的。
- yjftsjthsd-h
> 你经常会看到有人建议用 xhost + 作为“让它直接跑起来”的解决方案,确实可以——但这完全是通过彻底关闭基于主机的访问控制来实现的。这样一来,来自任何主机的任何客户端都可以无需任何 cookie 就连接到你的显示器。
> 在单用户机器上,这听起来似乎无害,但 X 在客户端之间没有任何隔离:任何能接触到服务器的人都可以读取你的按键记录、抓取任意窗口的内容,甚至注入合成输入。xhost + 会把这种能力交给机器上的每个本地用户,如果你的服务器监听 TCP,那网络上的任何人也能拿到。即使是范围更窄的 xhost +local: 也会信任机器上的所有 UID。
现代 Xorg 还支持 TCP 吗?我知道它默认不启用,而且上次我想通过网络运行 X11 时,最终是直接用 socat 对接 socket 文件。按用户控制访问在某些特定威胁模型下可能有点价值,尤其是容器除非你特意把 socket 给它,否则根本连不上。(实际上,能不能直接把 socket 的权限设为 chmod o-rwx?)
所以,我真的很怀疑在明明可以直接用 xhost + 的情况下,我们实际上真的需要更复杂的修复方案。
- lysace
回想起 1996 年:我们在大学里有那种笨重又昂贵的 Sun 计算机,我们叫它们“CPU 服务器”。在家我们用 486 运行 Linux 配 XFree86(有时是 Windows 95/NT 配 Exceed)。中间隔着一个 10 Mbit/s 的以太网。所有机器都有公网 IP。明文 telnet 还是当时的常态。
我们就那样在这些 Sun 机器上运行一些课程所需的奇怪 X11 应用。即使是用低配的 486,本地浏览网页也比远程快。