在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中各个字段的含义如下:
- 用户名。
- 密码密文,如果为空表示不能使用密码登录系统。
- 上次修改密码的天数(从1970年1月1日开始计算,到修改密码时的天数)
- 修改密码时间间隔的最短天数,在这段时间内不允许修改密码,如果是0,表示可以随时修改密码。
- 修改密码时间间隔的最长天数,超过这个天数后密码失效,系统将强制用户修改密码。例如,99999表示最长可以99999天不修改密码。
- 密码失效前多少天提示用户需要修改密码,上面例子中7表示密码失效前7天开始提示用户需要修改密码。
- 密码过期后多少天帐户将会被禁用。
- 帐户失效的日期,从1970年1月1日开始计算,超过这个日期,帐户将无法使用。
- 最后一项为保留字段,还没有被使用。
三、密码存储方式
密码字段以$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 | pi@raspberrypi:/etc $ sudo chage pi |