passwd and shadow

摘自 http://www.letuknowit.com/topics/20120303/passwd-and-shadow-in-linux.html/ https://www.cnblogs.com/f-ck-need-u/p/7545187.html

/etc/passwd

基础概念

如下所示,分别列出了 passwd 和 shadow 文件的访问权限信息,其中 passwd 保存的是账号,shadow 保存的是账号的密码等信息。

1
2
3
4
stack@ubuntu16:~$ ls -al /etc/passwd /etc/shadow
-rw-r--r-- 1 root root   2141 Jul 31 17:16 /etc/passwd
-rw-r----- 1 root shadow 1216 Jul 31 17:16 /etc/shadow
stack@ubuntu16:~$ 

打开 passwd 文件来看看,下面列举部分内容如下:

1
2
3
4
5
6
7
8
stack@ubuntu16:~$ cat /etc/passwd
root❌0:0:root:/root:/bin/bash
daemon❌1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin❌2:2:bin:/bin:/usr/sbin/nologin
sys❌3:3:sys:/dev:/usr/sbin/nologin
sync❌4:65534:sync:/bin:/bin/sync
stack❌1000:1000::/opt/stack:/bin/bash
stack@ubuntu16:~$ 

上面每一行都代表一个用户,每一行又通过 [:]分为七个部分,至于它们都是分别代表了什么,如下所示

  1. 账号名称
  2. 原先用来保存密码的,现在密码都放在/etc/shadow 中,所以这里显示 x
  3. UID,也就是使用者 ID。默认的系统管理员的 UID 为 0,我们添加用户的时候最好使用 1000 以上的 UID,1-1000 范围的 UID 最好保留给系统用。
  4. GID,也就是群组 ID
  5. 关于账号的一些说明信息(暂时可以忽略)
  6. 账号的家目录,家目录就是你登陆系统后默认的那个目录
  7. 账号使用的 shell

/etc/shadow

基础概念

通过 sudo cat /etc/shadow 命令查看文件内容,下面列举部分内容如下

1
2
3
4
5
stack@ubuntu16:~$ sudo cat /etc/shadow
root:$6$TQKSL/Lz$cLSWjHVmdHGRP9pEbVa96UhIQbRVvRN3VEPpOLMci6dUzBTOj0yQZE8EzzKymh.fwFu4eubh.5TXi65dhdMeW0:17743:0:99999:7:::
daemon:*:17590:0:99999:7:::
bin:*:17590:0:99999:7:::
stack@ubuntu16:~$ 

这里和 /etc/passwd 一样也是由 [:]来进行分割,但是这里一共分出来九个栏目,每个栏目的解释如下:

  1. 账户名称(密码需要与账户对应的嘛)
  2. 加密后的密码(总不能学 CSDN 放明文密码,是吧),如果这一栏的第一个字符为!或者*的话,说明这是一个不能登录的账户,从上面可以看出,ubuntu 默认的就不启用 root 账户。
  3. 最近改动密码的日期(不是日期吗,咋是一堆数字,别急,这个是从 1970 年 1 月 1 日算起的总的天数)。那怎么才能知道今天距 1970 年 1 月 1 日有多少天呢?很简单,你改下密码,然后看下这个栏目中的数字是多少就可以了!
  4. 密码不可被变更的天数:设置了这个值,则表示从变更密码的日期算起,多少天内无法再次修改密码,如果是 0 的话,则没有限制
  5. 密码需要重新变更的天数:密码经常更换才能保证安全,为了提醒某些经常不更换密码的用户,可以设置一个天数,强制让用户更换密码,也就是说该用户的密码会在多少天后过期,如果为 99999 则没有限制
  6. 密码过期预警天数:如果在 5 中设置了密码需要重新变更的天数,则会在密码过期的前多少天进行提醒,提示用户其密码将在多少天后过期
  7. 密码过期的宽恕时间:如果在 5 中设置的日期过后,用户仍然没有修改密码,则该用户还可以继续使用的天数
  8. 账号失效日期,过了这个日期账号就不能用了
  9. 保留的

密码列

通常,passwd 直接为用户指定密码就 ok 了。但在某些情况下,要为待创建的用户事先指定密码,还要求是加密后的密码,例如 kickstart 文件中的 rootpw 指令,ansible 创建用户时提前指定密码等,这时候不得不手动生成合理的密码。

先说说 shadow 文件中第二列的格式,它是加密后的密码,它有些玄机,不同的特殊字符表示特殊的意义:

  1. 该列留空,即 :: ,表示该用户没有密码。
  2. 该列为 ! ,即 :!: ,表示该用户被锁,被锁将无法登陆,但是可能其他的登录方式是不受限制的,如 ssh 公钥认证的方式,su 的方式。
  3. 该列为 * ,即 :*: ,也表示该用户被锁,和 ! 效果是一样的。
  4. 该列以 !!! 开头,则也表示该用户被锁。
  5. 该列为 !! ,即 :!!: ,表示该用户从来没设置过密码。
  6. 如果格式为 $id$salt$hashed ,则表示该用户密码正常。其中$id$的 id 表示密码的加密算法, $1$ 表示使用 MD5 算法, $2a$ 表示使用 Blowfish 算法, $2y$ 是另一算法长度的 Blowfish, $5$ 表示 SHA-256 算法,而 $6$ 表示 SHA-512 算法,目前基本上都使用 sha-512 算法的,但无论是 md5 还是 sha-256 都仍然支持。 $salt$ 是加密时使用的 salt,hashed 才是真正的密码部分。