Linux中/etc/shadow文件各个字段的含义

在Linux中,用户的密码密文、过期时间等信息存储在/etc/shadow中。本文介绍/etc/shadow文件中各个字段的含义。

一、影子文件/etc/shadow来历

在以前的Linux系统中,用户名、所在用户组、密码(单向加密)等信息存储在/etc/passwd文件中,很多软件通过调用这个文件来获取用户名和用户组,例如ls命令通过用户ID来找到/etc/passwd文件中的用户名。这意味着,所有用户都要拥有/etc/passwd的读权限,否则这些用户将不能执行ls等命令。但是这个文件保存了用户的密码,这将会导致安全风险。

现在,加密后的密码已经不保存在/etc/passwd中了,取而代之的是一个X。实际的密码保存在/etc/shadow文件中。这个文件只有root用户能够读取,其它用户无法读取该文件。

二、各个字段含义

一个/etc/shadow文件内容的例子如下:

root:$6$enWH2VaC$6LNYFYfmC3udk3h.k/M.:17957:0:99999:7:::
daemon:*:17848:0:99999:7:::
bin:*:17848:0:99999:7:::
sys:*:17848:0:99999:7:::
sync:*:17848:0:99999:7:::

文件中每行代表一个用户,用户的各个字段用:冒号分隔。/etc/shadow中各个字段的含义如下:

  1. 用户名。
  2. 密码密文,如果为空表示不能使用密码登录系统。
  3. 上次修改密码的天数(从1970年1月1日开始计算,到修改密码时的天数)
  4. 修改密码时间间隔的最短天数,在这段时间内不允许修改密码,如果是0,表示可以随时修改密码。
  5. 修改密码时间间隔的最长天数,超过这个天数后密码失效,系统将强制用户修改密码。例如,99999表示最长可以99999天不修改密码。
  6. 密码失效前多少天提示用户需要修改密码,上面例子中7表示密码失效前7天开始提示用户需要修改密码。
  7. 密码过期后多少天帐户将会被禁用。
  8. 帐户失效的日期,从1970年1月1日开始计算,超过这个日期,帐户将无法使用。
  9. 最后一项为保留字段,还没有被使用。

三、密码存储方式

密码字段以$id$salt$hashed的格式存储,例如上述例子中,密码字段为:
$6$enWH2VaC$6LNYFYfmC3udk3h.k/M.
则$id为$6$,salt为enWH2VaC,hashed为6LNYFYfmC3udk3h.k/M.
其中$id表示计算密码密文所用的哈希算法,对应关系如下:

  • $1$ 表示 MD5
  • $5$ 表示 SHA-256
  • $6$ 表示 SHA-512
  • $2a$$2y$表示Blowfish算法

四、修改用户密码

修改自己的密码: passwd
修改其它用户的密码: passwd 用户名

五、设置过期信息

使用chage 用户名可以修改指定用户的最短修改密码间隔、最长密码有效期、密码失效天数等信息。例如:

1
2
3
4
5
6
7
8
9
10
pi@raspberrypi:/etc $ sudo chage pi
Changing the aging information for pi
Enter the new value, or press ENTER for the default

Minimum Password Age [0]:
Maximum Password Age [99999]:
Last Password Change (YYYY-MM-DD) [2019-03-10]:
Password Expiration Warning [7]:
Password Inactive [-1]:
Account Expiration Date (YYYY-MM-DD) [-1]: