为什么 Linux 同时具有影子文件和密码文件?

为什么 Linux 同时具有影子文件和密码文件?

我理解阴影密码,但我的问题是为什么它们都有?这似乎是不必要的复杂化。为什么不直接将加密的密码存储在 passwd 文件中?将它们分开是否更安全?我注意到 passwd 可供任何人访问,但 shadow 只有超级用户才能访问。

答案1

主要目的是保护用户密码哈希。该/etc/passwd文件包含各种用户信息,这些信息必须是全球可读的。该/etc/shadow文件只能由 读取root。这种简单的访问权限划分可以防止临时用户和“脚本小子”看到用户密码哈希列表并可能破解这些哈希。请记住,哈希未以任何方式加密,因此比较弱。

该文件一度shadow不存在,用户哈希存储在passed文件中正如维基百科所解释的那样

1987 年,原著的作者影子密码套件Julie Haugh 经历了一次计算机入侵,并编写了 Shadow Suite 的初始版本,其中包含loginpasswdsu 命令。最初版本是为 SCO Xenix 操作系统编写的,很快就被移植到其他平台。影子套房在 Linux 项目最初宣布一年后的 1992 年被移植到 Linux,并被包含在许多早期发行版中,并且继续包含在许多当前的 Linux 发行版中。

我记得这一点是因为我在 1990 年代初期使用的公共 Unix 系统宣布将切换到一种新的设置/etc/shadow,并且有人讨论这是否是一个好主意。

关于 Julie Haugh 和影子密码套件 可以在这里找到

1987 年,我成了一名计算机黑客的受害者,突然发现有必要学习一切有关计算机安全的知识。我先是学习黑客入侵系统的常用技巧,最后编写了影子密码套件。它现在是免费 UNIX 系统事实上的标准增强安全子系统,全球可能有超过 100,000 个系统在使用。我甚至在 USENIX 会议上撰写并发表了一篇关于它的论文。如果您有兴趣使用影子密码套件在您自己的系统上,您可以在此处获取副本。我曾在几个会议上撰写并发表过论文或进行过讨论,并期待着将来某个时候在安全会议上与你们中的一些人见面。

答案2

这是安全问题。该/etc/passwd文件由多种工具使用,因此必须是公开可访问的。例如,ls将用户 ID 与用户名匹配,以人性化的方式显示有关文件所有权的信息。

相反,/etc/shadow只有 root 才能读取。尽管不太可能从文件中存储的哈希中恢复密码,但仍然建议保护它不被窥探;此外,其他字段很敏感,因此需要额外的保护:事实上,该文件还存储了:

上次密码更改:此字段表示自 UNIX 时间(1970 年 1 月 1 日)以来上次更改密码的天数。

密码更改间隔的最短天数:此字段表示用户可以更改密码的最少天数。

密码有效期:此字段表示密码有效的最大天数。超过此天数,密码将过期,用户必须更改密码。

警告阈值:此字段表示用户在多少天之前会收到有关密码过期的警告通知。

帐户不活动:此字段表示当密码过期后,帐户将被禁用的天数。

帐户禁用以来的时间:此字段表示从 UNIX 时间开始,帐户被禁用的天数。

如果攻击者能够获取这些信息,那么这些信息对他们来说都是有价值的。

答案3

passwd文件确实仍有一个“密码”字段,这是早期遗留下来的,但仍然可以使用——例如,Linux 有pwconvpwunconv命令来合并/拆分这两个文件。(尽管这会失去额外的文件中也保存着一些信息shadow,例如账户到期时间。

我不完全确定时间线;然而,据我所知,最初shadow创建该文件是因为密码根本没有经过散列处理 - 因此必须保护纯文本密码不被普通人读取。(出口限制当时许多 Unix 系统没有数据加密标准功能安装后。)密码散列直到很久以后才开始普及。

(密码是哈希,未加密;由于没有直接的方法“取消哈希处理”,系统通过以完全相同的方式对密码进行哈希处理,并比较两个哈希值来验证密码。)

但即使使用散列密码,额外的保护层仍然很重要。并非所有散列函数都足够强大,可以保护短密码 - 例如,相同的原始基于 DES 的“crypt()”散列函数当时很强大,但现在被认为非常弱。(有些系统仍在使用它!)

Linux crypt() 现在支持更多种类的哈希函数,例如$1$基于 SHA-1 或$5$基于 SHA-256 的哈希函数,但添加的保护(盐、多重发子弹) 仍然不如后来的 PBKDF2 或 bcrypt 发展得那么好,许多短密码的哈希值仍然可以在短时间内被破解。

同样,Windows 至今仍在使用非常弱哈希函数(仅一轮 MD4,没有盐或任何其他安全功能)。它无法轻松升级,因为 Windows 的旧网络身份验证协议依赖于它,因此数据库需要得到强有力的保护,甚至管理员也不得访问(以防止恶意软件获取它)。

答案4

对此有非常简单的解释。passwd文件中包含许多有价值的信息,其中shadow文件包含encrypted密码。

**passwd**文件包含以下信息

  1. 用户名
  2. 密码(x 个字符)
  3. 用户 ID (UID)
  4. 群组ID(GID)
  5. 用户ID信息
  6. 主目录
  7. 用户 Shell 其中所有属性shadow文件包含有关用户密码的信息,**shadow**文件包含以下信息:
  8. 用户名
  9. 密码(加密)
  10. 上次密码更改
  11. 用户更改密码的最短天数
  12. 用户更改密码的最长天数
  13. 警告(密码更改警告开始的天数)
  14. 不活跃 密码过期后帐户被禁用的天数
  15. 指定登录不再使用的绝对日期

另一个区别是,passwd所有用户都可以读取文件,而只有shadowroot 用户可以读取。

相关内容