相关知识点
1. 核心概念:UID 与 GID
系统不识别用户名(如 root、xiaoxin),只识别数字标识:
- UID (User ID):用户的唯一数字标识。
- GID (Group ID):用户组的唯一数字标识。
CentOS 7/8/Stream 的 UID 惯例:
| UID 范围 | 用途 | 说明 |
|---|---|---|
0 |
超级管理员 root |
拥有全部权限 |
1--999 |
系统用户 | 由系统服务使用,通常无法登录终端 |
1000+ |
普通用户 | 由管理员手动创建 |
2. 关键配置文件(四大金刚 + 辅助配置)
用户信息存储在文本文件中,掌握它们就掌握了底层原理:
| 文件路径 | 存储内容 | 备注 |
|---|---|---|
/etc/passwd |
用户基本信息 | 用户名、UID、主目录、默认 Shell。所有人可读 |
/etc/shadow |
用户密码加密信息 | 加密密码、过期时间等。仅 root 可读 |
/etc/group |
用户组信息 | 组名、GID 及组内成员 |
/etc/gshadow |
用户组加密信息 | 组密码(已很少使用) |
2.1. /etc/passwd文件各字段解析
以
nginx:x:991:991:Nginx web server:/var/lib/nginx:/sbin/nologin为例。
/etc/passwd 文件中的每一行代表一个用户账户,由 7 个冒号分隔的字段组成。其完整格式为:
用户名:密码占位符:UID:GID:描述信息:家目录:登录Shell
以你给出的示例为例:
nginx:x:991:991:Nginx web server:/var/lib/nginx:/sbin/nologin
各字段的含义如下:
| 字段位置 | 字段值 | 含义解释 |
|---|---|---|
| 1 | nginx |
用户名:用户登录时使用的名称。 |
| 2 | x |
密码占位符 :x 表示加密后的密码实际存储在 /etc/shadow 文件中(更安全)。若为空或其它字符,则行为不同(空表示无密码,但现代系统几乎不会这么用)。 |
| 3 | 991 |
UID (User ID) :用户的数字唯一标识。此处 991 属于系统用户范围(CentOS 中 1--999 为系统用户),通常用于运行服务进程。 |
| 4 | 991 |
GID (Group ID) :用户初始组 的数字标识。这里 991 对应一个名为 nginx 的组(通常与用户名相同)。用户创建文件时,默认所属组就是这个 GID 对应的组。 |
| 5 | Nginx web server |
GECOS 字段(用户描述信息):可包含用户的全名、办公室位置、电话等额外信息。通常用于标识该账户的用途,无实际系统功能,仅为注释。 |
| 6 | /var/lib/nginx |
家目录 :用户登录后默认所在的目录。对于系统服务用户(如 nginx),家目录通常是一个服务专用的目录(例如 /var/lib/nginx),而不是 /home/nginx。 |
| 7 | /sbin/nologin |
登录 Shell :用户登录后执行的程序。/sbin/nologin 是一个特殊 shell,任何尝试登录该账户的操作都会被拒绝(并显示预设消息)。这表示该账户仅用于运行服务,不允许交互式登录。 |
补充说明:
- 系统用户D < 1000)将登录 shell 设置为
/sbin/nologin或/bin/false是常见的安全做法,可防止攻击者通过该账户登录系统。- 虽然该示例中的 GID 与 UID 数值相同,但并非强制要求------初始组可以与用户名不同。
辅助配置文件(控制 useradd 默认行为):
| 文件 | 作用 |
|---|---|
/etc/login.defs |
全局默认值(密码有效期、UID/GID 范围、家目录权限等) |
/etc/default/useradd |
useradd 命令的默认行为(默认 Shell、家目录父路径等) |
查看/修改 /etc/default/useradd 中的默认值:useradd -D
示例:useradd -D -s /bin/zsh(将新用户默认 Shell 改为 zsh)
2.2./etc/shadow文件各字段解析
该文件仅 root 可读,存储用户的加密密码以及密码老化策略。
格式(共 9 个字段):
shell
用户名:加密密码:上次修改时间:最小使用天数:最大使用天数:警告天数:不活动天数:失效日期:保留字段
示例行(普通用户)
shell
testuser:$6$abc123...:19000:0:90:7:14:19250:
各字段详解
| 字段位置 | 字段名 | 含义 | 示例值 | 说明 |
|---|---|---|---|---|
| 1 | 用户名 | 与 /etc/passwd 中一致 |
testuser |
关联用户 |
| 2 | 加密密码 | 用户密码的哈希值 | $6$... 或 ! 或 * |
$6$ 表示 SHA-512 加密;! 表示账户被锁定;* 表示该用户永远不能密码登录(通常为系统用户) |
| 3 | 上次修改时间 | 最后一次修改密码的日期,距离 1970-01-01 的天数 | 19000 |
可通过 date -d "1970-01-01 +19000 days" 查看具体日期 |
| 4 | 最小使用天数 | 密码修改后至少多少天内不能再次修改 | 0 |
0 表示随时可改;通常用于防止用户频繁改回旧密码 |
| 5 | 最大使用天数 | 密码最多使用多少天后必须修改 | 90 |
99999 表示永不过期 |
| 6 | 警告天数 | 密码过期前多少天开始警告用户 | 7 |
用户在登录时会收到警告信息 |
| 7 | 不活动天数 | 密码过期后多少天内仍允许登录(但必须改密码),超期后账户被锁定 | 14 |
若为 0 则过期立即锁定;若为空则永不过期锁定 |
| 8 | 失效日期 | 账户完全失效的绝对日期(距离 1970-01-01 的天数) | 19250 |
在此日期之后,无论密码是否过期,账户都无法登录 |
| 9 | 保留字段 | 未使用,留作将来扩展 | (空) | 通常为空 |
特殊标记说明
-
!!或!:用户被锁定(passwd -l或usermod -L产生)。 -
*:系统用户,无密码登录能力(如bin、daemon)。 -
空字段:比如某个字段为空,表示该功能未启用或无限。
2.3. /etc/gshadow 文件各字段解析
该文件仅 root 可读 ,用于存储组的加密密码、组管理员以及组成员列表(补充
/etc/group的不足)。
格式(共 4 个字段):
text
组名:加密密码:组管理员:组成员
示例行
text
testgroup:!:root:alice,bob
各字段详解
| 字段位置 | 字段名 | 含义 | 示例值 | 说明 |
|---|---|---|---|---|
| 1 | 组名 | 与 /etc/group 中一致 |
testgroup |
用户组名称 |
| 2 | 加密密码 | 组的密码(很少使用) | ! 或 $6$... |
! 表示没有组密码(绝大多数情况);如果设置了密码,非组内成员可用 newgrp 命令输入密码临时加入组 |
| 3 | 组管理员 | 可以管理该组成员(添加/删除)的用户列表,逗号分隔 | root |
管理员可以使用 gpasswd -a 等命令添加/删除成员,而不需要 root 权限 |
| 4 | 组成员 | 属于该组的普通成员列表,逗号分隔(注意:这里不包含以该组为初始组的用户) | alice,bob |
初始组成员在 /etc/group 的成员列表中不体现?实际细节:/etc/group 中的成员列表通常只记录附加组成员;而 /etc/gshadow 中的成员列表通常记录所有属于该组的成员(包括初始组和附加组)------ 但不同发行版处理方式略有差异。现代 Linux 中,/etc/group 的第 4 字段记录附加组成员,/etc/gshadow 的第 4 字段通常与 /etc/group 保持一致或更全。为安全起见,应通过 groupmems 或 gpasswd 管理,避免手动不一致。 |
补充说明
-
组密码的应用 :执行
newgrp groupname时,如果用户不在该组中,系统会提示输入组密码(如果设置了)。 -
组管理员 :可以执行
gpasswd -a user group和gpasswd -d user group。 -
常见状态 :绝大多数系统上,普通组的
/etc/gshadow第二字段为!,第三、四字段为空。
2.4. /etc/group配置文件解析
这个配置文件有四个字段
text
组名:密码站位符x:gid:组成员(附加组)
实例:
shell
[root@tomcat1 ~]# tail -2 /etc/group
testgroup:x:1500:
tomcat:x:888:
3. 用户管理核心命令
添加用户
bash
useradd [选项] 用户名
常用选项:
-u UID:指定 UID-g 组名:指定初始主组-G 组1,组2:指定附加组(一个用户可属于多个组)-s /sbin/nologin:禁止登录-m:强制创建家目录(即使默认不创建)
修改用户
bash
usermod [选项] 用户名
常用示例:
usermod -aG docker xiaoxin(将用户加入 docker 组,-a表示追加,避免覆盖原有附加组)usermod -L username(锁定用户,密码前加!!)usermod -U username(解锁用户)
删除用户
bash
userdel -r 用户名 # -r 会同时删除家目录及邮件池
修改密码
bash
passwd [用户名] # root 可改任何人,普通用户只能改自己的
用户锁定与解锁(三种方式对比)
| 方法 | 锁定 | 解锁 | 效果说明 |
|---|---|---|---|
passwd -l |
passwd -l username |
passwd -u username |
在 /etc/shadow 密码前加 !!,无法密码登录(但 SSH 密钥可能仍有效) |
usermod -L |
usermod -L username |
usermod -U username |
同上,本质一致 |
chage -E 0 |
chage -E 0 username |
chage -E -1 username |
账户直接过期,彻底无法登录(更严格) |
建议 :临时禁用用
usermod -L;永久禁用用chage -E 0或直接删除用户。
4. 用户组管理核心命令
创建/删除/修改组
bash
groupadd 组名
groupdel 组名
groupmod -n 新组名 旧组名 # 重命名组
管理组成员(推荐使用专用命令)
bash
gpasswd -a user group # 将用户加入附加组
gpasswd -d user group # 从组中移除用户
gpasswd -A user1,user2 group # 设置组管理员
groupmems -g group -a user # 将用户加入组(更适脚本)
groupmems -g group -l # 列出组成员
groupmems -g group -d user # 移除组成员
5. 用户和用户组管理扩展命令
5.1. 查看uid和gid是否被占用的命令
5.1.1. 查看uid的命令。
方法一:getent passwd(推荐,兼容 NSS 如 LDAP)
shell
getent passwd 991
-
如果返回一行用户信息(如
nginx:x:991:991:...),说明该 UID 已被占用。 -
如果无输出,则未被占用。
例子:
shell
[root@tomcat1 ~]# getent passwd 991
nginx:x:991:991:Nginx web server:/var/lib/nginx:/sbin/nologin
方法二:id 命令
shell
id 991
-
输出类似
uid=991(nginx) gid=991(nginx) groups=991(nginx)→ 已占用。 -
报错
id: '991': no such user→ 未占用。例子:
shell
[root@tomcat1 ~]# id 991
用户id=991(nginx) 组id=991(nginx) 组=991(nginx)
5.1.2. 查看gid的命令。
shell
getent group 991
-
返回组信息(如
nginx:x:991:)→ 已占用。 -
无输出 → 未占用。
例子:
shell
[root@tomcat1 ~]# getent group 888 # 输出了内容,说明这个gid已经被占用了。
tomcat:x:888:
[root@tomcat1 ~]# getent group 889 # 什么都没有输出,说明这个gid并没有被占用。
[root@tomcat1 ~]#
6. 初始组 vs 附加组
- 初始组 (Primary Group) :用户创建时必须属于一个组,默认与用户名同名,记录在
/etc/passwd的 GID 字段。用户创建文件时,该文件的所属组默认就是初始组。 - 附加组 (Secondary Group) :用户额外加入的组,用于获取其他资源的访问权限(例如加入
wheel组获得sudo权限)。
查看用户所属所有组:id 用户名 或 groups 用户名
7. 权限提权:sudo 与 wheel 组
- wheel 组 :在 CentOS 中,
/etc/sudoers默认配置了%wheel ALL=(ALL) ALL,即 wheel 组成员可通过sudo执行任何管理员命令。 - 将用户加入 wheel 组:
usermod -aG wheel xiaoxin - 之后用户执行
sudo <命令>并输入自己的密码即可提权。
8. 文件权限与用户/组的关系
ls -l 输出示例:-rw-r--r--
- 第 1 位:文件类型(
-普通文件,d目录,l软链接等) - 第 2--4 位:所有者 (Owner) 权限
- 第 5--7 位:所属组 (Group) 权限
- 第 8--10 位:其他人 (Others) 权限
更改所有权的命令
bash
chown user:group file # 同时更改所有者和所属组
chown user file # 仅更改所有者
chgrp group file # 仅更改所属组
chown -R user:group dir/ # 递归更改目录下所有文件
9. 扩展权限:ACL(访问控制列表)
传统权限模型只能设置一个所有者和一个所属组,而 ACL 可以为多个不同用户/组单独设置权限。
典型场景 :让 alice 可读 /data,bob 可写 /data,其他人无权限。
bash
setfacl -m u:alice:rx /data # 给 alice 读+执行
setfacl -m u:bob:rwx /data # 给 bob 全权限
setfacl -m g:developers:rx /data # 给 developers 组读+执行
setfacl -x u:alice /data # 移除 alice 的 ACL
getfacl /data # 查看当前 ACL
文件若带有 ACL,
ls -l权限末尾会显示+,如-rw-rwxr--+。
10. 切换用户与环境变量陷阱
| 命令 | 是否读取目标用户的登录脚本 | 环境变量 | 当前工作目录 |
|---|---|---|---|
su username |
否(仅部分读取 .bashrc) |
保留原用户的环境 | 不变 |
su - username |
是(完整登录:.bash_profile 等) |
完全切换到目标用户 | 切换到目标用户家目录 |
最佳实践 :除非特殊需求,否则始终使用 su - username。
免交互执行命令:
bash
su - username -c "ls -l /tmp"
sudo -u username command # 更安全的替代方案
11. 密码策略与老化管理(chage)
chage 可精细控制密码生命周期,对合规性环境很重要。
bash
chage -l username # 查看当前密码策略
chage -M 90 username # 密码最长使用 90 天
chage -m 7 username # 密码最短使用 7 天
chage -W 14 username # 过期前 14 天警告
chage -E 2025-12-31 username # 账户到期日(而非密码到期)
chage -d 0 username # 强制下次登录必须改密码
12. 用户资源限制:/etc/security/limits.conf
防止单个用户耗尽系统资源(如打开文件数、进程数)。
示例配置:
ini
# 限制 developer 组最多打开 65535 个文件
@developer soft nofile 65535
@developer hard nofile 65535
# 限制 oracle 用户最多 4096 个进程
oracle soft nproc 4096
oracle hard nproc 8192
查看当前限制:ulimit -a
临时修改(仅当前 shell):ulimit -n 4096
13. 用户登录限制(进阶)
13.1 系统维护模式
创建 /etc/nologin 文件后,所有普通用户无法登录,仅 root 可登录,并显示文件内容作为提示。删除文件即可恢复。
13.2 细粒度访问控制(/etc/security/access.conf)
需在 /etc/pam.d/sshd 中启用 pam_access.so,然后配置规则。示例:
conf
# 禁止 bob 从任何地方登录(除本地控制台)
- : bob : ALL EXCEPT LOCAL
# 允许 root 和 wheel 组从任何地方登录
+ : root wheel : ALL
# 其他人仅允许本地登录
- : ALL : ALL
+ : ALL : LOCAL
14. 用户审计:查看登录与失败记录
| 命令 | 作用 | 典型用法 |
|---|---|---|
last |
显示最近成功登录记录(来自 /var/log/wtmp) |
last -n 10 |
lastlog |
显示每个用户最近一次登录的时间和来源 IP | lastlog -u username |
faillog |
查看/重置用户登录失败的记录 | faillog -a(查看所有失败) faillog -r -u username(重置) |
lastb |
显示所有失败登录尝试 (来自 /var/log/btmp) |
`lastb |
w / who |
查看当前在线用户 | w(更详细,含负载) |
whoami |
显示当前有效用户名 | -- |
id |
显示当前用户的 UID、GID 及所属组 | -- |
安全提示 :定期检查
lastb可发现暴力破解尝试,结合fail2ban可实现自动封禁。
15. 用户模板目录:/etc/skel
当使用 useradd 创建新用户时,系统会自动将 /etc/skel/ 下的所有隐藏文件(如 .bashrc, .bash_profile, .profile)复制到新用户的家目录中。
用途 :如果想为每个新用户预设别名、环境变量或特定目录结构,直接修改 /etc/skel 即可。
16. 查询当前身份与系统状态速查
bash
id # UID、GID 及所有组成员
whoami # 我是谁
who am i # 更详细的原登录身份
w # 在线用户及他们在做什么
last # 历史登录记录
lastb # 失败登录记录
17. 常用场景速查表
| 需求 | 命令示例 |
|---|---|
| 新建用户,指定家目录和 Shell | useradd -m -s /bin/bash alice |
| 新建用户并加入多个附加组 | useradd -G wheel,docker alice |
| 修改用户的主组 | usermod -g newgroup alice |
| 将用户添加到附加组(不覆盖原组) | usermod -aG docker alice |
| 禁止用户登录(但保留数据) | usermod -L alice 或 passwd -l alice |
| 强制用户下次登录改密码 | chage -d 0 alice |
| 查看用户属于哪些组 | groups alice 或 id alice |
| 列出组内所有成员 | groupmems -g wheel -l |
| 给目录设置多个用户的不同权限 | setfacl -m u:alice:rx, u:bob:rwx /data |
| 限制用户只能 SFTP 不能 SSH | 修改 /etc/ssh/sshd_config 配合 Match User 或 ChrootDirectory(略复杂,需单独查阅) |
这份整合版既保留了原总结的清晰结构,又补充了 ACL、资源限制、登录审计、切换用户陷阱等实战内容,基本覆盖了 CentOS 用户与组管理的全部核心点。如果你有特定的场景需求(如"批量创建用户"或"配置用户只能运行某个命令"),可以在此基础上继续深入。
相关案例
1. 通过修改配置文件的方式创建用户和用户组
1.1. 创建用户组
- 修改
/etc/group和/etc/gshadow- 添加用户
testuser和组testgroupuid和gid都是1500
`/etc/group``文件各字段的含义
text
组名:密码站位符x:gid:组成员
`/etc/gshadow``文件各字段含义
text
组名:加密后的密码,如果不启用组的密码功能使用 ! 站位:gid:组成员
执行命令添加
shell
echo "testgroup:x:1500:" >> /etc/group
echo "testgroup:!:1500:" >> /etc/gshadow
1.2. 创建用户
- 修改
/etc/passwd和/etc/shadow
/etc/passwd文件各字段的含义
text
用户名:密码占位符x:uid:gid:描述字段:家目录:使用的bash的绝对路径
/etc/shadow文件各字段的含义
text
用户名:加密后的密码:上次修改的时间:最小使用时间:最大使用时间:警告时间:不活动天数:失效日期:保留字段
执行命令添加内容到/etc/passwd中
shell
echo "testuser:x:1500:1500:test user:/home/testuser:/bin/bash" >> /etc/passwd
编辑/etc/shadow
这个文件的第二个字段是加密后的密码,这意味着我们要先提前生成加密后的密码。
使用命令`openssl
shell
openssl passwd -6 mypass123 # 使用 SHA-512 加密
将生成的密钥放到passwd的第二个字段追加到/etc/shadow文件中。
[root@tomcat1 ~]# openssl passwd -6 12345678
$6$x8TDkF5F4nKrpAB9$pq94/aIKKDr4p8Uge2CHEXix5kJKtWMVLZLfp6Nlj576VpBB58RerPWO548ysRslcCgW41iHthFhUvo.VmqNn0
shell
echo "testuser:$6$x8TDkF5F4nKrpAB9$pq94/aIKKDr4p8Uge2CHEXix5kJKtWMVLZLfp6Nlj576VpBB58RerPWO548ysRslcCgW41iHthFhUvo.VmqNn0:0:0:99999:7:::" >> /etc/passwd
1.3. 配置用户家目录
拷贝用户家目录基础配置文件
shell
cp -R /etc/skel/. /home/testuser
修改用户家目录的所属组和所有用户
shell
chown -R testuser:testgroup /home/testuser
检验用户是否创建成功
shell
[xwang@tomcat1 home]$ su - testuser
密码:
上一次登录: 五 4月 10 11:10:45 CST 2026 pts/0 上
最后一次失败的登录: 五 4月 10 11:33:15 CST 2026 pts/0 上
最有一次成功登录后有 1 次失败的登录尝试。
[testuser@tomcat1 ~]$
[testuser@tomcat1 ~]$ pwd
/home/testuser
[testuser@tomcat1 ~]$ ls
[testuser@tomcat1 ~]$ mkdir testfile
[testuser@tomcat1 ~]$ ls
testfile
[testuser@tomcat1 ~]$ cd testfile/
[testuser@tomcat1 testfile]$ vim testfile
[testuser@tomcat1 testfile]$ cat testfile
nihao