如果你已经跟着前面的内容把 Ubuntu 装起来、把常用命令跑熟了,那到了第3课第004篇,我们终于要摸到整个系统里最硬核的一条主干了:用户、权限、sudo 和 PAM。这四个词你平时都听过,甚至很多命令你早就在用了,可大多数人并没有把它们串成一条线,结果就是——遇到“新建用户没权限”“sudo 卡死”“远程登录被拒绝”这类问题,只能一个个搜片段,越搜越乱。
这篇我不想再给你列枯燥概念,而是把你丢进真实运维场景里,从一个普通用户如何诞生、如何拿到 sudo 提权、到系统底层怎么认证、怎么锁账户、怎么防爆破,一条链路走完。哪怕你只是笔记本电脑上装的单机 Ubuntu,理解这套机制后,以后看任何 Linux 服务器的权限问题都会通透很多。
1. 先搞清楚你在学什么:用户、权限、sudo、PAM 不是四件事
1.1 用“门禁系统”把四个概念一次理顺
很多教程把用户管理和权限管理分开讲,这是最大的误区。实际 Linux 的安全体系是连贯的:用户是身份,权限是边界,sudo 是提权入口,PAM 是认证规则。
打个比方。公司大楼不是让你随便进的,得先有工牌,这是用户;门禁能读到你工牌属于哪个部门,决定了你能进哪几层,这是权限;你临时要进服务器机房,不能直接拿万能钥匙,得找管理员登记授权,这是 sudo;而最外层那道闸机本身怎么验证你的卡、连续刷错几次会锁卡、什么时段允许刷卡,这是 PAM。
如果你只学会了 gpasswd 和 chmod,那只是拿到了几把钥匙,还不知道整栋楼的安全策略从哪儿下发。等出问题时,你都不知道该去查 /etc/passwd、/etc/sudoers 还是 /etc/pam.d。
1.2 Ubuntu 的安全体系和 Windows 有什么本质差异
之前有朋友问我:“为什么 Ubuntu 里不能像 Windows 那样直接用管理员账户?”这问题其实没问到点子上。
Windows 的 Administrator 是一个默认存在的超级用户,日常登录的一般是你自己建的管理员组成员,UAC 弹窗只是在模拟提权。Ubuntu 完全不同:安装系统时创建的那个用户虽然是“第一个用户”,但它本质上只是普通用户,只是安装程序顺手把你放到了 sudo 组里。
也就是说,Ubuntu 设计路线是:**root 账户存在但默认不可用,日常用普通身份干活,需要提升再到命令级授权。**这套设计的好处是:就算 Apache 被入侵、运行着恶意 PHP 脚本,它也只是一个 www-data 用户,写不了你的 /home 目录,更动不了系统核心文件。如果一上来就跑 root,那任何漏洞都是“管理员权限被拿下”的灾难级事故。
所以后面我们做的所有练习,都应该围绕“最小权限”这个原则来。你不是在学怎么把一个用户变成万能管理员,而是在学怎么精确地给每个身份发刚刚好够用的权限。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. Ubuntu 用户管理的底层:/etc/passwd、/etc/shadow 和 UID 分配
2.1 创建用户时系统到底改了什么文件
很多人用过的第一个建用户命令可能是 adduser 或 useradd,但大多数人不知道它们背后改了哪些文件。如果你不知道,后面排查问题就只能靠猜。
Linux 的用户信息核心在三个文件:
| 文件 | 存放内容 | 权限 |
|---|---|---|
| /etc/passwd | 用户名、UID、GID、家目录、登录 Shell | 所有用户可读 |
| /etc/shadow | 密码哈希、账户过期时间、锁定标记 | 仅 root 可读 |
| /etc/group | 组名、GID、组成员 | 所有用户可读 |
为什么密码哈希单独放在 /etc/shadow?因为历史上 /etc/passwd 是全局可读的,而哈希值一旦被读到,离线爆破只是时间问题。所以现代 Linux 把密码迁移到 root 专属文件里,/etc/passwd 的密码字段只留一个 x。
拿我自己一台服务器上的记录举例,/etc/passwd 里一行大概是:
text复制zhangsan:x:1001:1001::/home/zhangsan:/bin/bash
字段依次是:用户名、密码占位符、UID、主 GID、描述、家目录、登录 Shell。看到 UID 1001 你就该知道,这是个安装系统后手动创建的普通用户。Ubuntu 从 1000 开始分给普通用户,0 是 root,1 到 999 是给系统服务和守护进程的。
2.2 为什么你不会在 /etc/shadow 里看到明文密码
/etc/shadow 里保存的是经过单向哈希算法处理的密码,常用的有 SHA-512、bcrypt、yescrypt。所谓单向,就是只能从密码算出哈希,不能从哈希反推密码。
我见过有人手痒把 /etc/shadow 里的哈希复制出来,放到在线网站想“解密”,最后当然一无所获。正确的思路是:登录时系统把你输入的密码做同样的哈希计算,然后和 shadow 里的值对比,一致则认证成功。
线上环境还要注意,不要把 /etc/shadow 从一个发行版直接复制到另一个发行版。不同系统默认哈希算法可能不同,比如 Ubuntu 22.04 以后逐渐切到 yescrypt,换到旧系统可能会出现所有密码都验证不了的情况。
2.3 用户组不是摆设:主组和附属组的区别
每个用户必有一个主组,写在 /etc/passwd 的 GID 字段。同时可以加入若干附属组,写在 /etc/group 里。
举个例子:
bash复制sudo usermod -aG sudo zhangsan
这里的 sudo 是附属组。用户对某个文件的实际权限,是由“主组权限 + 所有附属组权限合并”决定的。这不是简单的叠加,而是取最大权限集。比如一个用户和另一个用户在同一个组里,即使两人主组不同,也能通过组权限共享文件。
我强烈建议,给用户加组时永远带上 -a 参数。如果漏了 -a,直接执行 usermod -G sudo zhangsan,会把该用户原来的附属组全部替换掉,用户可能瞬间失去 docker 组、dialout 组等之前加的权限,而且这种错误很难第一时间想到。
