centos、ubantu系列机的用户和用户组的结构是什么?具体怎么配置?用户组权限怎么使用?这篇文章持续更新,帮助你复习linux的基础知识

相关知识点

1. 核心概念:UID 与 GID

系统不识别用户名(如 rootxiaoxin),只识别数字标识:

  • 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 -lusermod -L 产生)。

  • * :系统用户,无密码登录能力(如 bindaemon)。

  • 空字段:比如某个字段为空,表示该功能未启用或无限。


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 保持一致或更全。为安全起见,应通过 groupmemsgpasswd 管理,避免手动不一致。
补充说明
  • 组密码的应用 :执行 newgrp groupname 时,如果用户不在该组中,系统会提示输入组密码(如果设置了)。

  • 组管理员 :可以执行 gpasswd -a user groupgpasswd -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 可读 /databob 可写 /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 alicepasswd -l alice
强制用户下次登录改密码 chage -d 0 alice
查看用户属于哪些组 groups aliceid alice
列出组内所有成员 groupmems -g wheel -l
给目录设置多个用户的不同权限 setfacl -m u:alice:rx, u:bob:rwx /data
限制用户只能 SFTP 不能 SSH 修改 /etc/ssh/sshd_config 配合 Match UserChrootDirectory(略复杂,需单独查阅)

这份整合版既保留了原总结的清晰结构,又补充了 ACL、资源限制、登录审计、切换用户陷阱等实战内容,基本覆盖了 CentOS 用户与组管理的全部核心点。如果你有特定的场景需求(如"批量创建用户"或"配置用户只能运行某个命令"),可以在此基础上继续深入。

相关案例

1. 通过修改配置文件的方式创建用户和用户组

1.1. 创建用户组

  1. 修改/etc/group/etc/gshadow
  2. 添加用户testuser和组testgroup
  3. uidgid都是1500

`/etc/group``文件各字段的含义

text 复制代码
组名:密码站位符x:gid:组成员

`/etc/gshadow``文件各字段含义

text 复制代码
组名:加密后的密码,如果不启用组的密码功能使用 ! 站位:gid:组成员

执行命令添加

shell 复制代码
echo "testgroup:x:1500:" >> /etc/group
echo "testgroup:!:1500:" >> /etc/gshadow

1.2. 创建用户

  1. 修改/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
相关推荐
zzzyyy5382 小时前
Linux环境变量
linux·运维·服务器
pluvium272 小时前
记对 xonsh shell 的使用, 脚本编写, 迁移及调优
linux·python·shell·xonsh
无级程序员3 小时前
centos7 安装 llvm-toolset-7-clang出错的问题解决
linux·centos
赛博云推-Twitter热门霸屏工具3 小时前
Twitter运营完整流程:从0到引流获客全流程拆解(2026)
运维·安全·自动化·媒体·twitter
CHHC18803 小时前
NetCore树莓派桌面应用程序
linux·运维·服务器
帮我吧智能服务平台4 小时前
装备制造智能制造升级:远程运维与智能服务如何保障产线OEE
运维·服务器·制造
w6100104664 小时前
cka-2026-cri-dockerd
运维·k8s·cka
云栖梦泽5 小时前
Linux内核与驱动:9.Linux 驱动 API 封装
linux·c++
卤炖阑尾炎5 小时前
PostgreSQL 日常运维全指南:从基础操作到备份恢复
运维·数据库·postgresql