Linux文件权限
Linux 权限模型是「三组身份 × 三种操作」的矩阵:属主/属组/其他人各配 rwx。rwx 数值表示与 chmod 用法见 Linux系统管理 的权限章节,本文讲容易踩坑的三个深层问题:rwx 对文件和目录的含义不同、三种特殊权限位、umask 如何决定默认权限。
rwx 在文件与目录上含义不同
这是最高频的误解:同一个字母,作用在文件和目录上是两回事。
| 权限 | 对文件 | 对目录 |
|---|---|---|
| r | 能读内容 | 能 ls 列出目录里有哪些文件名 |
| w | 能改内容 | 能在目录里创建/删除/重命名条目 |
| x | 能执行 | 能 cd 进入、能访问目录内文件的元数据 |
两个推论,排障常用:
- 删除文件看的是目录的 w,不是文件的权限。对文件有 r 没 w 照样能删它(只要对所在目录有 wx);反之 root 之外的人想删文件,先得有目录写权限。
- 目录只有 r 没有 x:能看见文件名列表,但进不去也读不了里面的文件;只有 x 没有 r:进得去但列不出内容,知道确切路径仍可访问文件。
身份匹配顺序固定:先看属主,命中即止;再看属组;最后其他人。属主即使也在属组里,也只按属主权限算。
特殊权限位:SUID、SGID、Sticky
三者都是加在标准 rwx 之上的第四位,数值法用前缀 4/2/1 表示(如 4755)。
| 权限 | 位置 | 效果 | 典型例子 |
|---|---|---|---|
| SUID (4) | 可执行文件 | 执行时临时获得文件属主的身份 | /usr/bin/passwd 属主是 root,普通用户改密码时借它写 /etc/shadow |
| SGID (2) | 可执行文件 | 执行时获得文件属组身份 | 少见 |
| SGID (2) | 目录 | 目录内新建的文件自动继承目录的属组 | 团队协作目录 |
| Sticky (1) | 目录 | 只有文件属主和 root 能删目录里的文件 | /tmp(drwxrwxrwt),人人可写但互删不了 |
ls -l /usr/bin/passwd # -rwsr-xr-x,s 在属主 x 位即 SUID
ls -ld /tmp # drwxrwxrwt,t 在其他人 x 位即 Sticky
chmod 4755 prog # 加 SUID
chmod 1777 /data/shared # 加 Sticky
chmod g+s /data/team # 目录加 SGIDSUID 是提权漏洞的高发点
任何 SUID root 的可执行文件都可能被利用提权。审计命令:find / -perm -4000 -type f 2>/dev/null,出现来历不明的 SUID 文件要立即排查。
umask:默认权限怎么算出来的
新建文件不是"默认 777 再减"。规则是:目录起始 777、文件起始 666(文件默认不给 x,避免垃圾文件可执行),再按 umask 掩掉对应位。普通用户 umask 通常 002,root 022:
| umask | 新目录 | 新文件 |
|---|---|---|
| 022 | 755 | 644 |
| 002 | 775 | 664 |
| 077 | 700 | 600 |
umask # 查看
umask 027 # 当前会话修改
echo "umask 027" >> ~/.bashrc # 持久化文件起始是 666 而非 777,所以 umask 033 得到的文件是 644 而不是 744——减出来的 x 不会凭空出现。
超出三组身份:ACL
传统模型一个文件只能配一个属主、一个属组。需要"给用户 A 单独开读权限但不改属组"时,用 ACL(访问控制列表)追加条目:
setfacl -m u:alice:r file.txt # 给 alice 加读权限
getfacl file.txt # 查看(ls -l 权限位尾部出现 +)
setfacl -x u:alice file.txt # 移除该条目ACL 与基础权限叠加生效,常用于共享目录的细粒度授权。