有关 linux 密码存储方式的分析笔记
Linux 密码文件简述
众所周知,Linux 有一套用户权限管理系统,但用户名跟密码需要存储在 Linux 内部文件中。
在 Unix 中,用户密码文件是存储在 /etc/passwd
中的。但该文件允许所有用户读取,易导致用户密码泄露,因此 Linux
系统将用户的密码信息从 /etc/passwd
文件中分离出来,单独放到了 /etc/shadow
文件。
/etc/shadow
只有 root
用户拥有读权限,其他用户没有任何权限,这样就保证了用户密码的安全性。
Unix 系统的用户密码保存格式也可以参考本文章,只是将
/etc/passwd
中的 x
变更为
/etc/shadow
对应的密码而已。
所以如果影子文件(/etc/shadow
)
的权限发生了改变,需要注意是否是恶意攻击。
/etc/shadow
格式详解
/etc/shadow
文件内容示例:
1 | root:$6$kcgcu794R0VP3fDL$aYN8XUbtWvZ4QQtT2xVW.N2CgE3YLPdtnprAAtKZUgNdq8itUJEN6NoYQDarLUevcDCWrxMVId8b18ujwST1b0::0:99999:7::: |
文件中每一行代表一个用户,采用 :
作分隔符,一共被划分为九个字段:
1 | name:password:last-change:min-age:max-age:warning:inactive:expire:blank |
字段含义:
字段名 | 字段含义 |
---|---|
name | 登录名称,必须是有效用户名 |
password | 已加密密码,分为三个部分用$分隔,第一部分表示用哪种哈希算法;第二部分是用于加密哈希的salt;第三部分是已加密的哈希哈希算法。 第一部分: 1 表示MD5;5 表示SHA-256;6 表示SHA-512。 注意:在密码前,一个感叹号( ! )代表该用户被锁定,可以在机器上转到改用户,但无法远程;两个感叹号(! ),表示没有设置密码 |
last-change | 最近一次更改密码的日期,以距离1970/1/1的天数表示 |
min-age | 最小修改时间间隔,即密码更改后多少天内不能再次更改。0表示可以随时更改 |
max-age | 密码有效期,必须在期限内修改密码 |
warning | 警告期,警告用户再过多少天密码将过期。0 表示不提供警告 |
inactive | 宽限期,密码过期多少天仍然可以使用 |
expire | 帐号过期时间,以距离1970/1/1的天数表示。0 或空字符表示永不过期 |
blank | 预留字段 |
更改密码
可以在 root
账户下使用 passwd 用户名
指令交互式更改指定用户名的密码。
示例如下:
1 | [root@localhost ~]# passwd qsdz |
其中,输入新密码的时候是无回显的