的权限/etc/shadow
是600,也就是说除了root之外任何人都不能读取。
但是,由于其中的所有密码都不是明文存储的,而是哈希值存储的(这意味着不可能从哈希值计算出原始密码),为什么不是每个人都能读懂呢?
答案1
防止离线暴力攻击。
即使您无法反转哈希值,您仍然可以尝试对每个可能的密码进行哈希处理,直到找到匹配的密码,并且您可以在良好的硬件和本地访问文件的情况下每秒进行数百万次尝试。
如果该文件具有644
权限,那么任何登录到你的系统的人,即使是在访客会话中,都可以将此文件从你的计算机上复制出来(无论是通过 USB 还是远程scp
)并尝试进行离线暴力攻击,不会在您的计算机上留下任何证据。
请注意,Ubuntu 上的权限实际上是640
,而不是600
:
$ ls -l /etc/shadow
-rw-r----- 1 root shadow 1239 Jun 25 04:35 /etc/shadow
但这并不重要,因为其他人仍然没有权限,并且默认情况下没有人在该shadow
组中。
最初,哈希存储在 中/etc/passwd
(这就是它被称为 的原因passwd
),因为在 Linux 创建时,破解哈希(即使是当时使用的弱类型)几乎是不可能的。不过,最终,处理能力发展到可以破解哈希(至少是相对较弱的密码)的程度。
将 的权限更改/etc/passwd
为640
或600
不起作用,因为有许多合法理由能够/etc/passwd
以普通用户身份读取(将 UID 转换为用户名、获取用户的全名、电话号码等),因此哈希被移至/etc/shadow
,它被赋予了640
权限。x
代替 中用户的密码哈希字段,/etc/passwd
用于指示该用户的哈希存储在 中/etc/shadow
。
答案2
实际上,/etc/shadow 的创建是为了允许移动远离一份可公开阅读的用户名和密码列表。
坚持住,在我们得到真正的答案之前,这将是一堂历史课。如果你不关心历史,只需向下滚动一点。
过去,包括 Linux 在内的类 Unix 操作系统通常都将密码保存在 /etc/passwd 中。该文件是全球可读的,现在仍然是,因为它包含允许映射(例如数字用户 ID 和用户名)的信息。即使对于完全合法的普通用户来说,这些信息也非常有用,因此让文件全球可读对可用性大有裨益。
即使在那时,人们也意识到将密码以纯文本形式保存在一个众所周知的位置的文件中,让任何可以登录的人都可以自由阅读,这是一个坏主意。因此,从某种意义上说,密码是经过哈希处理的。这是旧的“crypt”密码哈希机制,在现代系统中几乎从未使用过,但通常出于传统目的而支持。
查看系统上的 /etc/passwd。看到第二个字段了吗x
?它表示无处不在。它用于保存相关帐户的哈希密码。
问题是人们可以下载 /etc/passwd,甚至不下载它,然后破解密码。当计算机功能还不是特别强大时,这不是一个大问题(Clifford Stoll,在杜鹃蛋我记得,在 20 世纪 80 年代中期,在 IBM PC 级系统上散列一个密码的时间约为一秒钟,但随着处理能力的提高,这成了一个问题。在某个时候,如果有了一个不错的单词列表,破解这些密码就变得太容易了。出于技术原因,该方案也无法支持长度超过八个字节的密码。
为了解决这个问题,我们做了两件事:
- 转向更强大的哈希函数。旧的 crypt() 已经过时了,人们设计了更现代的方案,这些方案既面向未来,又具有计算能力更强。
- 将散列密码移至任何人都无法读取的文件中。这样,即使密码散列函数比预期的要弱,或者某人的密码本来就很弱,攻击者也会有另一个障碍来获取散列值。它不再是自由的。
该文件是 /etc/shadow。
使用 /etc/shadow 的软件通常非常小,高度集中,并且由于可能存在问题,往往会在审查中受到一些额外的审查。它还以特殊权限运行,这允许它读取和修改 /etc/shadow,同时让普通用户无法查看该文件。
所以你有它:/etc/shadow 上的权限是限制性的(尽管,正如已经指出的那样,并不像您所说的那么限制),因为该文件的整个目的是限制对敏感数据的访问。
密码哈希值应该是强的,但如果你的密码在互联网上最常用的 500 个密码列表,任何有权访问哈希的人仍然能够快速找到密码。保护哈希可以防止这种简单的攻击,并将成功攻击的门槛从简单的窥视提高到要求一个人要么已经是主机上的系统管理员,要么首先经历特权升级攻击。特别是在正确管理的多用户系统上,这两者都是显著地比仅仅查看一个世界可读的文件更加困难。
答案3
为什么/etc/shadow文件的权限设置为600?
谁告诉你的?
$ls -l /etc/shadow
-rw-r----- 1 root shadow 1407 mei 18 10:05 /etc/shadow
- 它是 640。
答案很简单:Linux 中的权限非常重视。“其他人”没有理由对 做任何事情/etc/shadow
。并且组“影子”也没有理由对其进行写入。并且执行顺序混乱。
但是,由于其中的所有密码都不是明文存储的,而是哈希值存储的(这意味着不可能从哈希值计算出原始密码),为什么不是每个人都能读懂呢?
因为没有一个理由这样做。
哈希是单向的。授予某人读取权限使他能够使用脚本滥用这种单向性:只需列出您能想到的任何单词并创建哈希即可。有时它可能会与密码匹配。但也可能需要一段时间。
这回答 很有趣,并且对暴力破解有一些估计。
答案4
重要背景:/etc/shadow
仅用于隐藏密码哈希值。在 Unix 的早期,密码哈希值存储在 中/etc/passwd
。随着计算机功能越来越强大、网络连接越来越持久以及安全漏洞越来越复杂,人们意识到保持密码哈希值可读会带来麻烦。(我不会详细介绍漏洞;关于这一点已经有足够多的优秀答案了。)
但/etc/passwd
无法进行读保护:各种程序都使用它来将数字用户 ID 映射到用户名,并查找主目录、默认 shell、用户的全名(以及办公室号码等——请查看man finger
)。因此,敏感部分(密码哈希)被移至/etc/shadow
,其余部分保持原样。这就是为什么/etc/passwd
,尽管名字如此,却包含了所有内容除了(散列)密码。