这篇文章是开胃菜的主菜,那就是“X网络透明神话”(2018)。在这篇文章中,我们将介绍Arcan生态系统中的各个部分是如何结合在一起的,以推动桌面网络透明化的理念,以及它是如何为完全联网的桌面搭建平台的。
“透明性”是从用户的角度进行评估的;甚至不希望编写底层,使得它们对本地渲染的操作与它们在网络上的操作相同。局部最优情况必然不同于远程情况,机制也不尽相同,而且随着硬件和显示/渲染技术的进步,这种差异还会不断增长。
边带协议将桌面分成多个ipc系统,用于音频、元、字体、…。增加了在接近透明体验的情况下取得成功的难度,因为网络层需要考虑所有这些因素并尝试同步它们。
对第一个参数进行一点补充:它对窗口管理器也不应该是透明的,因为一些操作对用户界面端的安全性和期望值有截然不同的影响。例如,本地剪贴板/免打扰并不(应该)是一件复杂的事情。然而,当在整个网络中应用时,这些东西可能会降低其他任何东西的体验。其他示例是,您希望阻止某些敏感输入被意外转发到网络窗口,等等,过去确实发生过将错误的sudo密码发送到错误的ssh会话的情况。
这个目标已经研究了很长时间,正如2012/2013年的旧演示中的这一部分所建议的那样。那时,合成、变换和共享的拖拽/切片情况已经暴露在合成器共享和流之外;直到现在,它才以一种相对有限的形式出现在其他地方。
我们正在第三次或第四次重新实现这个想法,也是第一个被认为有足够好的设计来承诺使用和构建的想法。这个问题有许多有趣的细微差别,只有当你“试着去11”的时候才会出现。
像往常一样,这篇文章的某些部分将相当冗长和技术性。这里有一些捷径可以跳过,这样你就不会对似乎与你无关的细节失去兴趣。
从开发过程的一些简短片段开始-然后完成实现这一目标所需的工具和设计。它可能很短,但它有一个细微差别和细节的整个世界。
这是一个原生Arcan客户端,具有加密、本地GPU“热插拔”到软件渲染切换和压缩协商(H264):
以下是纯文本窗口的“服务器端”文本呈现,字体、样式和大小由演示设备控制-当窗口关闭时,客户端将迁移回:
在视频中,您可以看到(如果您斜视)通过网络在显示服务器之间进行实时迁移的实例,只是有一些曲折。例如,装饰、输入映射、字体首选项和其他视觉效果会发生变化,以与客户端当前演示的机器相匹配,并且音频也会随之出现,因为Arcan支持多媒体,而不仅仅是视频。
不太明显的是,边框颜色的变化(Durden的一项安全功能)被用来表示窗口来自网络来源,这一属性也可以用来过滤敏感动作。视频中的neo-vim窗口甚至在服务器端呈现其文本表面,因为它的UI驱动程序是使用我们的终端协议释放的TUI API编写的。这也是字体改变的原因;定义视觉效果和输入响应的是您当前使用的设备,而不是运行程序的设备。
另请注意,当窗口在远程端关闭时,客户端是如何“跳回”的;这是当涉及到“崩溃恢复能力”时,拥有系统思维的众多好处之一-IPC系统本身的设计方式是,必要的状态可以重建,动态的状态可以在需要时进行跟踪和重新协商。在需要时,IPC系统本身可以重建必要的状态,并在需要时跟踪和重新协商动态状态。其效果是客户端通过切换到另一显示服务器的指令与当前显示服务器强制分离。密钥库(在工作进行期间)允许您定义何时以及如何跳转到哪些机器的条件,并相应地挑选密钥。
该动态状态被跟踪,并且可以作为客户端级上的“重置”事项重新协商,当客户端打开本地连接时的基本保证特征集大致概括了所有可想象的窗口管理风格。不能依赖那些动态(重新)协商的协议。因此,当客户端迁移到有辅助功能需求的用户或处于VR环境中时,当客户端连接到那里时会添加适当的额外服务,然后当客户端移动到其他地方时会将其删除。这是作为协作功能的网络透明性的基本原语。
这里有三个构建块在起作用,一个名为Arcan-Net的工具,它结合了其他两个:A12和SHMIF。
A12是一种“进行中的工作”协议--它不是一些人所要求的AX12,而是“A”12。它努力实现基于连接性、内容类型和使用上下文的远程最佳压缩策略,尽可能延迟(表示端)使用数据本机表示(像素缓冲区作为最后手段,而不是默认);支持常见状态(如字体)的缓存;处理通常的“原子”操作(如剪贴板剪切和粘贴等)的取消。
SHMIF是用于与Arcan的大多数其他部分一起工作的IPC系统和API。它被设计为本地最优:无锁环形缓冲区中的共享内存和系统ABI优先于套接字/管道打包/解包传输;所需的最小持续系统调用集(对于最低权限沙箱);严格机制上的资源分配(DoS预防和漏洞利用缓解);基于固定的必需功能集,以及更高级别的用户控制的选择加入。
SHMIF有大量的功能,这些功能是为了纠正逐渐引入边带和老式的疏忽而对X类网络透明度造成的错误而特别挑选的。部分原因是用于组成桌面的所有必要和充分的数据交换都通过相同的IPC系统-该系统没有不必要的Linuxism需要引导。虽然它可能会有点疼,需要一些努力,但几乎没有什么地方可以收拾行李去其他地方,见鬼,它曾经在Windows上运行,现在仍然在OSX上运行。有传言称,有iOS和Android版本隐藏在某个地方。
与其他设置形成对比,您需要大量的IPC系统才能完成相同的工作;Wayland用于视频和一些输入以及一些元数据;PulseAudio用于音频;PipeWire用于一些视频和音频;D-Bus用于一些元数据和控件;D-Conf用于一些其他元数据;Spice/RFB(VNC)/RDP用于组合桌面共享;Waypie用于部分Wayland共享;X11用于部分X/XWayland共享:SSH+VT*+用于CLI/TUI和较不安全的Waytube/X11的终端仿真器;Synergy用于鼠标、键盘和剪贴板等等。这些解决方案中的每一个都有自己在身份验证和同步方面的优势(或缺乏),以不兼容的方式一次又一次地实现许多最困难的任务,但与这里的解决方案相比,最终仍然会缺少功能,并且代码行数会成倍增加。
回到阿尔坎网。它公开一个A12服务器和一个A12客户端,并充当shmif服务器、shmif客户端并负责管理身份验证密钥。从这个意义上说,它的行为类似于任何旧的网络代理。虽然不太深入实际细节,但展示一些设置可能会有所帮助。
这将侦听标记端口上的传入连接,并将它们映射到当前活动的本地连接点。要深入研究连接点的概念,请阅读Arcan与Xorg之间的比较,或者简单地考虑“桌面UI地址”;WM导出命名的连接点,并基于此分配不同的策略。
在客户端,我们可以使用Complex-Persistent选项,在新客户端到来时转发它们:
或一次性更简单的版本,它分叉/exec Arcan-Net并继承建立SHMIF连接所需的连接原语:
或者,这对于理解演示非常重要,它是通过WM实现的API函数:
这会触发绑定到客户端窗口的SHMIF实现从当前显示服务器连接断开,通过Arcan-Net连接到远程显示服务器连接,然后告诉客户端的应用程序部分重建基本状态,因为在某种意义上,前一个连接已经“崩溃”。然后使用相同的机制来定义回退(“如果连接丢失,请转到此处”)。这是适当弹性的自我修复方面。
有适用于所有可能的网络共享方案的WMAPI,因此可以将其作为用户界面处理,而无需任何命令行工作。
我之前提到过‘认证’,这是在哪里发生的?因此,这是实现的另一个仍在解决的部分。我们对密码工程相当满意,目前它正在接受外部/独立的审查。
对于那些精通世界上这一特殊部分的人来说,目前最精简的形式是AE/ETM,用于流密码的ChaCha8,用于KDF和HMAC的BLAKE3,用于非对称密钥交换的x25519(可选地使用初始MinimaLT,如临时交换)和类似PAKE的(可能改变为IZKP)n-未知-初始PK认证(而不是PKI),并定期更新密钥。
为了更好的安全性(和公正性):正如演示的那样,将应用程序转移到其他设备上是一件很好的事情,可以更好地利用计算机,否则当您有一个强大的工作站时,这些计算机就会被丢弃;让这些SBC投入使用,每台设备都有安全隔间,并且愉快地忽略大多数没完没了的投机性攻击,而不是允许缓解措施将处理能力恢复到十年前。
取SOPINE模块集群板,使用单一用户浏览器将它们引导到内存中,并将其作为您的“标签”,完成后拉下重置别针,非常昂贵的Chrome(或较便宜的Firefox)利用链将无法获取许多有趣的令牌,也无法获得有意义的持久性或横向移动。将其连接到您运行的Fuzzer所使用的相同收集/分类系统,并从空气中提取那些甜蜜的利用链条,准备重用负责任的披露。
以那些侵蚀隐私的应用程序和广告技术废话为例,这些应用程序和广告技术胡说八道,设法让它们进入一个社会必需品的位置,并“按设备”运行,但离你的人很远;用甜蜜的、GPT-3式的、看似合理的胡言乱语来灌输他们的感官输入,玷污任何滋生这种特定变态的机器学习趋势,直到他们被迫付出代价才能从故事中辨别真相。
实现出色的移动性:理想情况下,使用和体验应该足够无缝,以至于您不需要关心客户端本身当前在哪里运行-也就是说,继续沿着Sun Ray瘦客户机走向瘦应用程序的道路前进,与现代Web的精神和技术死胡同形成对比。
能够串行化它们的种子状态和增量状态并响应用于恢复/存储和重置的相应SHMIF事件的应用程序可以首先远程呈现为安全缺省值,而在后台与查看设备同步状态(如果那里存在相同或兼容的软件),并在完成时切换到设备本地执行。
然后让一个Arcan实例提供“在云中运行”的“真正的合成桌面”。让应用程序及其状态在穿越不安全空间时驻留在那里,并在安全且有必要时将相关应用程序重定向到您的设备。
可以将“窗口”视为应用程序的视图,将其状态视为既可在机器之间共享又可在人与人之间共享和传输的活动文档。如果你稍微调整一下老花镜的强度,人们所说的“剪贴板剪切粘贴”或“拖放”与“文件共享”相差无几。陷阱是有的,但这是我们要做的工作。
由于装饰、字体、语义调色板、输入绑定等由客户端正在呈现的设备定义,而不是由本地客户端的设置通过某些神抛弃的配置服务或字体规范来定义,因此可以考虑美学、可访问性和工作流程方面的差异,而不是强调。
拿起那个“窗口”扔给你的同事,他们可以拿出他们需要的状态,或者添加到上面,完成后再还给你。拼接您的网络摄像头,并将其定向到您的朋友,您可以在没有任何贪婪的中间人的情况下进行视频会议。
如前所述,Arcan-Net设置包括远程演示/与SHMIF客户端的交互。这包括外来的外部输入驱动程序和传感器,支持对Synergy等应用程序提供的“虚拟KMS”工作流进行高级处理。
拿出一台积灰的备用平板电脑,将其用作遥控器/显示器-或者将原本无用的二进制斑点特殊输入设备(想到的是Tobii Eyetracker)从VM的范围内转发出去。
获取这些状态栏应用程序,在您的计算群集或家庭自动化设置上运行它们,然后转发到您的查看设备,以便进行类似SCADA的监视和控制。
就我个人而言,每当节点发现一些东西到我的桌面上时,我的模糊集群就会通过转发包装器和控制客户端来“打电话回家”。通过利用显示服务器改进在相同通信通道上的调试,我可以在不使用符号、网络文件系统和其他东西的情况下完成崩溃检查。)出于这些目的,我将感兴趣的内容重定向给随叫随到的专家。
这些工具的各种组合支持的应用程序范围令人望而生畏。您的整个桌面,具有实时应用程序状态,实际上可以由在您的设备之间迁移的分布式组件组成-拖放:Able。
参考实现经常被使用,但在我们梦想将其推送(或放置)用于敏感任务之前,有许多事情需要整理。如果你想用这些工具来经营你的恐怖组织或其他可疑的生意,那就去吧。任何更诚实和体面的事情或任何人-在被告知它是合理安全的之前,都不要靠近。
围绕这一点的所有基础设施都将在很长一段时间内积极发展,并有一系列即将到来的有趣和先进的东西作为这项工作的重点。跟踪Readme.md中的更改。
安全特性(侧信道分析抵抗力、传递性信任)-机器学习正在监听,交互式网络也是如此;该领域已经有了成熟的工具,可以从相当小的测量中重建大量明文,而不必攻击密码工程或原语本身。
压缩视频直通协商-确保已经压缩的源(如视频)不存在打包/解包阶段。
Alt/AGP打包(Arcan渲染命令缓冲区)-当没有更好的表示法可用时,将中级图形及其类似虚拟GPU的后端作为绘制基元进行流式传输。
延迟/性能工作-更好的域特定运营商协议(UDT等)、针对特定客户端类型的渐进式压缩、缓冲背压缓解策略。网络状态截止日期估计,以获得更好的客户端动画。
希望能满足您的胃口--让我们通过解释演示中发生的事情来结束这篇文章。
正如您可能在顶部的示例命令行中或在前面的文章中看到的那样,“连接点”在这里是一个关键原语。它们允许窗口管理器(WM)和用户定义“UI地址”,以便客户端知道去哪里,并且WM知道使用哪个策略来管理所提供的IPC机制。
任何“段”(大致对应于一个窗口的一组音频/视频/事件IO)都有一个主连接点和一个后备连接点。如果主连接点出现故障,客户端将尝试重新连接到可变后备,然后在那里重建自身。这允许客户端在显示服务器实例之间移动,包括精心设计的共享、更安全/更健壮的多GPU支持等。
此回退通过调用target_devicehint通过WM提供。它有两种主要口味,“软”(仅在断开的连接上使用)和“硬”(现在离开或死亡)。
在视频中,使用了Durden WM。长话短说,它有压倒性的功能(我最后统计了600多条唯一路径),被构造成一个虚拟文件系统(甚至是可挂载的)。在此文件系统中,特定路径“/target/share/Migrate=connecpoint”告诉当前选择的窗口“硬”迁移到连接点。在本例中,正是A12://my_Other_MACHINE的特殊风格间接启动了Arcan-net来完成大部分肮脏的工作。
在堆叠工作区布局模式中,有一种称为“光标区域”的功能,即工作区的一部分,根据鼠标是移动、拖动还是单击来触发各种文件系统路径。
将窗口拖动到屏幕的左侧边缘区域时,绘制门户图形。
默认门户内容为噪音,生成一个连接到左侧笔记本电脑主机IP的“远程”帧服务器实例(为什么您可以在其中一个视频中看到远程墙纸的一部分)。
如果窗口放在门户上,请发送/target/share/Migrate命令,指向有问题的远程服务器。
如果拖动操作离开该区域,则终止远程处理连接并隐藏门户。