密码如何在Linux中存储(了解Shadow utils的哈希)
具有该帐户相应密码的用户帐户是可用于访问Linux机器的主要机制。
认为必须首先将系统中所有用户的密码保存在某种文件或者数据库中,这样才能在用户登录尝试期间对其进行验证,这是非常合乎逻辑的。
而且,我们不需要计算机安全科学家的技能和专业知识就可以理性地认为,如果掌握了存储所有密码的数据库或者文件,则可以轻松访问该计算机。
有人会在这一点上争辩说,数据库或者包含密码的文件是经过编码的格式(哈希值),并且无法从编码后的密码哈希中知道真实的密码。
但是,通过对编码值进行字典攻击,可以从编码后的密码中检测出真实密码。
在继续之前,让我们回到一些基础知识上。
哈希是一种数学方法,可以为任何给定的字符串生成固定长度的编码字符串。
哈希算法的主要优势在于我们无法从编码的字符串中检测到原始字符串。
换句话说,我们可以将其称为一种哈希方式。
哈希算法不仅用于存储密码,还用于数据完整性检查。
对于我们提供的任何数据,我们将获得一个唯一的固定长度的编码字符串,并且该编码的字符串对于该特定数据将是唯一的。
简而言之,没有两个数据可以具有相同的哈希(编码字符串)。
更改数据的单个字符将产生完全不同的编码哈希(因为数据不同)。
几乎所有通信协议都以某种方式使用散列的强度来检查并确认数据的原始性和完整性(因为如果更改数据,散列将发生变化)。
但是,如果攻击者掌握了加密的散列并继续尝试不同的单词组合以产生完全相同的散列,该怎么办。
如今,借助高级计算功能,攻击者可以在数小时内经历数百万种组合。
这种风险也适用于在UNIX/Linux系统中存储密码的方式。
尽管密码是经过编码的,但是如果攻击者掌握了该密码文件,则攻击者可以尝试破解密码。
从Unix最初的日子开始,密码就存储在一个名为/etc/password的文件中。
这个单一文件的主要漏洞在于该文件是世界可读的。
这意味着系统中的任何用户都可以读取该文件。
这样做是有目的的,因为该文件包含除密码以外的与用户有关的重要信息,并且许多应用程序和系统工具都要求该信息才能正常运行。
让我们看看linux中/etc/password文件的权限。
[root@theitroad1 ~]# ll /etc/passwd -rw-r--r-- 1 root root 1875 Dec 14 23:17 /etc/passwd [root@theitroad1 ~]#
我们会看到在该文件的所有三个字段中都有一个“ r”(代表“ read”)。
让我们尝试更改此权限,以便只有“ root”才能读取该文件。
[root@theitroad1 ~]# chmod 600 /etc/passwd [root@theitroad1 ~]# ll /etc/passwd -rw------- 1 root root 1875 Dec 14 23:17 /etc/passwd [root@theitroad1 ~]#
现在让我们看看此更改对系统有什么影响...让我们尝试成为普通用户,并看看会发生什么。
[root@theitroad1 ~]# su - sarath su: warning: cannot change directory to /home/sarath: Permission denied id: cannot find name for user ID 500 -bash: /home/sarath/.bash_profile: Permission denied -bash-3.2$
哦,我们是否看到了...我们甚至无法更改用户。
即使更改用户,也不会获得用户名,主目录,自定义shell程序等(因为所有这些详细信息都存储在/etc/passwd中)。
由于这个原因,文件/etc/passwd必须保持世界可读性。
但是我们无法将密码保存在世界可读的文件中(由于存在风险,即使使用单向哈希算法对密码进行编码也是如此)
因此,需要从该文件中分离密码并将其保存在只能由root用户访问的文件中。
该问题的解决方案以Linux中称为“ shadow-utils”的软件包的形式实现。
什么是Linux中的shadow-utils软件包?
Shadow utils是Linux中的一个软件包,默认情况下已在大多数发行版中安装了该软件包,用于将密码与/etc/passwd分开。
在实现shadow-utils之后,现在将密码保存在Linux中的/etc/shadow文件中。
/etc/shadow文件只能由root用户访问。
让我们看一下/etc/shadow文件的内容,以及它的权限。
[root@theitroad1 ~]# ll /etc/shadow -r-------- 1 root root 1140 Dec 14 23:17 /etc/shadow [root@theitroad1 ~]#
我们可以看到,与/etc/passwd文件不同,/etc/shadow文件仅为root用户设置了“ r”(读取)权限。
这意味着没有其他用户可以访问此文件。
让我们看看这个文件的内容。
[root@theitroad1 ~]# cat /etc/shadow root:$Etg2ExUZ$F9NTP7omafhKIlqaBMqng1:15651:0:99999:7:::
让我们了解该输出的每个字段,这些字段之间用“:”分隔。
1.第一个字段是不言自明的,其USERNAME
2.第二个字段是编码后的密码(这是单向哈希,我们将对此进行详细讨论)
3.第三个字段是自UNIX更改密码以来的日期。
4.该字段指定两次密码更改之间需要的天数。
5.没有几天可以更改密码。
6.这是更改所需密码之前的天数,用户会收到警告
7.如果密码已过期,则在此天数后,该帐户将被禁用
8,从Unix时间开始没有天数,该帐户被禁用
9.该字段尚未使用...
现在我们会感到困惑,为什么/etc/shadow文件包含这么多信息而不是仅包含编码密码。
这是因为shadow-util的软件包提供了一些更高级的功能,以及将编码的密码存储在/etc/shadow中。
/etc/shadow,file的上述字段在一定程度上告诉我们那些添加的功能,例如密码的使用期限及其有效期,以及以下提到的功能。
- 用于创建用户帐户的默认参数(/etc/login.defs)
- 修改用户帐户和组的工具
- 加强严格的密码选择
编码的密码如何存储在/etc/shadow文件中,以及系统如何在登录期间验证用户键入的密码?
为了了解整个过程是如何工作的,让我们以前面显示的/etc/shadow文件中的root用户示例条目为例。
[root@theitroad1 ~]# cat /etc/shadow root:$Etg2ExUZ$F9NTP7omafhKIlqaBMqng1:15651:0:99999:7:::
从上面显示的示例条目中,我们感兴趣的主题是第二个字段(具有密码的编码哈希值的字段)。
$Etg2ExUZ$F9NTP7omafhKIlqaBMqng1
上面所示的编码后的哈希值可以进一步分为以下三个不同的字段。
1.第一个字段是一个数字,告诉我们正在使用的哈希算法。
- $1 = MD5哈希算法。
- $2 =正在使用河豚算法。
- $2a = eksblowfish算法
- $5 = SHA-256算法
- $6 = SHA-512算法
2.第二个字段是盐值
盐值不过是为了与哈希密码结合而生成的,与原始密码结合使用的随机数据。
3.最后一个字段是salt +用户密码的哈希值(我们将在稍后讨论)。
因此,在我们的示例root条目中,如下所示,
$1 $Etg2ExUZ $F9NTP7omafhKIlqaBMqng1
上面显示的编码密码正在使用MD5哈希算法(因为$1 $)
盐值为Etg2ExUZ(第二个和第三个$符号之间的内容)
以及“ PASSWORD + SALT”的哈希值。
让我们通过提供Etg2ExUZ的salt值和原始密码来重现相同的输出。
[root@theitroad1 ~]# openssl passwd -1 -salt Etg2ExUZ redhat $Etg2ExUZ$F9NTP7omafhKIlqaBMqng1 [root@theitroad1 ~]#
在上述openssl命令的帮助下,我们可以看到只能以完全相同的盐值(始终由密码程序随机选择)来复制编码后的条目。
这是登录程序在我们输入密码时执行的操作,它使用salt值和我们输入的密码来创建编码的字符串。
如果该编码字符串与影子文件中的编码字符串匹配,则认为用户登录成功。
更改盐将更改影子文件中的条目。
上面命令中使用的-1选项,告诉使用哪种哈希算法(1表示md5算法)。
如果根本没有盐值会怎样?
- 盐值是增强linux系统存储密码的方式的主要组成部分。想象一下在将密码存储在linux中之前没有应用盐值。正如我们在本文开头所讨论的那样,使用常见词典单词进行词典攻击将变得更加容易。
通过使用盐值(在生成密码时随机生成),攻击者需要遍历盐值以及密码字符串的不同组合,以猜测原始密码是什么。
- 攻击者无法轻易猜测两个用户使用的密码相同。因为即使攻击者以某种方式获得了影子文件的访问权限,他也无法说查看两个编码的密码,它们正在使用相同的密码。这是因为它们两个将具有不同的盐值。
如何显示Linux机器中使用的哈希算法?
[root@localhost ~]# authconfig --test|grep hashing password hashing algorithm is md5
上面的命令清楚地表明,当前Linux机器使用的算法是md5(默认情况下,所有用户都将使用该算法)。
我们将如何配置Linux机器以使用SHA-512哈希算法?
[root@localhost ~]# authconfig --passalgo=sha512 --update
请注意,除非我们更改用户密码,否则将不会为现有用户更新SHA-512哈希算法。
我们还可以通过使用chage命令(shadow命令(shadow-utils软件包也提供))强制Linux用户在下次登录时更改其密码。
我正在为用户做些修改,因此用户将需要强制性地在下次登录时更改密码。
[root@localhost ~]# chage -d 0 tiwary
上面的命令将强制用户tiwary在下次登录时更改其密码。
现在,当我们看到/etc/shadow文件时,我们可以看到用户tiwary在更改密码后具有与所有其他用户不同的算法。
[root@localhost ~]# cat /etc/shadow root:$flVALfyK$kJfaoYnsAm7/plT3.PCmJ/:15816:0:99999:7::: satish::15804:0:99999:7::: theitroad:$MIyV9col$Up9YON8Z.TI1x37xgFvuO0:15804:0:99999:7::: u1::15813:0:99999:7::: himanshu:[root@localhost ~]# openssl passwd -1 redhat123 $jp5rCMS4$mhvf4utonDubW5M00z0Ow0Iwvz7CA$QOJLfOSJZuSLC19LSFxt1.:15810:0:99999:7 tiwary:$QXBJkK8N$owDISwfo1wMH1BqoL9Rx/RD49jXpS/EZS8NbIgAUGLtZbkA1YDfZoM1GbeIlDp4p99ugzBMcijNYrxy2rrRdY0:15819:0:99999:7:::
在上面显示的输出中,$6 $代表sha512算法。
如何生成影子样式的密码哈希?
##代码##在这种情况下,salt值是第二个和第三个$符号之间的八个字符。
例如 jp5rCMS4.
我们可以将上述输出粘贴到特定用户的影子文件中,然后该用户可以使用密码“ redhat123”轻松登录。