暗色模式

Linux 用户与组管理:从 useradd 到 sudo 权限体系

技术教程
2026-08-10
30
0

本文要点

  • 用户(user)与组(group) 是把"人/进程"和"权限"绑定在一起的机制;理解 /etc/passwd/etc/shadow/etc/group 三个配置文件,几乎所有命令都是在"改这几个文件";
  • 新增一个用户走 groupadduseraddpasswd 三步,改用户用 usermod,删除用户用 userdel -r(连带清理家目录);
  • 授权通过"用户 → 主组/附加组 → 权限"的链条下发,sudo 是提权的最后一道门,规则写在 /etc/sudoers,用 sudo -l 查看自己有哪些权限;
  • 结尾整理了新手最常踩的坑(UID 与 GID 两套计数器、密码策略 chage、删除用户是否清理残留),所有命令均在 Ubuntu 24.04 上真实执行验证。

为什么需要用户与组

Linux 是一个多用户操作系统,一台服务器上往往跑着多个服务、被多个工程师登录操作。如果所有人都是 root,任何一条手滑的命令(比如 rm -rf 敲错目录)都可能直接毁掉整个系统,而且出了问题根本分不清是谁干的。用户(user)组(group) 就是把"人/进程"和"权限"绑在一起的机制:

  • 每个用户有独立的身份(UID)、家目录、登录 Shell,以及它能执行什么命令的边界;
  • 组把一批用户归拢起来,方便统一授权——比如「运维组可以重启服务」「开发组只能看日志」。

这是一篇从零开始的用户与组管理指南:先讲清三个核心配置文件,再逐个过一遍 groupadd / useradd / passwd / usermod / sudo / userdel 的真实用法,最后是常见坑。所有命令都在 Ubuntu 24.04 上真实执行过。

用户与组的信息存在哪里

Linux 用三个文本文件记录用户与组的全部信息,理解了它们,几乎所有命令都是在"改这几个文件"。

/etc/passwd:用户帐号表

每个用户一行,用冒号分成 7 段:

bob:x:1000:1001::/home/bob:/bin/bash
字段含义
bob用户名
x密码占位符(真正的密码在 /etc/shadow 里)
1000用户 ID(UID)
1001主组 ID(GID)
(空)备注信息,如姓名/电话
/home/bob家目录
/bin/bash登录 Shell
一个小细节:上面这行里 UID 是 1000、GID 却是 1001,因为演示时先 groupadd 创建了组,组的 GID 从 1000 开始分配,随后 useradd 建的用户的 UID 才落到 1000,主组则拿走了下一个编号。UID 与 GID 是两套独立计数器,不要想当然地认为它们必须相等。

/etc/shadow:密码与有效期

/etc/passwd 是所有人可读的,所以密码绝不能放里面,而是放进权限为 600、属组为 shadow/etc/shadow

ls -l /etc/passwd /etc/shadow
-rw-r--r-- 1 root root    1920 Aug  6 21:14 /etc/passwd
-rw-r----- 1 root shadow  993 Aug  7 08:34 /etc/shadow

shadow 每行存密码哈希、最后修改时间、最短/最长有效期、过期警告天数等。密码策略相关的 chage 命令改的就是这里的字段。

/etc/group:用户组表

每行 4 段,重点是最后一段记录"这个组的成员(除主组外)":

webops:x:1000:bob
字段含义
webops组名
x组密码占位符(基本用不到)
1000组 ID(GID)
bob附加成员列表(逗号分隔)

所谓"主组"和"附加组":每个用户必须有一个主组(写入 /etc/passwd 的 GID),用户创建的文件默认属于主组;而附加组成员关系记在 /etc/group 里,用于授予额外的访问权限。

创建用户与组

创建组:groupadd

groupadd webops

创建后可用 getent group webopscat /etc/group 查看。改组名用 groupmod -n 新名 旧名,删组用 groupdel(组里还有用户作为主组时不能删)。

创建用户:useradd

useradd 是 Linux 下标准的添加用户命令,常用参数:

参数作用
-m同时创建家目录
-s /bin/bash指定登录 Shell(默认是 /bin/sh,交互体验差)
-G 组名把用户加入附加组
-d 路径指定家目录路径
-u 1001手动指定 UID
-e 日期指定帐号过期日期

创建一个用户 bob,自动建家目录,并把它加入刚才的 webops 组:

groupadd webops
useradd -m -s /bin/bash -G webops bob
id bob
getent passwd bob
getent group webops

实测输出如下:

创建用户与组

图中三行输出对应了三层信息:

  • id bobuid=1000(bob) gid=1001(bob) groups=1001(bob),1000(webops)——bob 的 UID 是 1000,主组是 1001,附加组里有 webops(1000);
  • getent passwd bob:显示 /etc/passwd 里那 7 段字段,Shell 已经是 /bin/bash
  • getent group webops:最后一段 bob 表明 webops 的附加成员里有 bob。

注意这时的 bob 还不能登录——它还处于"无有效密码"状态,密码需要单独设置。

设置与查看密码

passwd 设置密码

passwd bob

交互式输入两次密码即可。在脚本/远程场景下,可以用 chpasswd 批量设置:

echo "bob:DemoPass123!" | chpasswd

查看密码状态:passwd -S

passwd -S bob

输出形如 bob P 2026-08-10 0 99999 7 -1,含义依次是:用户名、状态码(P=已有可用密码,L=锁定,NP=无密码)、最后修改日期、最小有效期、最大有效期、警告天数、宽限天数。

密码有效期:chage

生产环境通常要求密码定期更换,用 chage 设置"密码每 90 天必须改一次":

chage -M 90 bob
chage -l bob

密码状态与有效期

图中 passwd -S bob 显示 bob 处于 P(有密码)状态;chage -M 90 bob 把最大有效期设为 90 天后,chage -l bobPassword expires 变成 Nov 08, 2026(正好是今天 8 月 10 日加 90 天),Maximum number of days between password change 变为 90。常用参数:-m 最短天数、-M 最长天数、-W 过期前警告天数、-E 帐号过期日期。

修改用户:usermod

useradd 时参数没考虑全很常见,usermod 用来事后修改:

参数作用
-aG 组名追加到附加组(必须带 -a,否则会替换掉原有组)
-s /bin/bash改登录 Shell
-l 新名改用户名
-L / -U锁定 / 解锁帐号
-e 日期设置帐号过期

最常用的是 usermod -aG sudo bob 把用户加入 sudo 组——这是 Ubuntu 上给普通用户提权到管理员的标准做法(见下一节)。

sudo 权限体系

两种授予方式

Ubuntu 默认开箱即用的管理员机制是 sudo(superuser do):普通用户用 sudo 命令 以 root 身份执行单条命令,而不用长期切换到 root。

  • 方式一:加入 sudo 组。Ubuntu 的 /etc/sudoers 里默认有一行 %sudo ALL=(ALL:ALL) ALL,意思就是"sudo 组的成员可以以任何用户身份执行任何命令"。所以一句 usermod -aG sudo bob 即可把 bob 变成管理员。
  • 方式二:编辑 /etc/sudoers.d/ 下的规则文件。需要给某个用户"只授权个别命令"时,在 /etc/sudoers.d/ 里放一个小文件,比直接改 /etc/sudoers 更安全(更新系统时不易被覆盖)。

实测:加入 sudo 组 + 精确授权

usermod -aG sudo bob
id bob
printf 'bob ALL=(ALL) NOPASSWD:/usr/bin/apt\n' > /etc/sudoers.d/bob-ops
chmod 0440 /etc/sudoers.d/bob-ops
visudo -c
sudo -l -U bob

sudo 授权与规则校验

拆解图中输出:

  • id bob 里出现了 27(sudo),说明 bob 已进入 sudo 组;
  • visudo -c校验所有 sudo 规则语法的必做动作,三行 parsed OK 表示 /etc/sudoers/etc/sudoers.d/ 下所有文件都合法;
  • sudo -l -U bob 列出 bob 实际能执行什么:既有 sudo 组给的 (ALL : ALL) ALL(全部命令),又有我们单独加的那条 (ALL) NOPASSWD: /usr/bin/apt——即运行 apt不需要再输密码。规则可以累加。

关于那条自定义规则,补充三点:

bob ALL=(ALL) NOPASSWD:/usr/bin/apt
  1. 语法是「用户 主机=(可以以谁的身份) 免密标记:命令」;
  2. 文件权限必须是 0440——第一次实测时我忘了 chmod 0440visudo -c 立刻报 bad permissions, should be mode 0440。sudoers 目录下所有文件都必须 root 可读写、其他人只读;
  3. 改完务必 visudo -c 校验语法,一旦写坏,所有 sudo 都会失效。

查看某用户能执行什么

sudo -l -U bob    # 查看 bob 的 sudo 权限
sudo -l           # 查看当前用户的权限

删除用户与组

userdel bob            # 删除用户,保留家目录
userdel -r bob         # 连家目录一起删
groupdel webops        # 删除组

userdel -r 会把家目录和邮件池一并清理,是清退离职人员时的标准做法。注意 userdel 前要确认该用户没有正在运行的进程,否则删了后进程仍以该 UID 运行。

常见坑

  1. useradd 忘了 -m:默认不建家目录,用户登录后没有 /home/bob。补救:usermod -m -d /home/bob bob
  2. usermod -G 不带 -a:会把用户现有的附加组全部替换成新组,把用户踢出原有权限组。务必写成 usermod -aG
  3. 新建用户无法登录useradd 创建的用户默认无有效密码(shadow 里是 !)。一定要先 passwd bobchpasswd
  4. sudo 规则权限不对/etc/sudoers.d/ 下文件权限必须 0440,否则 visudo -cbad permissions。改 sudoers 一律用 visudo,改完记得校验。
  5. 普通用户要进 sudo 组才轮不到"重启系统"权限:Ubuntu 上若用户不在 sudo 组、又没配置 sudoers 规则,sudo 会直接拒绝,报错明确说"用户不在 sudoers 中"。
  6. 删组前有成员groupdel 某组时若还有用户以它为主组,会报 cannot remove the primary group of user,需要先把这些用户的主组改到别处。

总结

用户与组是 Linux 权限体系的地基,和之前讲过的文件权限(chmod/ACL)、进程、日志共同构成服务器安全的最小闭环。上手路线:先理解 /etc/passwd/etc/shadow/etc/group 三张表,再用 useradd -m -s /bin/bash -G 建用户、passwd/chage 管密码、usermod -aG sudo 提权、visudo -c 校验规则,最后 userdel -r 清理。最核心的一句话:能用 sudo 单条提权就绝不用 root 长驻,配合用户分组,既安全又可审计。

发表评论

暂无评论,快来抢沙发吧!