密码的进展

作者:Bruce Byfield

如果你想了解进化的实际例子,看看 GNU/Linux 密码系统。虽然它包括基本的 UNIX 密码结构作为痕迹器官,但破解者的自然选择迫使影子密码、MD5 算法和 PAM 的进化。密码甚至在引导管理器、远程登录格式和高级安全系统中找到了新的用途。所有这些工具每天都在使用,但通过仔细研究它们,你可以利用它们使你的系统更安全一些。

回到 20 世纪 70 年代的侏罗纪时代,标准的 UNIX 密码结构出现了。如今,许多用户通过 gdm 以图形方式访问它,否则它的结构并没有太大变化。要登录帐户,用户输入最多八个字符的密码(过去是六个或七个),密码使用 DES(数据加密标准)算法加密成密钥。此密钥存储在 /etc/passwd 的第二列中,任何用户都可以查看它。

发生变化的是竞争。如今,DES 算法可以在几秒钟内被破解。更糟糕的是,除了将每个密码的密钥存储在公共场所(任何入侵者都可以找到它)之外,标准结构几乎没有其他选择。另一种选择是对普通用户施加严格的限制,并阻止他们使用像 ls -l 这样的基本命令。虽然一些安全专家会满足于一台关机并放置在地球表面以下数英里的铅衬保险库中的计算机,但这些限制在很大程度上是不可接受的。

到了 20 世纪 90 年代中期,随着互联网的普及为破解者提供了更多机会,竞争变得激烈起来。由于这种压力,防御开始进化。最初仅作为附加组件提供,到 90 年代后期的现代黎明,这些防御彼此之间处于共生关系,并且是每个发行版的标准组成部分。

影子知道

影子密码得名于它们是基本密码的隐藏对应物。不同之处在于,它们不是 /etc/passwd 等公共文件的原生文件,它们的栖息地是 /etc/shadow 的第二列,该文件只有 root 用户才能读取。如果未为帐户设置密码,则该列用星号或感叹号标记,具体取决于发行版。只有 /etc/passwd 的密码列中的 “x” 标记了它们的经过。

自从影子密码成为标准以来,手动配置几乎消失了。尽管如此,影子密码通常都带有一组工具。pwconv 和 grpconv 使 /etc/shadow 和 /etc/passwd 中的用户和组条目保持同步,但这种内务管理通常在为帐户创建密码时自动完成。同样,pwunconv 和 grpunconv 允许创建常规密码,但很少有现代系统需要这种退化。关于唯一有用的影子密码工具是 Debian 的 shadowconfig,其开关选项可以快速告诉你是否启用了影子密码。

另一个进化的死胡同是 /etc/shadow 中的附加列。表面上看,这些列承诺可以额外控制密码何时更改、何时发出更改需要的警告以及帐户在密码未更改时何时禁用。这些列可能是一个主要的生存特征。不幸的是,它们必须为每个用户单独输入。更重要的是,它们必须以自 1970 年 1 月 1 日以来的天数输入。这种度量方法计算起来非常繁琐,以至于许多系统管理员将大多数列留空,并在其余列中填写不可能的大数字,以便他们可以忽略它们。

MD5 时代

基本密码结构的另一个改进是使用 MD5 加密算法。MD5 是由麻省理工学院教授兼 RSA Security 创始人 Ronald Rivest 开发的一系列算法的最新成果,RSA Security 是十多年来加密领域的领先公司。它是 MD2 的后代,MD2 是一种针对 8 位机器优化的算法,也是 MD4 的修改版,MD4 是 Rivest 及其合作者认为仓促发布的 32 位机器算法。MD5 于 1991 年首次发布到公共领域,并于 1994 年进一步修改。

如今,MD5 仍然是身份验证的标准,即使 Rivest 坚持认为它从未打算用于该用途。近年来,已经开发出更精细的算法,例如 IDEA、Skipjack 或 Bowfish,但没有一种算法被证明能够始终如一地优于 MD5 并取代它。

MD5 在 90 年代中期作为 GNU/Linux 的附加组件提供,现在是大多数发行版的标准组成部分。从安全角度来看,MD5 相对于标准密码结构中使用的 DES 的优势在于,它允许更长的密码并提供更复杂的加密。启用 MD5 后,密码最多可达 256 个字符。无论密码的实际长度如何,MD5 都会通过四轮加密来创建 256 个字符的密钥。由于此过程是不可逆的(至少,并非无需相当大的努力),因此 MD5 被归类为“单向哈希”。

MD5 是每个主要发行版安装期间的一个选项。虽然 MD5 可能会在大多数现代工作站或网络上的网络信息系统中造成问题,但没有理由不使用它。如果你不确定是否启用了 MD5,请检查 /etc/shadow 中的密码列是否以 $1$ 开头,或者在 /etc/pam.d 中的文件中搜索以 “md5” 结尾的行。如果没有,则定位必要的文件并重新配置系统非常耗时,以至于新用户可能会倾向于升级或重新安装来代替。

清晰的骨架:PAM

影子密码和 MD5 的兴起可能会导致过度多样化,每种附加组件的组合都需要其自身版本的命令,如 passwd 或 login。可插拔身份验证模块 (PAM) 避免了这个问题。PAM 可以被认为是身份验证所涉及的命令和进程与对其的任何修改之间的中介。PAM 与影子密码和 MD5 一起发展,自 1997 年左右以来已在发行版中提供。

最初,PAM 在 /etc/pam.conf 中配置。但是,在大多数发行版中,此文件现在就像阑尾一样退化了。相反,PAM 使用 /etc/pam.d 目录。

/etc/pam.d 中的少量文件定义了哪些用户或组(如果有)可以使用特定命令。例如,/etc/pam.d/su 调节 su 命令。其他限制可以在 /etc/security/limits.conf 中设置。但是,/etc/pam.d 中的大多数文件充当密码系统增强功能和其他命令之间的中介,指向 /lib/security 中的库。这些文件的示例包括 chfn、chsh、cron、gdm 和 login。此功能不仅允许使用影子密码或 MD5,而且还简化了高端安全解决方案(如 Kerebos)的添加。

/etc/pam.d 中的文件提供了太多的选项,这里无法详细介绍。但是,这些文件包含大量注释,并且相对容易理解。控制密码系统基础知识的文件(如 passwd、gdm、login 和 su)尤其有用。例如,login 可以控制 root 登录,对登录施加时间限制并设置登录尝试的记录方式。同样,如果你在系统上使用 su 而不是更可控的 sudo,/etc/pam.d/su 可以帮助你设置命令的使用限制。而且,虽然你不想更改 pam.d 文件中对安全库的引用,但你可能想查看与它们一起使用的选项——例如,注重安全的人可能想避免 nullok,它允许用户更改空密码。更进一步,chsh 可用于将用户可以使用的 shell 限制为 /etc/shells 中的列表。简而言之,虽然浏览 pam.d 目录可能会让你感到选项焦虑,但你会发现这项努力是学习如何使你的系统更安全的重要一步。

进化压力和新的用途

影子密码、MD5 和 PAM 都提高了系统的安全性。但是,请记住,它们提供的安全性是相对的。给定足够的计算能力和足够的时间,暴力破解攻击可以破解任何系统。

此外,随着硬件和破解工具的每次进步,这种努力变得越来越容易。为了说明问题,1994 年,RSA Security 系统估计,对普通机器的暴力破解攻击将在 24 天内成功。相比之下,mdcrack(一种可用于测试启用 MD5 的系统安全性的工具)的开发者声称,使用 2.2 Linux 内核,平均机器可以在 20 秒内破解 56 个字符的密码。虽然这几乎是破解 Windows 机器平均时间的两倍,但显然 Linux 用户没有理由沾沾自喜。情况只会变得更糟。

应对这种压力的一种方法是更好地利用密码系统。许多用户,尤其是在家里的用户,在安装后就忘记了密码系统,并且除了最基本的功能外,什么都不使用。然而,稍微注意一下细节就足以让脚本小子们发脾气。例如

  • 在 /etc/shadow 中设置密码可以使用的天数。该方法很麻烦,但定期更改密码可能会阻止更多依赖时间而非计算能力的暴力破解攻击。

  • 在 /etc/pam.d/passwd 中增加最小和最大密码长度。在其他条件相同的情况下:密码越长,破解所需的时间就越长。

  • 降低 /etc/pam.d/gdm 中的最小登录尝试次数。使用香肠般手指的合法用户可能会抱怨,但任何尝试暴力破解攻击的人都可能会感到恼火而离开。

  • 批准所有用户密码或坚持要求它们由 pwgen 等程序生成,该程序创建安全密码。密码是“password”或他们最小的女儿或金鱼的名字的用户数量令人沮丧得无法形容。

  • 安装像 cracklib2 这样的程序,它可以防止使用容易猜测的密码。你可能需要添加公司、产品和用户名等的自定义字典,这些名称不能用作密码。目前,cracklib2 需要一些耐心才能设置,以及取消注释 /etc/pam.d 中的许多行,但它或类似的软件包很可能在未来几年内成为主要发行版的标准组成部分。

  • 不允许 root 用户远程登录。

  • 注意过期的密码或没有密码的用户帐户。这两者都可能是系统的入口点。

  • 如果你不使用电脑或网络连接,请关闭它们。忘记你的系统已经运行了多久的极客男子气概。如果它没有连接,那么远程破解就不会发生。

应对现代计算机风险增加的另一种方法是在系统上更多地使用密码身份验证。以下是一些你可以添加密码的地方(如果它们尚不存在)

  • BIOS:使用密码并确保无法通过软盘或 CD 绕过它。

  • 引导管理器:使用 LILO 的 password 命令或 GRUB 的 lock 命令。

  • 远程服务:ssh 发送加密密码——Telnet 和 FTP 不发送。猜猜你应该使用哪个?

当然,仅仅密码并不能保护你的系统免受任何人(除了最原始的脚本小子)的攻击。而且,密码越难破解,就越难记住——用户也越有可能将其写在便利贴上,然后贴在键盘底部。

尽管如此,没有理由不使用密码提供的任何安全性。而且绝对没有理由绕过密码系统或削弱它——这两种选择都开始出现在现代发行版中,希望使 GNU/Linux 看起来更像普通用户熟悉的其他操作系统。工具就在那里,为什么不使用它们呢?

Password's Progress
Bruce Byfield 是一位合同技术作家、产品经理和记者。在远离电脑的时候,他与外来鸟类交往,听朋克民谣,并为了快乐而进行漫长而痛苦的跑步。可以通过 bbyfield@axionet.com 与他联系。
加载 Disqus 评论