编程与开发 · 第 18 期

权限系统设计,chmod 之外的坑

chmod 777 是新手第一反应,也是第一个安全洞

chmod 777 是新手第一反应,也是第一个安全洞。权限不止 rwx,还有属主/属组/特殊位、ACL、sudo。权限系统的精髓是最小权限原则:给刚好够用的权限,不多给。777 等于把门拆了,不是开锁。
⏱ 约 10 分钟 🎯 用过 chmod 但只会 777 的人 📦 源:linux-command §5

01一个反共识:777 不是"开放权限",是"拆掉权限"

新手遇到"权限不够"就 chmod 777,问题解决了,皆大欢喜。但 777 意味着所有人都能读、写、执行——你不是开了锁,是把门拆了。

777 = 属主 rwx + 属组 rwx + 其他人 rwx
= 任何用户都能改这个文件

正确做法是问"谁需要什么权限",而不是给所有人全部权限。一个配置文件,属主读写(6)、属组只读(4)、其他人无(0),合起来 640。一个脚本,属主可执行(7)、属组可执行(5)、其他人无(0),合起来 750。权限是按角色给,不是按方便给。777 解决的是"我现在跑不通",留下的是"以后谁都能改"的洞——这个洞往往几个月后才被发现,那时已经不知道谁改过什么。

777 不是开锁,
是拆门。
灏天文库 · 编程与开发 P.54

02权限矩阵演示:勾选权限看谁能干啥

下面是一个文件的权限矩阵。勾选属主/属组/其他人的 r/w/x,看不同身份的用户能做什么、八进制码是多少、有没有安全风险。

🔐 权限矩阵演示
勾选 r/w/x,看每个用户能干啥、八进制码、安全提示。
八进制码:000

03chmod 之外的三个权限层

rwx 只是基础,真实权限系统还有三层容易被忽略:

特殊位

setuid/setgid/sticky

setuid 让执行者临时获得文件属主权限(sudo 原理);sticky 位让只有属主能删自己目录里的文件(/tmp 用这个)。

ACL

给特定用户单独授权

rwx 只能按属主/属组/其他三类给。ACL 能给"张三单独读写"这种细粒度授权,setfacl/getfacl 操作。

sudo

临时提权 + 审计

sudo 不是"变成 root",是"以 root 身份执行这一条命令"且记录日志。比 su 安全,因为可追溯。

umask

新建文件的默认权限

umask 决定新文件默认权限。022 让新文件 644、新目录 755;027 更严。配错会让新文件默认可写。

这四层加起来才是完整的权限系统。新手只学 rwx,遇到"我要给张三单独授权"就抓瞎(要 ACL),遇到"这个程序要以 root 跑但不想一直 root"就抓瞎(要 setuid 或 sudo)。权限系统的复杂度不在 rwx,在它之上。

rwx 是基础,
ACL/sudo/特殊位是真功夫。
灏天文库 · 编程与开发 P.55

04最小权限原则:给刚好够用的,不多给

所有权限设计的核心是最小权限原则(Principle of Least Privilege):每个主体只拥有完成任务所需的最小权限,不多给一点。这条原则贯穿所有权限系统——Linux 文件权限、数据库权限、云服务 IAM、应用 RBAC,都是它的具体实现。

落地有三个习惯:

所以判断一个权限设计好不好,就问一句:"如果这个权限被滥用,爆炸半径多大?" 爆炸半径大的(如 root、生产数据库写权限)必须最小化+审计+定期 review;爆炸半径小的(如个人开发分支)可以宽松。权限不是越严越好,是和爆炸半径匹配。

05带走这套清单

✅ 权限系统 6 条可执行规则

  1. 777 是拆门不是开锁:按角色给权限,不按方便给。
  2. 配置文件 640、脚本 750 是常用安全默认,别上来就 777。
  3. chmod 之外还有三层:特殊位(setuid/sticky)、ACL、sudo。
  4. sudo 是临时提权+审计,比 su 安全:执行一条命令记一条日志。
  5. 最小权限原则:默认拒绝、按角色分组、定期回收。
  6. 权限严不严看爆炸半径:和风险匹配,不是越严越好。
最小权限不是越严越好,
是和爆炸半径匹配。
灏天文库 · 编程与开发 P.56