我曾经做过一份有趣的工作,内容是为我们将用于安全相关项目的系统设计强化程序。这大概是 15 年前的事了,当时不仅关于我使用的 Linux 发行版的指南有点少,而且我们所做的事情也很小众。起初,我想当然地认为我可以编写一个脚本来关闭一些漏洞,这些漏洞源于守护进程1,这些守护进程因为没有理由而一直运行:httpd、sendmail,诸如此类的东西。当然,这确实涉及到了这些,但后来我意识到还有更多的事情要做,并开始深入研究。
因此,在处理完这些守护进程之后,我查看了用户和组。然后是文件系统、网络、存储。我把最可怕的两部分留到了最后,原因各不相同。
第一部分是内核。我最终手工制作了一个内核,删除了我认为我们不太可能需要的任何东西,然后在几次重启后,当我发现系统无法启动时,因为我以为我理解的东西比我意识到的更……深奥。我不是内核开发人员,这让我深刻体会到这些人的技能有多高超。至少,在我做这件事的时候,代码和选项都比现在少。另一方面,我不得不破解回到所需的状态,而现在有比那时更多的精简内核和系统可供选择。
我留到最后的另一部分是修剪已安装的操作系统应用程序和相关的实用程序。同样,现在有比那时更容易使用的精简选项,但我也有一些奇怪的要求——我相信我们需要 Java,例如,它有,或者曾经有……好吧,让我们说很多依赖项。大多数现代 Linux 发行版3一开始就安装了很多组件,这样您就可以快速入门,而无需担心为每个要运行的外部软件找出依赖项。
这是可以理解的,但我们需要意识到,当我们这样做时,我们正在进行可用性/安全性权衡。5 您添加到系统中的每个实用程序、每个库、每个可执行文件都会增加您的攻击面和漏洞的可能性。
问题不仅仅在于您正在引入漏洞,而是一旦漏洞存在,它们往往会一直存在。不仅仅是在您需要的代码中,更糟糕的是,在您不需要的代码中。很少有值得称赞的黑客6 会花费时间检查旧代码并删除不再需要的依赖项。这是一项枯燥、复杂的任务,通常只是更容易将垃圾7 留在原地,并在下一个版本中发布一个稍大的软件包。
有时,代码确实会被重构和剥离:最常见的是,与安全相关的代码。这是一件非常好的事情™,但事实证明这远远不够。我写这篇文章的原因是最近在 The Register 上看到的一篇关于 beep
命令的8 故事。此命令使用安装在大多数 PC 兼容主板上的小扬声器发出小噪音。在过去,这是一个有用的实用程序,但现在大多数主板都不再配备相关硬件,因此它几乎无关紧要了。问题8 是,在系统上安装和使用 beep
命令允许信息泄露给缺乏相关权限的用户。这可能是一件非常糟糕的事情。这里有一个很好的简短概述 here。
现在,beep
在我用来写这篇文章的系统(Fedora 27)上默认未安装,尽管它可以从我启用的标准存储库之一轻松安装。有点令人欣慰,尽管它无论如何也不是这台机器的可能攻击媒介。
但是,我在这台系统上安装了哪些是易受攻击的,而我从未想过要检查的?忘记所有我不需要开启的内核参数,但这些参数已由发行版启用,以便于在多个系统上使用。忘记我安装并每天使用的应用程序。甚至忘记我安装过一次但忘记删除的应用程序。那些我什至不知道存在,并且从未意识到可能会影响我的系统安全状态的应用程序呢?我不知道,也没有什么办法可以找出答案。
此系统不运行业务关键型操作。当我第一次获得它并安装操作系统时,我决定倾向于可用性,并准备好丢弃9 它并在出现妥协问题时重新开始。但这并非数百万其他系统的情况。我敦促您考虑您在系统上运行什么、安装了什么以及您真正需要什么。修补您需要的,删除您不需要的。现在是春季大扫除的时候了。10
1. 我非常想把这个词拼写成 dæmons,但我认为这可能是我对中古英语的痴迷太过分了。2
3. 我最感兴趣的是 (GNU) Linux,因为我是一位坚定的开源倡导者,并且因为它是最熟悉的操作系统。4
8. 除了建议的修复似乎使初始问题变得更糟的二阶问题之外……
本文最初发表在 Alice, Eve, and Bob – a security blog 上,并经许可转载。
评论已关闭。