小型计算与安全思维

2020-09-20 22:43:33

随着编程更多地成为一种职业而不是一门手艺,现代计算的故事就是大计算思维(规模、集中化、精英主义和家长主义)影响到它所涉及的一切的故事。在这个过程中,它创建了在大计算情况下有用的实践大厦 -  - ,这些实践被不假思索地应用到适当的界限之外,迫使小计算项目进入大计算设计的严格范围。我们必须开始批判性地考虑大计算与小计算的区别的一个主要领域是安全性。

小型计算系统应该是安全的。毕竟,它们是我们最私人的环境!它们是我们的日记,我们的艺术品,我们的梦想日记!但是,随着计算机安全变得专业化,它已经变得越来越专注于大计算环境,而在这些环境中良好的安全实践不利于小计算的基本原则。

在大型计算环境中,有价值的秘密(如信用卡号码)和理想的权力(如代表总统发推文的能力)被保存在单个实体(公司)拥有的一组机器上,代表那些信息和权力的表面所有者(特别是最终用户),并受到一群精英专业人士(软件工程师、运营团队、安全顾问)的非法访问(黑客/破解)的保护,他们利用对某些权力(超级用户和管理员特权、提交访问权限)的垄断来制定法律(安全政策),禁止尽可能多的不明确允许的操作。因为对手众多,有无限的时间和精力,因为宝藏是宝贵的,又因为法律总是有看不见的漏洞,这些精英专业人士构建了一层层的规则,不仅限制了用户(合法或非法)可以做什么,而且限制了他们可以收到什么样的反馈。

这种思想甚至已经应用到语言设计中:Java(和C++)有一种基本的访问控制形式,可以将成员标记为私有,而这些语言中的好风格是将所有成员数据标记为私有,并编写访问器函数,表面上是为了对建议的修改执行有效性检查。添加这个样板,而不是做一些明智的事情并创建定制的元表,这样赋值就会隐式地通过完整性检查(就像在Python和Lua中可能做的那样)。当然,这样的检查很少实现,它们也不能区分“授权的”和“未经授权的”调用类。 - 虽然C++有可以直接修改私有数据的“朋友类”,而且两者都支持使用继承层次结构来控制数据访问,没有比亲戚/朋友和局外人更小的粒度,所以除了类型系统的临时插入失败和增加代码库的行数之外,这些访问控制几乎是无用的。

存在需要大计算风格的安全性的系统。最适合这些系统的问题也存在, - 你的银行不仅应该有大计算式的安全性,而且应该有比它好得多的安全性。但是,这种模式在它使用的许多地方并不是真正明智的。例如,Google Docs(模拟一个字处理器,对多个用户同时编辑的支持有限)之所以被锁定,只是因为它是客户端-服务器,假设的本地优先或对等版本不应该如此专业化和分层;Microsoft Word是一个本地应用程序,没有合法的借口(尽管与大多数大型计算系统一样,真正的原因是,不必要的集中化是从不了解情况的用户那里榨取金钱的一种非常有效的方式)。

当我使用Google Docs时,我可以修改浏览器上运行的javascript,修改发送到服务器的cookie,以及修改URL参数。如果我做错了什么,我会从远程服务器的黑匣子里收到一条完全没有帮助的错误消息。这是因为,由于未能完全符合Alphabet公司期望的行为,我已经成为了一个对手,对手无法获得可能帮助他们做任何他们想做的事情的信息(因为他们可能想做的一些事情是,例如,获得每个购买过广告的人的信用卡号码)。当然,编写和维护Google Docs的谷歌工程师也面临同样的情况。在敌对情况之外,通过戳代码并解释错误消息来调查不太理解的代码片段称为调试,而小计算风气的一部分是不应该阻止用户调试。

从本质上讲,大计算和小计算的区别在于,在小计算中,用户从来不是对手。这是因为运行的代码拥有

首先,多用户客户端-服务器模型没有任何意义。在客户端-服务器模型中,控制单个服务器的人在功能上控制所有客户端。因此,存在通过将重要功能锁定在共享服务器上来囤积电力的动机,使得每个依赖于客户端的 - 在联机时因延迟而变慢,在脱机时运气不佳,并且总是处于策略或协议突然单边更改的威胁之下。

相反,我们应该期待点对点系统:直接用于实时通信,离线优先存储和转发方案用于其他一切。用于密钥交换和签名的非对称加密在这里仍然有意义,用于存储的基于散列的内容寻址也是如此。安全的scuttlebutt和IPF是未来面向小型计算的网络技术的良好模型:完全分布式,但又能抵御经常导致联合系统(如ActivityPub和IRC)瘫痪的各种威胁,因为所有节点都是平等的,并且所有节点都会相互复制(在加密强制的反欺骗措施下)。

嗯,与大型计算系统不同的是,小型计算系统(通常)不会有大量具有高度动机的专门攻击者。毛茸茸的熊不会用你奶奶的笔记本电脑,因为你奶奶的笔记本电脑上除了圣诞迷你照和可疑的裸体画什么都没有。我们的威胁实际上来自那些为低垂的果实进行大规模自动清扫的人们。因此,小型计算威胁建模看起来像是日常操作:使用加密,不让陌生人直接访问私有空间并限制他们可以访问的空间,区分敏感数据和非敏感数据,保护系统的完整性不受外界的影响。保护您的计算机面向网络的部分,同时最大限度地提高您自己对它的访问权限。

在这种情况下,我们绝对不需要的技术有:密码、SSO、证书颁发机构层次结构、名称服务器和主机文件、NAT防火墙、代码签名、chroot jails、内存布局随机化器、可执行符号剥离、单应用程序容器、以“无名之辈”身份运行的守护程序、用于将web API包装在web API、友元类和sudo上的web API。

我们可能需要研究的技术有:分布式哈希表、Chord路由、Merkel树、函数式语言、JIT、快速写入时复制、网络感知缓存逐出策略、拆分大脑对策、传递阻塞、存储和转发、消息传递、微版本化、日志记录和基于映像的环境。