基于 linux 的系统以其强大的安全措施而闻名,隔离敏感数据,以确保尽量减少未经授权的访问。Linux 中用户密码不会以明文形式存储,甚至也不会存储在 /etc/passwd 文件中,它们被加密保存在 /etc/shadow 文件中。本文将深入探讨 /etc/shadow 文件结构和特性以及相关的实用程序。
背景和目标
在 Unix 的早期,用户密码以加密的形式存储在 /etc/passwd 文件中。为了允许各种系统工具实现功能,这个文件被迫设置成公共可读,这构成极大的安全风险。攻击者可以很容易地复制该文件并尝试离线破解密码。
为了降低这种风险,/etc/shadow 文件被引入,该文件存储加密的用户密码,并且不是公共可读的。
文件结构
/etc/shadow 文件中,每个用户帐户占用一行,格式如下:
username:$6$KOhWkFd$K8B7:18333:0:99999:7:::

字段说明如下:
Username
该字段代表用户帐户的名称。
Encrypted password
该字段代表加密的用户密码,密码使用单向散列函数,因此无法检索原始密码。该字段首字母标记用于创建密码的加密方法。
-
$1$: MD5 -
$2a$: Blowfish -
$2b$: Blowfish -
$2y$: Blowfish -
$5$: SHA-256 -
$6$: SHA-512 -
$y$: Yescrypt
Last password change (date)
用户最后一次修改密码的日期,表示自 1970 年 1 月 1 日起的天数。
Minimum password age
允许用户再次更改密码之前必须经过的最小天数。
Maximum password age
在必须更改用户密码之前,该用户密码有效的最大天数。
Password warning period
设置用户密码过期前的天数,用户将收到警告。
Password inactivity period
不活动的天数,超过该天数,用户的密码将过期,帐户将被锁定。
Account expiration date
用户帐户将被禁用的日期,表示为自 1970 年 1 月 1 日起的天数。
注意: /etc/shadow 文件只有 root 用户可读,其它普通用户无权限查看此文件的内容。
实用程序和命令
修改 /etc/shadow 文件应该谨慎处理,因为任何错误都可能会危及系统用户帐号的安全性。建议在做任何更改之前备份 /etc/shadow 文件。
Change User Password
我们可以使用 passwd 命令更新密码和更新 /etc/shadow 文件。例如,要更改自己的密码,只需输入:
passwd
如果需要修改其他用户的密码,可以使用如下命令:
sudo passwd USERNAME
Setup Password Aging
设置密码过期期限,基本语法如下:
passwd -l USERNAME -u NUMBER_OF_DAYS -x NUMBER_OF_DAYS
例如,让用户的密码在 90 天后过期,你可以使用以下命令:
passwd -l USERNAME -u 90 -x 7
设置密码期限规则后,可以使用以下命令查看用户的密码状态:
passwd -S USERNAME
安全性考量
File Permissions
默认情况下,/etc/shadow 文件的权限设置为 0400,这意味着只有 root 用户可以读取文件,确保加密的密码不会被窥探。
Encrypted, Not Hashed
虽然通常使用“加密”一词,但密码在 /etc/shadow 中在技术上使用加密散列算法进行散列。这 意味着它们不能被反转回纯文本。哈希算法(如 SHA-512)被设计为计算密集型,以抵御暴力攻击。
Account Locking
如前所述,密码字段中的 ! 或者 * 表示该帐号被锁定,这对于创建一个不能用密码登录的账户非常有用。
