第九章:Sudo用于入侵检测

上一章提到的问题之一是篡改用户的路径。对路径进行消毒是有帮助的,但我们的入侵者可能会用他自己的危险版本替换实际的 /usr/bin/passwd 命令。Sudo 1.8.7及更高版本可以在运行命令之前验证命令的加密摘要 ——digest (或校验和——checksum或哈希——hash),从而防止此类攻击。

为什么这很有用?加密摘要是一种数学变换,为任何数据块(如文件)创建固定长度的字符串。即使源文件中的微小更改也会极大地改变生成的摘要。如果sudo知道合法passwd命令的正确加密摘要为X,但磁盘上的passwd命令摘要为Y,sudo将拒绝运行该命令。有关加密摘要的更多信息,请查看我的书 PGP&GPG (No Starch Press,2006)。

入侵者并不是唯一可能更改包含命令的文件的人。如果您对包含该命令的目录具有写访问权限,则可能会意外地自己更改它。同样,摘要可以保护您免受对其限制感到不满的用户的攻击。“我知道怎么解决这个问题,我只需要root!”

摘要式验证可以防止您运行有人通过 mv 命令意外复制的 dd 副本。运行它会有什么坏处吗?可能不会,除非你打算移动一些名字很奇怪的文件。但此类错误可能是灾难性的,它们是此操作系统实例严重损坏的第一个迹象。您需要尽可能多的系统损坏预警。

使用摘要进行命令完整性验证有两个组成部分:生成摘要和编写验证摘要的sudoers规则。

生成摘要

不同的类Unix操作系统有不同的命令来计算加密摘要。(因为他们可以。)我建议使用更通用的openssl工具来生成校验和,而不是建议使用 sha512 命令,只让你发现你需要 sha512sum ,因为你使用的是Linux。

Sudo支持SHA摘要算法的几种不同变体:SHA-224、SHA-256、SHA-384和SHA-512。更高的数字意味着摘要更难进行逆向工程,但创建和验证摘要也需要更多的计算能力。此外,随着强度的增加,消化时间会变长。SHA-224为当今的硬件提供了足够的保护,可以抵御所有现实的攻击。

等号后的56个字符串是 /usr/bin/passwd 文件的SHA-224摘要。大多数程序都有独特的摘要。有些程序有多个名称,例如,sendmail 命令也被称为 newaliasesmailqhoststatpurgestat,可能还有其他一些名称。(我有自己喜欢的sendmail名字,但孩子们可能会偶然发现这本书。)你可以在sudoers别名中列出所有这些名字。这就引出了下一个话题。

Sudoers中的摘要

使用加密摘要(cryptographic digest),就像其他标签一样。在等号后加上摘要类型、冒号和摘要本身,然后是命令列表。除非您有多个具有相同摘要的命令,否则每个允许的命令可能需要一个规则。由于SHA-224摘要的长度为56个字符,因此我在所有这些示例中都截断了实际摘要。

当我要求sudo运行passwd时,sudo会计算 /usr/bin/passwd 的SHA-224摘要。如果生成的摘要与sudoers规则中的摘要匹配,sudo将运行该命令。否则,您将收到通用的“not allowed”消息。如果 sudo –l 显示您有权运行命令,但每次尝试运行该命令都会收到“not allowed”的消息,则该命令的校验和与sudoers中的文件校验和不匹配。

如果多个二进制文件具有相同的摘要,那么您可能在某个地方犯了错误。仔细检查您的openssl命令。如果多个程序文件确实具有相同的摘要,那么它们可能是伪装的同一程序,例如sendmail及其posse。你可以这样列出具有相同摘要的命令:

如果你想计算系统上每个合法二进制文件的加密摘要,我建议你编写一个脚本来实现。如果脚本允许你为命令别名预定义命令组,那就更好了。

摘要和多操作系统

一旦你集中了你的sudoers策略,你可能会发现你需要一个允许对单个命令进行多个摘要的策略。Ubuntu上的 sendmail 命令的摘要将与FreeBSD上的 sendmail 命令不同,FreeBSD 9.2上的 sendemail 命令将与FreeBSD 9.3不同。

你如何应对这种情况?每个操作系统使用一个命令别名。

我有没有提到使用脚本为您的操作系统生成摘要?

您不希望在网络上的每台机器上重新计算此策略。最好一次性设计此策略并将其分发到网络的其他部分,正如我们在下一章中讨论的那样。