Linux 账号管理

概述

既然 Linux 系统可以提供多用户多任务环境,那么本文便介绍一下与用户账号相关的知识。

详述

在 Linux 系统中,与用户账号相关的文件主要涉及:/etc/passwd/etc/shadow (记录 owner 信息)、/etc/group/etc/gshadow (记录 group 信息)。

/etc/passwd 中,每一行表示一个 owner,举例并解释各字段如下:

1
2
3
4
5
6
7
8
9
10
11
12
yl:x:1001:1001::/home/yl:/bin/bash
各字段以 ':' 分割,共计 7 个。
- 账号名称,用以用户记忆使用。
- 账号密码,早期该位置放置密码,但是由于此文件各用户均可访问,从而容易造成密码被窃。现今账号密码
已放置于 /etc/shadow(仅特定账号和特定群组可访问) 之中,因此字段显示为 x。
- UID,一对一映射账号名称,用以计算机使用。
在 Linux 系统中,UID=0 为系统管理员账号,UID=[1-999] 为系统账号,UID=[1000-] 为可登录账号。
UID=0 的账号具有特殊权限,其余账号均无特殊权限。
- GID,一对一映射群组名称,用以计算机使用。
- 使用者信息说明,用以介绍该账号的用途,基本没什么用。
- 主文件夹,指明当前账号的家目录,其中存放当前账号的个人数据。
- Shell,指明当前账号所使用的 SHELL 环境。

/etc/shadow 中,每一行表示一个 owner 的密码信息,举例并解释各字段如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
yl:Y6FFNSuN66W...:18694:0:99999:7:::
各字段以 ':' 分割,共计 9 个。
- 账号名称,对应 /etc/passwd 中的账号名称。
- 账号密码,通常取值为真实密码的 SHA-512。
- 最近更动密码日期,取值为一整数,表示自 1970 年 1 月 1 日至今所经过的天数。
- 密码不可被更动的天数,用以限制账号使用者频繁更动密码。
- 密码需要重新更动的天数,用以保证密码的安全性。如果超过此天数限制,则账号 “过期”,
此时登录系统,则会被强制要求更动密码。
- 密码需要重新更动前的警告天数,用以提醒账号使用者,需要及时更动密码。
- 密码过期后的宽限天数,如果账号过期,且在宽限天数内未曾更动密码,则账号 “失效”。
账号失效,意味着该账号再也无法登录此系统。
- 账号失效日期,取值为一整数,含义与 “最近更动密码日期” 相同,常为收费系统所使用。
- 保留字段。

借助于两个文件中各字段含义,简单说明三个使用操作:

  1. 文件 inode 中实际存放的是 UID 和 GID。当使用 ls -l 进行查看文件时,系统会自动根据 /etc/passwd/etc/group 找到 UID 和 GID 所对应的英文字符,从而将其显示出来。
  2. 当我们进行文件操作时,系统会提取特定文件的 UID 与 GID,并将其与使用者的 UID 与 GID 进行对比,如果满足权限,则进行操作,否则提示权限不足。
  3. 当使用者登录系统时,系统将会基于 /etc/passwd/etc/shadow 核对使用者所输账号密码信息,如果两者不相符则退出,否则依据 /etc/passwd 中该账号的后两个字段,提供指定 SHELL 并切换至家目录 (其中涉及 SHELL 初始配置等操作),以供使用者使用此系统。

/etc/shadow 的每行信息中,重点在于前两个字段,后面几个字段基本不使用。

指令 passwd 可用于修改账号密码,使用者可修改自身账号密码,root 用户可修改任意账号密码。如果使用者忘记自身密码,需借由 root 用户帮助而重置密码;如果 root 用户忘记密码,仍可基于某些方法 (例如,重新开机进入单人维护模式) 进入系统,从而重置密码。

/etc/group 中,每一行表示一个 group,举例并解释各字段如下:

1
2
3
4
5
6
yl:x:1001:hhd,dms
各字段以 ':' 分割,共计 4 个。
- 群组名称,用以用户记忆使用。
- 群组密码,其含义与账号密码一致,供给 “群组管理员” 使用,现基本不使用此。
- GID,一对一映射群组名称,用以计算机使用。
- 群组所支持的账号名称集,即这些账号均属于此群组。

/etc/gshadow 中,每一行表示一个 group 的密码信息,举例并解释各字段如下:

1
2
3
4
5
6
yl:!::hhd,dms
各字段以 ':' 分割,共计 4 个。
- 群组名称,对应 /etc/group 中的群组名称。
- 群组密码,现今基本不存在 “群组管理员”,因此其取值通常为 !。
- 群组管理员对应账号,因为不存在 “群组管理员”,因此该字段为空。
- 群组所支持的账号名称集,与 /etc/group 最后一个字段含义相同。

对于群组而言,还存在些许概念值得一提:

  1. 默认情况下,创建某个账号时,会自动创建一个同名群组,并将此账号添加至此同名群组之中,当然用户也可指定此账号添加至某特定群组之中。该账号所属群组即称为 初始群组/etc/passwd 中 GID 所指代的便是初始群组。另外,在新版 Linux 系统的 /etc/group/etc/gshadow 中,如果某群组为某账号的初始群组,则该群组的第四个字段中不再会包含此账号信息。
  2. 一个账号可添加至多个群组中,而在执行操作时所发挥作用的群组 (例如,查看文件时,依据哪个群组进行权限判断) 称为 有效群组。用户登录系统后,有效群组即为初始群组,可使用指令 groups 进行查看,随后可借由指令 newgrp 进行切换 (基于此指令切换有效群组后,使用者即会进入另一个 SHELL 环境中,若需退出,输入 exit 即可)。

所涉指令

系统管理员所能使用的指令有:

  • useradd –> 添加一个用户账号,与此相关的各种默认参数值见于 /etc/default/useradd/etc/login.defs
  • usermod –> 修改用户账号相关信息。
  • userdel –> 删除一个用户账号。
  • passwd –> 为用户账号创建、修改、删除密码。
  • chage –> 查看用户密码的详细信息,也可更新相关字段信息。
  • groupadd/groupmod/groupdel –> 添加、修改、删除一个群组账号。
  • gpasswd –> 创建一个群组管理员 (已基本不使用)。

使用者借用 passwd 更新自身密码时,首先需要输入当前密码,然后才能输入更新密码,且密码需满足一定安全规则;root 用户借用 passwd 设置密码时,直接输入更新密码即可。

用户所能使用的指令有:

  • id –> 查询自身的 UID/GID 等信息。
  • finger –> 查询自身账号信息。