linux极简小知识:23、passwd、shadow和group文件的信息结构(内容含义)、及测试验证

353 阅读9分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

/etc/passwd

/etc/passwd文件

/etc/passwd 是系统用户配置文件(文本文件),包含了 Linux 系统绝大部分用户的信息(并不是所有)。每行信息包括用户名、密码、用户 ID、群组 ID、用户 ID 信息、用户的家目录和 Shell。

/etc/passwd 将每个用户的详细信息写为一行,使用 ":" 作为分隔符,包含七个字段:

# head -n 1 /etc/passwd
root:x:0:0:root:/root:/bin/bash

/etc/passwd文件中字段的含义

7 个字段的详细信息如下。

  • 用户名 (root): 已创建用户的用户名,字符长度 1 到 12 个字符。

如果passwd字段中的第一个字符是“*”的话,那么,就表示该账号被查封了,系统不允许持有该账号的用户登录。

  • 密码(x):代表加密密码,真正的加密密码字符保存在 /etc/shadow 文件中。

虽然"x"并不表示真正的密码,但也不能删除。

如果删除了 "x",那么系统会认为这个用户没有密码,从而导致只输入用户名而不用输入密码就可以登陆(只能在使用无密码登录时使用,远程时不可以)

  • 用户 ID(0):代表用户的 ID 号,每个用户都有一个唯一的 ID 。

UID 号 0 是为 root 用户保留的;

UID 号 1 到 99 是为系统用户保留的;

UID 号 100-999 是为系统账户和群组保留的;

UID 号 500~65535 用于普通用户。

  • 群组 ID (0):代表群组的 ID 号,每个群组都要有一个唯一的 GID ,保存在 /etc/group 文件中。

组ID 表示的是用户初始组ID号

  • 用户信息(root):代表描述字段,可以包含用户有关的一些信息。如用户的真实姓名、办公室地址、联系电话等。在Linux系统中,mail和finger等程序利用这些信息来标识系统的用户。

  • 家目录-home_directory(/root):代表用户的家目录。

  • 命令解释程序-Shell(/bin/bash):代表用户使用的 shell 类型。

关于初始组和附加组

初始组

初始组指用户登陆时就拥有这个用户组的相关权限。

每个用户的初始组只能有一个。

初始组通常就是和此用户的用户名相同的组名。创建用户时不指定组名,会默认创建一个名字和用户名相同的组。

# id root_test
uid=1002(root_test) gid=1002(root_test) groups=1002(root_test)

附加组

用户可以加入多个其他的用户组,并拥有这些组的权限。

每个用户只能有一个初始组,除初始组外,用户再加入其他的用户组,这些用户组就是这个用户的附加组。

查看包含的shell命令解释器

Shell是Linux的命令解释器。

通常,Linux系统默认使用的命令解释器是/bin/bash

查看其他的shell:

# cat /etc/shells
/bin/sh
/bin/bash
/sbin/nologin
/usr/bin/sh
/usr/bin/bash
/usr/sbin/nologin
/bin/tcsh
/bin/csh

/etc/shadow文件

/etc/shadow文件用于保存用户真正的加密密码,只有root用户可以浏览和操作。

如下,使用 tail -n 5 命令,查看 /etc/shadow 文件最后几行的内容:

# tail -n 5 /etc/shadow
gnome-initial-setup:!!:18068::::::
avahi:!!:18068::::::
root_test:$1$adX5vxxxxRLuaaAcn0:18872:0:99999:7:::
root_test1:$1$JgUsxxxxAQ1eJ0Eu0:18872:0:99999:7:::
root_test2:$1$n/XgxxxxMAoxeAFM/:18873:0:99999:7:::

/etc/shadow密码文件中,每行信息分为9段,同样使用分号 : 分割。

每个字段对应含义如下:

  • 用户名:登录系统时的用户名。
  • 加密密码:加密后的密码字符串。
  • 最后一次修改时间:用户最后一次修改密码的天数。
  • 最小修改时间间隔:两次修改密码之间的最小天数。
  • 最大修改时间间隔,即密码有效期:密码保持有效的最多天数。
  • 警告时间:从系统开始警告到密码失效的天数。
  • 密码过期后的宽限时间:密码过期的宽限。
  • 账号失效时间:密码失效的绝对天数。
  • 标识:保留字段,目前暂未使用。

下面是对几个字段的详细解释:

加密密码

加密密码 —— 保存的是真正加密的密码。目前Linux的密码采用的是 SHA512 散列加密算法(之前为MD5或DES)

注意,这串密码产生的乱码不能手工修改,如果手工修改,系统将无法识别密码,导致密码失效。

很多软件透过这个功能,⚠️在密码串前加上 "!"、"*" 或 "x" 使密码暂时失效

所有伪用户的密码都是 "!!" 或 "*",代表没有密码,不能登录。创建的用户如果不设定密码,则该密码项也是 "!!",代表用户没有密码,不能登录。

最后一次修改时间

最后一次修改时间 —— 最后一次修改该用户密码的时间。

上面的 root_test 用户显示的 18872 表示,从 1970 年 1 月 1 日开始的天数,比如 1971 年 1 月 1 日,就是 366 。此处表示,在 1970 年 1 月 1 日之后的第 18872 天修改的密码。

shell环境下,可以使用如下命令计算实际日期:

# date -d "1970-01-01 18872 days"
Thu Sep  2 00:00:00 CST 2021

最小修改时间间隔

最小修改时间间隔 —— 表示从第 3 字段(最后一次修改密码的日期)起,多长时间之内不能修改密码。如果是 0,则密码可以随时修改;如果是 10,则代表密码修改后 10 天之内不能再次修改密码。

⚠️利用该项设置,可以防止某些人频繁更改账户密码。

密码有效期

密码有效期 —— 表示距离第 3 字段(最后一次更改密码)多长时间内需要再次变更密码,否则该账户密码将会过期。它表示的是从 最后一次修改时间 开始的天数(已亲测,是距离最后一次修改的天数)。

默认值为 99999 天,超过了 273 年(99999 / 365 = 273.9),可认为是永久生效。

⚠️利用该字段,可强制用户定期修改密码。

如下,通过修改 root_test2 用户密码的有效期,使其在登陆时,强制修改密码。

  • 修改 shadow 中 root_test2 密码有效期
# vim /etc/shadow
....
root_test:$1$adX5vwNv$86CDLonksXyWLRLuaaAcn0:18872:0:99999:7:::
root_test1:$1$JgUsGC.W$ckJihuCtQZG0WAQ1eJ0Eu0:18872:0:99999:7:::
root_test2:$1$hPMr6JMQ$TC3LcS5rka312w979eWHr0:18873:0:3:7:::

如上,root_test2密码有效期为3天(此时已过期)。

保存并退出。

如果不修改,或修改失败,下次登陆时还会强制要求修改密码。

  • 切换用户,登陆后强制要求修改密码
[root@VM_0_15_centos ~]# su - root_test
Last login: Tue Sep 14 08:41:41 CST 2021 on pts/0
[root_test@VM_0_15_centos ~]$ su - root_test2
Password:
You are required to change your password immediately (password aged)
Changing password for root_test2.
(current) UNIX password:
New password:
BAD PASSWORD: The password fails the dictionary check - it is too simplistic/systematic
New password:
BAD PASSWORD: The password is too similar to the old one
New password:
Retype new password:
Last login: Tue Sep 14 08:50:02 CST 2021 on pts/0
[root_test2@VM_0_15_centos ~]$

如上,切换用户root_test2后,直接显示需要"立即修改密码"。密码不能太简单,且不能和旧密码相同相似【关于密码复杂度的设置规则和启用,会在后面的文章中进行介绍】。

此时回到root用户,查看 /etc/shadow 文件,可以看到 root_test2 如下,最后修改密码时间已经更新,仍需3天后修改:

root_test2:$1$hPMr6JMQ$TC3LcS5rka312w979eWHr0:18884:0:3:7:::

⚠️修改密码有效期等属性,推荐使用更直接的 chage 命令。

警告时间

表示在距离过期多少天之内,会有密码即将过期的警告。

如下,重新登录上面修改密码后的 root_test2 用户,由于其密码过期警告时间为7天,而密码3天后过期,因此会提示“密码将会过期”:

[root_test@VM_0_15_centos ~]$ su - root_test2
Password:
Warning: your password will expire in 3 days
Last login: Tue Sep 14 09:06:24 CST 2021 on pts/0
[root_test2@VM_0_15_centos ~]$

注:直接从 root 用户进入不会提示密码即将过期,因为从root切换用户不需要密码,也就不会去检查是否过期,以及提示!

密码过期后的宽限时间

表示密码过期后,在指定的天数内,还可以修改密码重新使用。否则将不能修改密码和使用。

账号失效时间

同第 3 个字段一样,使用自 1970 年 1 月 1 日以来的总天数作为账户的失效时间。表示,账号在超过该时间之后,不论密码是否过期,都将无法使用,即账号失效。

⚠️该字段通常被用在具有收费服务的系统中。

忘记密码或丢失密码的处理!

如果忘了自己的密码怎么办?该如何处理?

普通账户的密码丢失,可以在root账户下(或有权限的账户下),通过 passwd <user_name>命令可以重新指定用户密码。

如果 root 账号的密码遗失,则需要重新启动进入单用户模式,系统会提供 root 权限的 bash 接口,此时可以用 passwd 命令修改账户密码;也可以通过挂载根目录,修改 /etc/shadow,将 root 账户的密码清空,此方式可使用 root 无需密码即可登陆,然后登陆后使用 passwd 命令配置 root 的密码。

可以查找相关资料进一步了解!

/etc/group文件

用户组的所有信息存放在 /etc/group 文件中。

其字段信息也是使用冒号 : 分割 组名:口令:组标识号:组内用户列表

# cat /etc/group
root:x:0:
bin:x:1:
daemon:x:2:
sys:x:3:
adm:x:4:
tty:x:5:
disk:x:6:
lp:x:7:
mem:x:8:
kmem:x:9:
wheel:x:10:
......省略
root_test:x:1002:
root_test1:x:1003:
root_test2:x:1004:
  • 组名:由字母或数字构成。

  • 口令:口令字段存放的是用户组加密后的口令。一般Linux系统的用户组都没有口令,即这个字段一般为空,或者是x。

  • 组标识号:组ID与用户标识号类似,也是一个整数,被系统内部用来标识组。别称GID.

  • 组内用户列表:是属于这个组的所有用户的列表,不同用户之间用逗号(,)分隔。这个用户组可能是用户的主组,也可能是附加组。

参考

主要参考自linux cat /etc/passwd 说明Linux中/etc/passwd配置文件详解,以及参考了很多linux /etc/passwd详解中的内容,但是此内容不知是Linux/centos版本不同的原因,还是作者写错了,介绍的应该是 shadow 文件,但是内容值得一看,并且可结合自己实际系统,测试验证。