默认情况下,大多数当前的 Linux 发行版都没有安装Shadow Suite。这包括 Slackware 2.3、Slackware 3.0 和其他流行的发行版。其中一个原因是原始 Shadow Suite 中的版权声明对于收取费用情况下的再分发不够明确。Linux 使用 GNU 版权(有时称为 Copyleft),允许人们将其打包成方便的软件包(如 CD-ROM 发行版)并收取费用。
Shadow Suite 的当前维护者 Marek Michalkiewicz <marekm@i17linuxb.ists.pwr.wroc.pl> 从原始作者处获得了源代码,该源代码采用 BSD 风格的版权,允许再分发。现在版权问题已解决,预计未来的发行版将默认包含密码 shadow 功能。在此之前,您需要自行安装。
如果您从 CD-ROM 安装了发行版,您可能会发现,即使该发行版没有安装 Shadow Suite,您安装 Shadow Suite 所需的一些文件可能在 CD-ROM 上。
然而,Shadow Suite 版本 3.3.1、3.3.1-2 和 shadow-mk 的登录程序以及随附的其他几个 suid root 程序都存在安全问题,不应再使用。
所有必要的文件都可以通过匿名 FTP 或万维网获取。
在未安装 Shadow Suite 的 Linux 系统上,包括密码在内的用户信息存储在 /etc/passwd
文件中。密码以加密格式存储。但是,如果您咨询密码学专家,他或她会告诉您,密码实际上是编码格式而不是加密格式,因为在使用 crypt(3) 时,文本被设置为 null,而密码是密钥。因此,从现在开始,我将在本文档中使用术语编码。
用于编码密码字段的算法在技术上称为单向哈希函数。这是一种在一个方向上易于计算,但在反方向上非常难以计算的算法。有关所用实际算法的更多信息,请参见第 2.4 节或您的 crypt(3) 手册页。
当用户选择或被分配密码时,密码会使用一个随机生成的值(称为 salt)进行编码。这意味着任何特定密码都可以以 4096 种不同的方式存储。salt 值随后与编码后的密码一起存储。
当用户登录并提供密码时,首先从存储的编码密码中检索 salt。然后,提供的密码使用 salt 值进行编码,然后与编码后的密码进行比较。如果匹配,则用户通过身份验证。
从计算角度来看,获取随机编码的密码并恢复原始密码是困难的(但并非不可能)。但是,在任何用户数量超过几个的系统上,至少一些密码将是常用词(或常用词的简单变体)。
系统破解者知道这一切,他们会简单地使用所有可能的 4096 个 salt 值加密单词字典和常用密码。然后,他们会将您 /etc/passwd
文件中的编码密码与他们的数据库进行比较。一旦找到匹配项,他们就获得了另一个帐户的密码。这被称为字典攻击,是获取或扩展对系统未授权访问的最常用方法之一。
如果您考虑一下,一个 8 个字符的密码会编码成 4096 * 13 个字符的字符串。因此,包含 400,000 个常用单词、名称、密码和简单变体的字典很容易放入 4GB 硬盘中。攻击者只需要对它们进行排序,然后检查是否匹配。由于 4GB 硬盘的价格低于 1000 美元,因此这完全在大多数系统破解者的承受范围之内。
此外,如果破解者首先获取了您的 /etc/passwd
文件,他们只需要使用实际包含在您的 /etc/passwd
文件中的 salt 值来编码字典。普通青少年使用几百兆字节的空闲空间和 486 级别的计算机就可以使用此方法。
即使没有大量的驱动器空间,像 crack(1) 这样的实用程序通常也可以在用户数量足够的系统上破解至少几个密码(假设系统用户被允许选择自己的密码)。
/etc/passwd
文件还包含诸如用户 ID 和组 ID 之类的信息,这些信息被许多系统程序使用。因此,/etc/passwd
文件必须保持全局可读。如果您更改 /etc/passwd
文件,使任何人都无法读取它,您首先会注意到 ls -l
命令现在显示用户 ID 而不是名称!
Shadow Suite 通过将密码重新定位到另一个文件(通常是 /etc/shadow
)来解决问题。/etc/shadow
文件设置为不能被任何人读取。只有 root 才能读取和写入 /etc/shadow
文件。某些程序(如 xlock)不需要能够更改密码,它们只需要能够验证密码。这些程序可以以 suid root 身份运行,或者您可以设置一个 shadow 组,该组被允许对 /etc/shadow
文件进行只读访问。然后程序可以以 sgid shadow 身份运行。
通过将密码移动到 /etc/shadow
文件,我们有效地阻止了攻击者访问编码后的密码,从而无法执行字典攻击。
此外,Shadow Suite 还添加了许多其他不错的功能
/etc/login.defs
)安装 Shadow Suite 有助于提高系统的安全性,但是还有许多其他方法可以提高 Linux 系统的安全性,并且最终会有一系列 Linux 安全 HOWTO 讨论其他安全措施和相关问题。
有关其他 Linux 安全问题的最新信息,包括关于已知漏洞的警告,请参阅 Linux 安全主页。
在某些情况下和配置中,安装 Shadow Suite 可能不是一个好主意
未 shadow 的 /etc/passwd
文件具有以下格式
username:passwd:UID:GID:full_name:directory:shell
其中用户名
用户(登录)名
密码
编码后的密码
UID
数字用户 ID
GID
数字默认组 ID
全名
用户的全名 - 实际上,此字段称为 GECOS(通用电气综合操作系统)字段,可以存储除全名以外的信息。Shadow 命令和手册页将此字段称为注释字段。
目录
用户的主目录(完整路径名)
shell
用户的登录 shell(完整路径名)
username:Npge08pfz4wuk:503:100:Full Name:/home/username:/bin/sh
其中 Np
是 salt,ge08pfz4wuk
是编码后的密码。编码后的 salt/密码也很容易是 kbeMVnZM0oL7I
,两者是完全相同的密码。同一个密码有 4096 种可能的编码。(本例中的示例密码是 'password',一个非常糟糕的密码)。安装 shadow suite 后,/etc/passwd
文件将改为包含
username:x:503:100:Full Name:/home/username:/bin/sh
在这种情况下,第二个字段中的 x
现在只是一个占位符。/etc/passwd
文件的格式实际上没有改变,只是不再包含编码后的密码。这意味着任何读取 /etc/passwd
文件但实际上不需要验证密码的程序仍然可以正常运行。密码现在被重新定位到 shadow 文件(通常是 /etc/shadow
文件)。
/etc/shadow
文件包含以下信息
username:passwd:last:may:must:warn:expire:disable:reserved
其中用户名
用户名
密码
编码后的密码
上次更改
自 1970 年 1 月 1 日以来密码上次更改的天数
最早更改
密码可以更改前的天数
必须更改
密码必须更改后的天数
警告
在密码过期前警告用户的天数
过期
密码过期后帐户被禁用的天数
禁用
自 1970 年 1 月 1 日以来帐户被禁用的天数
保留
保留字段
username:Npge08pfz4wuk:9479:0:10000::::
来自 crypt(3) 手册页
“crypt 是密码加密函数。它基于数据加密标准算法,并进行了旨在(除其他外)阻止使用密钥搜索的硬件实现的变体。”
[密钥] 是用户键入的密码。[编码后的字符串全是 NULL]
[salt] 是从集合 [a-zA-Z0-9./] 中选择的两个字符的字符串。此字符串用于以 4096 种不同的方式扰乱算法。
通过获取密钥的每个字符的最低 7 位,可以获得一个 56 位的密钥。这个 56 位密钥用于重复加密一个常量字符串(通常是一个由全零组成的字符串)。返回值指向加密后的密码,即一系列 13 个可打印的 ASCII 字符(前两个字符代表 salt 本身)。返回值指向静态数据,其内容在每次调用时都会被覆盖。
警告: 密钥空间由 2**56 等于 7.2e16 个可能的值组成。使用大规模并行计算机可以对这个密钥空间进行穷举搜索。诸如 crack(1)
之类的软件可用于搜索人类通常用于密码的密钥空间的这部分。因此,密码选择应至少避免常用单词和名称。建议使用 passwd(1)
程序,该程序在选择过程中检查是否容易破解密码。
DES 算法本身有一些怪癖,这使得使用 crypt(3)
接口成为密码身份验证以外的任何其他用途的非常糟糕的选择。如果您计划将 crypt(3)
接口用于密码学项目,请不要这样做:找一本关于加密的好书和广泛可用的 DES 库之一。”
大多数 Shadow Suites 都包含将密码长度加倍到 16 个字符的代码。des 专家建议不要这样做,因为编码只是简单地先应用于较长密码的左半部分,然后再应用于右半部分。由于 crypt 的工作方式,这可能会导致编码后的密码不如最初不使用双倍长度密码时安全。此外,用户不太可能记住 16 个字符的密码。
正在进行开发工作,这将允许用更安全的东西替换身份验证算法,并支持更长的密码(特别是 MD5 算法),并保持与 crypt 方法的兼容性。
如果您正在寻找一本关于加密的好书,我推荐
"Applied Cryptography: Protocols, Algorithms, and Source Code in C" by Bruce Schneier <schneier@chinet.com> ISBN: 0-471-59756-2