欢迎来到罐子的实验室
本次目标
理解 Linux「谁能做什么」的安全模型——用户、组、文件权限,以及如何提权(su / sudo)。
学完你能做什么:
- 看懂
ls -l 输出里的权限位 rwxr-xr-x - 用
chmod 改权限、chown/chgrp 改所有者
1. Linux 是多用户系统
Linux 从设计之初就是多用户的——一台机器上可以有很多人同时登录、各干各的,互不干扰。系统用两个机制管理这件事:
- 用户(user):每个使用者一个账号,有唯一用户名和 UID(数字 ID)。
- 组(group):用户的集合,方便批量授权。一个用户可以属于多个组。
所有用户信息存在 /etc/passwd(名字虽然叫 passwd,但现在不存密码了):
user@host:~$ cat /etc/passwdroot:x:0:0:root:/root:/bin/bashdaemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin...user:x:1000:1000::/home/user:/bin/bash
每行 7 个字段,用 : 分隔:用户名 : 密码占位 : UID : GID : 备注 : 家目录 : Shell。
最重要的两个用户:
- 你自己
root(UID 0)—— 超级管理员,能做任何事,安全攻防的终极目标
动手练习 1:你属于哪些组
任务:用 id 命令查看你的 UID、GID 和所属的组。
参考答案:
user@host:~$ iduid=1000(user) gid=1000(user) groups=1000(user),27(sudo)
意思:你的 UID 是 1000、主组是 user,还额外属于 sudo 组。
2. 看懂权限位
ls -l 每行开头那 10 个字符就是权限信息:
user@host:~$ ls -ltotal 4-rw-r--r-- 1 user user 0 Jun 30 18:00 file.txtdrwxr-xr-x 2 user user 4096 Jun 30 18:00 mydir
拆解 -rw-r--r--:
- rw- r-- r--┃ ┃ ┃ ┗━━ 其他用户 (other)┃ ┃ ┗━━━━━ 所属组 (group)┃ ┗━━━━━━━━ 所有者 (user/owner)┗━━━━━━━━━━━━ 文件类型(- 普通文件,d 目录)
三组 rwx 分别对应:所有者 / 组 / 其他人。
每个字母的含义:
所以 -rwxr-xr-- 表示:所有者可读写执行,组可读和执行,其他人只能读。
目录的 x 权限是重点
很多人困惑:为什么我设了目录 r 却还是进不去?因为进入目录需要 x 权限,不是 r。
r-- —— 能 ls 看到文件名,但不能 cd 进去、不能读文件内容。--x —— 能 cd 进去、访问已知文件名,但不能 ls。r-x
动手练习 2:解读权限
任务:解读 drwxr-x--- 这个权限串的含义。
参考答案:
3. chmod:修改权限
chmod(change mode)改权限。两种写法:
符号模式:who +/-/= what
操作 +(加)、-(减)、=(设为)。
user@host:~$ touch f.txtuser@host:~$ ls -l f.txt-rw-r--r-- 1 user user 0 Jun 30 18:00 f.txtuser@host:~$ chmod u+x f.txt# 给所有者加执行权限user@host:~$ ls -l f.txt-rwxr--r-- ...# 变成 rwxuser@host:~$ chmod go-w f.txt# 去掉组和其他人的写权限(本来就没有,无变化)user@host:~$ chmod a+r f.txt# 所有人可读user@host:~$ chmod u=rw,go=r f.txt# 所有者读写,组和其他只读
数字模式:三位八进制
把 rwx 看成三个二进制位,r=4, w=2, x=1,加起来就是 0-7:
三位数字分别是 user/group/other:
user@host:~$ chmod 755 f.txt# rwxr-xr-x(脚本/程序常用)user@host:~$ chmod 644 f.txt# rw-r--r--(普通文件常用)user@host:~$ chmod 600 f.txt# rw-------(私密文件)user@host:~$ chmod 777 f.txt# rwxrwxrwx(⚠️ 所有人可写,危险)
动手练习 3:设个私密文件
任务:创建 secret.txt,权限设成只有你自己能读写(其他人完全无权限)。
思路引导:chmod 600 secret.txt。
参考答案:
user@host:~$ echo ”my password” > secret.txtuser@host:~$ chmod 600 secret.txtuser@host:~$ ls -l secret.txt-rw------- 1 user user 12 Jun 30 18:00 secret.txt
常见错误:
- ❌
chmod 777 —— 这等于「所有人都能改」,除非你明确要共享,否则别用。 - ⚠️ 改了权限还是
Permission denied?可能你不是所有者——只有所有者或 root 能改权限。
4. chown / chgrp:改所有者
文件属于谁、属于哪个组,也能改:
# chown 用户 文件 —— 改所有者# chown 用户:组 文件 —— 同时改所有者和组# chgrp 组 文件 —— 只改组
root@host:~# chown alice file.txt # 把 file.txt 给 alice(要 root 权限)root@host:~# chown alice:devs file.txt # 所有者 alice,组 devsroot@host:~# chgrp devs file.txt # 只改组
⚠️ 通常只有 root 能 chown(普通用户不能把文件「送给」别人)。chgrp 则要求你既是所有者、又属于目标组。
-R 递归改目录下所有内容:
root@host:~# chown -R alice /home/alice/project
动手练习 4:理解所有权
任务:用 ls -l 看 /etc/shadow(密码哈希文件)的所有者和权限,思考为什么普通用户读不了。
参考答案:
user@host:~$ ls -l /etc/shadow-rw-r----- 1 root shadow 1200 Jun 30 18:00 /etc/shadow
所有者是 root,组是 shadow,权限 rw-r-----:root 可读写,shadow 组可读,其他人(包括你)完全无权限。这就是为什么 cat /etc/shadow 会 Permission denied。
5. su:切换用户
su(switch user,原意 substitute user)让你切换成另一个用户,默认切到 root:
user@host:~$ suPassword:# 输入 root 密码root@host:/home/user# # 变成 root 了(提示符变 #)root@host:/home/user# exit # 退出,变回 user
su 用户名 切到指定用户:
user@host:~$ su alicePassword:alice@host:/home/user$
su -(或 su -l 用户)会模拟完整登录——加载该用户的环境变量、切到其家目录:
user@host:~$ su - alice# 比 su alice 更彻底
💡 su 要知道目标用户的密码。这在多用户共享机器时意味着密码要传来传去,不太方便也不太安全——所以现代系统更常用 sudo。
动手练习 5:体会 su(如有 root 密码)
任务:如果你的机器有 root 密码,su 切到 root,看提示符变成 #,再 exit 回来。没有 root 密码就跳过,看下一节 sudo。
6. sudo:以管理员身份执行单条命令
sudo(superuser do)让你以 root 身份执行一条命令,不需要 root 密码——它检查 /etc/sudoers 配置,看你的用户/组有没有授权,然后让你输自己的密码确认:
user@host:~$ cat /etc/shadowcat: /etc/shadow: Permission denieduser@host:~$ sudo cat /etc/shadow[sudo] password for user:# 输你自己的密码root:$6$...(密码哈希)...
sudo 比 su 安全得多:
- 可在
/etc/sudoers 里精细授权(谁能用 sudo 干什么)。 - 所有 sudo 操作都会记日志(
/var/log/auth.log),便于审计。
💡 sudo !! 是经典快捷操作:用 sudo 重跑上一条失败的命令。比如你打了 apt install xxx 失败(权限不足),直接 sudo !! 就行。
user@host:~$ apt install slE: Could not open lock file ... Permission denieduser@host:~$ sudo !!sudo apt install sl# 自动展开成这条
动手练习 6:用 sudo 看影子文件
任务:用 sudo cat /etc/shadow 读取影子密码文件(假设你在 sudoers 里)。
参考答案:
user@host:~$ sudo cat /etc/shadow | head -3root:$6$xxx:...daemon:*:......
常见错误:
- ❌
user is not in the sudoers file —— 你的账号没 sudo 权限,需要管理员把你加进 sudo 或 wheel 组。 - ⚠️
sudo 默认每 5 分钟内免再次输密码,别离开终端让人钻空子。
7. 密码存储:/etc/shadow
早期的 Unix 把密码哈希存在 /etc/passwd,但这个文件所有人都能读(很多程序要读用户名),于是密码哈希被搬到 /etc/shadow,只有 root 能读。
root@host:~# head -2 /etc/shadowroot:$6$xyz$哈希值:19000:0:99999:7:::daemon:*:19000:0:99999:7:::
每行:用户名 : 密码哈希 : ...其他策略字段。
* 或 ! —— 该账户禁用密码登录(系统服务账户常见)。$6$... —— SHA-512 哈希(加盐),登录时把你输的密码同样哈希后比对。
💡 这意味着即使拿到 /etc/shadow,也不能直接看到明文密码——只能用「字典爆破」工具(如 john)慢慢试。所以强密码 + 限制 shadow 读取权限很重要。
8. SUID:以文件所有者身份执行
rwx 之外还有几个特殊位,最关键的是 SUID(Set-owner-User-ID)。给一个可执行文件设了 SUID 后,任何人运行它,它都以「文件所有者」的身份执行。
user@host:~$ ls -l /usr/bin/sudo-rwsr-xr-x 1 root root 232K Dec 1 11:45 /usr/bin/sudo
注意所有者的执行位是 s 而不是 x——这就是 SUID 标志。意思是:无论谁运行 /usr/bin/sudo,它都以 root 身份运行(因为文件所有者是 root)。这正是 sudo 能提权的原理。
su、passwd(改自己密码却要写 /etc/shadow)也都靠 SUID。
设 SUID:
root@host:~# chmod u+s 某程序
⚠️ SUID 是把双刃剑。给一个 root 拥有的程序设 SUID = 任何能运行它的人都能借它变成 root。一旦该程序有漏洞,整个系统的 root 权限就可能被攻破。所以永远不要随意给程序加 SUID,定期审计系统里的 SUID 文件:find / -perm -4000 2>/dev/null。
动手练习 7:找系统里的 SUID 程序
任务:列出系统上所有设置了 SUID 的可执行文件。
参考答案:
user@host:~$ find / -perm -4000 2>/dev/null/usr/bin/sudo/usr/bin/su/usr/bin/passwd/usr/bin/chsh/usr/bin/newgrp/usr/bin/gpasswd...
(你应该看到的都是系统自带的合法程序。如果出现不认识的、尤其是 /tmp 之类的位置,就要警惕了。)
9. 权限的常见组合速记
| | |
|---|
| rw-r--r-- | |
| rw------- | |
| rwxr-xr-x | |
| rwx------ | |
| rwxr-xr-x | |
| rwx------ | |
| rwxrwx--- | |
| rwxrwxrwx | |
本模块速查表
| |
|---|
id | |
ls -l | |
chmod 模式 文件 | |
chmod 755 文件 | |
chown 用户 文件 | |
chgrp 组 文件 | |
su 用户 | |
sudo 命令 | |
sudo !! | |
权限位
- rw- r-- r-- (普通文件 rw-r--r-- = 644)┃ ┃ ┃ ┗━ other┃ ┃ ┗━━━ group┃ ┗━━━━━━ owner┗━━━━━━━━━ 文件类型 (- 文件 / d 目录)
rwx 数字
r=4 w=2 x=1 → 三位相加7=rwx 6=rw- 5=r-x 4=r-- 0=---
特殊位
下一步
你已掌握了命令、文件、权限。但每条命令都得手动敲、敲完就忘——能不能把一组命令存成脚本,按顺序自动跑?下一模块就带你写出第一个 Shell 脚本。