chmod 777 是新手第一反应,也是第一个安全洞
新手遇到"权限不够"就 chmod 777,问题解决了,皆大欢喜。但 777 意味着所有人都能读、写、执行——你不是开了锁,是把门拆了。
正确做法是问"谁需要什么权限",而不是给所有人全部权限。一个配置文件,属主读写(6)、属组只读(4)、其他人无(0),合起来 640。一个脚本,属主可执行(7)、属组可执行(5)、其他人无(0),合起来 750。权限是按角色给,不是按方便给。777 解决的是"我现在跑不通",留下的是"以后谁都能改"的洞——这个洞往往几个月后才被发现,那时已经不知道谁改过什么。
下面是一个文件的权限矩阵。勾选属主/属组/其他人的 r/w/x,看不同身份的用户能做什么、八进制码是多少、有没有安全风险。
rwx 只是基础,真实权限系统还有三层容易被忽略:
setuid 让执行者临时获得文件属主权限(sudo 原理);sticky 位让只有属主能删自己目录里的文件(/tmp 用这个)。
rwx 只能按属主/属组/其他三类给。ACL 能给"张三单独读写"这种细粒度授权,setfacl/getfacl 操作。
sudo 不是"变成 root",是"以 root 身份执行这一条命令"且记录日志。比 su 安全,因为可追溯。
umask 决定新文件默认权限。022 让新文件 644、新目录 755;027 更严。配错会让新文件默认可写。
这四层加起来才是完整的权限系统。新手只学 rwx,遇到"我要给张三单独授权"就抓瞎(要 ACL),遇到"这个程序要以 root 跑但不想一直 root"就抓瞎(要 setuid 或 sudo)。权限系统的复杂度不在 rwx,在它之上。
所有权限设计的核心是最小权限原则(Principle of Least Privilege):每个主体只拥有完成任务所需的最小权限,不多给一点。这条原则贯穿所有权限系统——Linux 文件权限、数据库权限、云服务 IAM、应用 RBAC,都是它的具体实现。
落地有三个习惯:
所以判断一个权限设计好不好,就问一句:"如果这个权限被滥用,爆炸半径多大?" 爆炸半径大的(如 root、生产数据库写权限)必须最小化+审计+定期 review;爆炸半径小的(如个人开发分支)可以宽松。权限不是越严越好,是和爆炸半径匹配。