我们知道用户的密码保存在 中/etc/passwd
,但是以加密的方式保存,所以即使 root 也看不到它们:
jane:x:501:501::/home/jane:/bin/bash
fred:x:502:502::/home/fred:/bin/bash
如上图,:x:
代表密码。
有没有办法(可能的配置)以明文形式保存密码/etc/passwd
,以便 root 可以看到它们?
答案1
其他两个答案已经正确地告诉你了!这是一个坏主意™。但他们也告诉过你难的要做,需要改变一堆程序。
这不是真的。这很容易。您只需要更改一两个配置文件。我觉得指出这一点很重要,因为您在登录不受您控制的系统时应该意识到这一点。这些实际上不会将纯文本密码放入/etc/passwd
或中/etc/shadow
,而是会放入不同的文件中。请注意,我还没有测试过这些,因为我不想以纯文本形式提供密码。
编辑
/etc/pam.d/common-password
(捕获密码更改)或/etc/pam.d/common-auth
(捕获登录)并添加… pam_exec expose_authtok log=/root/passwords /bin/cat
编辑这两个文件,然后使用 .pam_unix 切换到 pam_userdb
crypt=none
。或者,您可以仅将其放在 common-password 中(也保留 pam_unix),以便在密码更改时记录密码。您可以
shadow
从 pam_unix 中删除(以及任何强哈希选项)选项以禁用影子文件,并返回到传统的 crypt 密码。不是纯文本,但开膛手约翰会为您解决这个问题。
欲了解更多详情,请检查PAM 系统管理指南。
您还可以编辑 PAM 的源代码,或编写自己的模块。您只需要编译 PAM(或您的模块),不需要其他任何东西。
答案2
噢,亲爱的,好吧,让我们从头开始......
我们知道用户的密码保存在/etc/passwd中,但是是以加密的方式保存的
不,他们已存储/etc/passwd
,那是很久以前的事了。今天密码已存储在所谓的影子文件中, 大多数时候/etc/shadow
。
但以加密方式,所以即使是 root 也看不到它们:
我知道它有时可以互换使用,但是散列不是加密。加密根据其定义是可逆的,这意味着您可以将加密的内容转换回其明文形式。哈希被设计为不是以任何方式可逆(暴力除外)。经过哈希处理的原始明文形式不应被恢复。
影子文件中的密码存储为哈希值。
如上图:x:代表密码
在x
本例中, 仅仅是旧密码字段的占位符。这x
意味着密码可以在shadow文件中找到。
有没有办法(可能的配置)以明文形式将密码保存在 /etc/passwd 中,以便 root 可以看到它们?
是的,这确实是可能的,但由于某些原因这不是一个好主意。德罗伯特的回答解释了一种相当简单的方法。
但为什么这不是一个好主意呢?嗯,有一个简单但非常重要的原因:安全。我建议阅读这些问题:
- 有什么类比可以很好地向外行解释为什么应该对密码进行哈希处理?
- 如何安全地散列密码?
- 为什么我应该对密码进行哈希处理?
- 为什么密码哈希如此重要?
- 为什么哈希函数是一种方式?如果我知道该算法,为什么我不能从中计算输入?
但总而言之,假设如下:公司中有一台服务器,所有用户帐户都通过密码进行保护,并且这些用户帐户中的数据都使用相同的密码进行加密。来自外部的破解者可以访问服务器,但他们无法访问任何重要数据,因为这些数据在用户帐户中仍然是加密的。
现在假设密码将以纯文本形式存储。破解者会突然访问一切,因为密码是可以读取的。但如果它们以散列值的形式存储,那么除了拥有大量资源进行暴力攻击的人之外,它们对任何人都几乎毫无用处。
答案3
首先,加密的密码不在 中/etc/passwd
,但它们在 中/etc/shadow
。原因之一是它/etc/passwd
是公开可读的(因此您可以例如找到其他用户的 GECOS 字段信息),并且特别是使用较旧的加密方案可能允许对加密密码进行暴力攻击。
仅以纯文本形式存储密码是没有必要的,并且需要更新密码程序和读取/etc/shadow
信息以检查有效密码的库。然后,您必须希望所有实用程序都使用共享库来访问该信息,而不是静态链接到不理解纯文本密码存储的内容。
如果这是设置配置中的一个选项,那么总会有愚蠢的人会不恰当地打开它。当他们仍在查看信息时,他们仍在 CRT 屏幕上工作并以一种可以从建筑物外部轻松接收到的方式进行广播。
除此之外,人们倾向于在多个系统上使用相同或相似的密码,因此对于任何人类可读的密码来说都不是一个好主意。由于某些系统管理员可以在其他系统上重试他们的系统,因此他知道用户有一个帐户。
一定还有更多有趣的事情,可以在您的系统上研究其工作原理。
答案4
基本原因(为什么这是一个坏主意)是任何用户(root、admin 或其他)都不应该访问其他用户的用户密码。
很简单,因为密码是一种身份验证手段。如果我知道其他用户的密码,我就知道他们的凭据(用户名+密码),因此我可以登录作为该用户,冒充他(或她或它)。
我以该用户身份登录时所做的任何操作,其他用户都将承担责任。这不是身份验证应该如何工作的。
这些行为可能是灾难性的,例如删除一大堆重要文件、擦除硬盘、擦除备份、关闭核电计划等。
或者只是非法的。想象一下我(管理员)可以访问所有密码的银行机构。使用出纳员的密码,我可以命令将一百万美元从总统的银行帐户转移到窗户清洁工的银行帐户。然后使用收银员的高级密码批准交易。然后批准从窗户清洁工的帐户到我自己的离岸银行帐户的支票。
然后我去巴哈马度长假......
从这个角度来看,密码的散列和使用单独的影子文件可以被视为强制执行此规则的一种手段(任何用户都不能冒充其他用户)。
正如 @Miral 的评论*,有一个例外,su
在允许模仿(以及各种抛出上面的论点)的同时,还保留其使用日志(因此它将规则更改为“只有管理员可以模仿其他人,但保留日志”)。
* 银行的例子可能不是最好的。在任何安全性至关重要的环境中,通常需要更多的身份验证和授权方式,而不仅仅是一个密码。