有关 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
2
3
4
[root@localhost ~]# passwd qsdz
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully

其中,输入新密码的时候是无回显