2. 用户信息的存储方式

2.1. /etc/passwd

在几乎所有的 Linux 发行版(以及商业 *nix 系统)中,用户信息都存储在/etc/passwd,这是一个文本文件,包含用户的登录名、加密后的密码、唯一的数字用户 ID(称为 uid)、数字组 ID(称为 gid)、一个可选的注释字段(通常包含诸如真实姓名、电话号码等信息)、他们的主目录以及他们首选的 shell。 一个典型的条目在/etc/passwd看起来像这样

  pete:K3xcO1Qnx8LFN:1000:1000:Peter Hernberg,,,1-800-FOOBAR:/home/pete:/bin/bash
  

如你所见,它非常简单直接。每个条目都包含我上面描述的六个字段,每个字段用冒号分隔。 如果用户认证仅仅如此复杂,就没有必要编写这篇 HOWTO 了。

2.2. 影子密码

查看你的/etc/passwd,很可能你实际上看到的是这样的内容

  pete:x:1000:1000:Peter Hernberg,,,1-800-FOOBAR:/home/pete:/bin/bash
  

加密后的密码去哪里了? 在我告诉你它去哪里之前,需要做一些解释。

这个/etc/passwd文件,其中包含所有用户的信息,包括他们的加密密码,对所有用户都是可读的,这使得任何用户都可以获取系统上所有人的加密密码。 尽管密码是加密的,但密码破解程序却广泛可用。 为了对抗这种日益增长的安全威胁,影子密码被开发出来。

当系统启用影子密码后,/etc/passwd中的密码字段会被替换为“x”,而用户真正的加密密码则存储在/etc/shadow。 因为/etc/shadow仅对 root 用户可读,恶意用户无法破解其他用户的密码。 中的每个条目/etc/shadow包含用户的登录名、他们的加密密码以及一些与密码过期相关的字段。 一个典型的条目看起来像这样

    pete:/3GJllg1o4152:11009:0:99999:7:::
   

2.3. /etc/group/etc/gshadow

组信息存储在/etc/group。 其格式类似于/etc/passwd,条目包含组名、密码、数字 ID (gid) 以及逗号分隔的组成员列表等字段。 在/etc/group中的一个条目看起来像这样

   pasta:x:103:spagetti,fettucini,linguine,vermicelli
  

正如你从密码字段中的“x”看到的那样,组密码也可以被影子化。 尽管组几乎从不设置自己的密码,但值得注意的是,影子化的组密码信息存储在/etc/gshadow.

2.4. MD5 加密密码

传统上,Unix 密码使用标准的 crypt() 函数进行加密。(有关 crypt() 函数的更多信息,请参阅 crypt(3) 手册页。) 随着计算机速度越来越快,使用此函数加密的密码变得更容易被破解。 随着互联网的兴起,用于在多台主机上分发密码破解任务的工具也变得可用。 许多“较新”的发行版都提供了使用更强大的 MD5 哈希算法加密密码的选项。(有关 MD5 哈希算法的更多信息,请查阅 RFC 1321。) 虽然 MD5 密码不会消除密码破解的威胁,但它们会使破解你的密码变得更加困难。

2.5. 理清混乱

正如你所看到的,用户身份验证信息可以通过多种不同的方式存储在你的系统中(不使用 MD5 加密的影子密码,/etc/passwd使用 MD5 加密的密码等等)。 像 loginsu 这样的程序如何知道如何验证你的密码? 更糟糕的是,如果你想更改密码在系统上的存储方式怎么办? 需要你密码的程序将如何知道密码的存储方式不同了呢? PAM 就是答案。