暗色模式

Linux 文件权限实战:从 chmod 到 ACL 的完整指南

技术教程
2026-08-06
8
0

权限是 Linux 安全模型的第一道防线,也是最容易踩坑的地方:一条 chmod 777 或错误的 chown 就可能导致服务暴露、数据被删,甚至被提权攻破。本文以 Ubuntu 24.04 实测为基础,从 ls -l 的权限位解析讲起,覆盖 chmod/chown/umask 三种常规手段,再到 SUID/SGID/Sticky 三个特殊权限位,最后用 ACL 实现"给任意用户单独授权",并附上安全审计建议。全文命令均在 Ubuntu 24.04 上真实执行验证。

权限表示:读懂 ls -l 的十个字符

任何文件的权限都可以用一条 ls -l 看清。以最经典的 -rwxr-xr-x 为例,它由 10 个字符组成:

  • 第 1 位:文件类型。- 普通文件、d 目录、l 符号链接、c 字符设备、b 块设备;
  • 第 2-4 位:属主(owner,u)权限;
  • 第 5-7 位:属组(group,g)权限;
  • 第 8-10 位:其他用户(other,o)权限。

每一位上,r 表示读、w 表示写、x 表示执行(目录为"可进入"),- 表示没有该权限。把字符换算成数字就是常见的八进制:r=4、w=2、x=1,所以 rwx=7、rw-=6、r-x=5、r--=4。-rwxr-xr-x 换算后就是 755

文件与目录的 rwx 含义完全不同,这是新手最容易混淆的:

权限对文件对目录
r(读)查看文件内容列出目录中的文件名(ls)
w(写)修改文件内容在目录中创建、删除、重命名文件(还需 x)
x(执行)执行文件进入目录(cd)、访问其中文件

注意目录的微妙之处:只有 r 没有 x 时,能看到文件名列表但进不去也读不了内容;只有 w 没有 x 时无法真正增删文件。对目录来说,x(执行)是最基本的权限

修改权限:chmod 的数字模式与符号模式

chmod 有两种改法,工作中都会用到。

数字模式

直接把三位八进制数交给 chmod,每一位分别对应属主、属组、其他用户:

chmod 755 script.sh      # 属主 rwx,属组 r-x,其他 r-x —— 可执行程序/目录
chmod 644 report.txt     # 属主 rw-,属组 r--,其他 r-- —— 普通文件
chmod 600 id_rsa         # 属主 rw-,其他人无权限 —— SSH 私钥等敏感文件
chmod 700 ~/.ssh         # 只有属主可进入 —— 私有目录
chmod 775 /srv/shared    # 属组可写 —— 协作目录

符号模式

u(属主)、g(属组)、o(其他)、a(全部)配合 +(加)、-(减)、=(覆盖)来修改,多条规则用逗号分隔:

chmod u+x script.sh      # 给属主加执行权限
chmod g-w report.txt     # 去掉属组的写权限
chmod o= report.txt      # 其他用户全部权限清零
chmod u+rwx,g+rx,o-rwx   # 等价于 chmod 750

下面是一段在 Ubuntu 24.04 上的完整演示:先查看默认权限,再用数字模式和符号模式逐步修改,最后用 umask 确认新文件的默认权限(下一节详解):

权限查看与 chmod 实战演示

图中 a.txt 的权限变化值得逐行对照:

  • 初始 -rw-r--r--(644,默认创建);
  • chmod 640 后变为 -rw-r-----:属组和其他用户都失去了读权限;
  • 符号模式 chmod u+x,g-r 后变为 -rwx------:属主加了执行位,属组去掉了读位;
  • 最后 chmod 755 恢复为 -rwxr-xr-x,这也是脚本、目录最常用的权限。

默认权限:umask 决定新文件的出生权限

新创建的文件和目录并不是完全开放的:内核给文件的上限是 666、目录是 777,再用 umask(权限掩码) 按位"扣掉"一部分。规则很简单:最终权限 = 上限 - umask 中置 1 的位

umask          # 查看当前值(八进制)
umask 027      # 临时修改:文件 → 640,目录 → 750
umask -S       # 以符号形式查看,如 u=rwx,g=rx,o=rx
  • root 的 umask 通常为 022:文件 666-022=644,目录 777-022=755;
  • 普通用户常见 002:文件 664,目录 775,方便同组协作;
  • 需要私密环境时用 077:文件 600,目录 700。

上方截图中 umask 输出 0022,随后 touch b.txt 新建的文件权限正是 -rw-r--r--(644),与实际完全一致。临时修改只对当前 shell 生效,要持久化请写入 ~/.bashrc(或系统级 /etc/profile)。

修改属主属组:chown 与 chgrp

chown 用于修改文件的属主和属组,基本语法是 chown 属主[:属组] 文件:

chown alice report.txt        # 只改属主
chown :dev report.txt         # 只改属组(冒号前缀)
chown alice:dev report.txt    # 同时改属主和属组
chown -R alice:dev /srv/www   # 递归修改整个目录树

两个要点:

  • 只有 root 能修改文件的属主;普通用户只能修改自己拥有的文件的属组,而且必须是自己所在组的成员;
  • chgrp 专门用来改属组,等价于 chown :组名

一个经典坑:把别人的家目录 chown 给别人后,原属主会因权限不足无法 cd 回家——修改属主前务必想清楚所有相关路径。

特殊权限位:SUID、SGID 与 Sticky Bit

常规的 rwx 之外还有三个特殊位,分别用 sst 表示,它们只在特定场景生效,却是安全漏洞的重灾区。

SUID:执行时获得属主身份(4)

带 SUID 的可执行文件,任何用户运行时,进程都会以文件属主的身份执行,而不是执行者自己。典型的例子是 /usr/bin/passwd:普通用户需要修改 /etc/shadow(仅 root 可写),passwd 程序就靠 SUID 以 root 身份完成写入:

ls -l /usr/bin/passwd
# -rwsr-xr-x 1 root root ... /usr/bin/passwd
#   ^ 属主执行位从 x 变成了 s

设置方法:chmod u+s 文件 或数字写法 chmod 4755 文件(4 就是 SUID)。注意查看时的小写 s 表示"有执行位且带 SUID",大写 S 表示"没有执行位却挂了 SUID",后者是配置错误。

安全警示:SUID 是经典的后门手法——攻击者把某个程序(如 vim)复制到隐蔽路径并加上 SUID,普通用户就能以 root 身份运行它读写任何文件,且事后难以察觉。审计命令:

find /usr/bin -perm -4000 -type f 2>/dev/null

在 Ubuntu 24.04 上会看到 sudosumountchshnewgrpfusermount3 等系统必备工具。对不属于系统的 SUID 文件保持警惕,定期用这条命令巡检。

SGID:目录里的"组继承"魔法(2)

SGID 对文件的作用类似 SUID 的组版本;更常用的是对目录的作用:在带 SGID 的目录中新建的文件和子目录,自动继承该目录的属组,而不是创建者的主组。团队共享目录靠它省去大量 chgrp 操作。

chmod g+s shared_dir        # 符号模式
chmod 2775 shared_dir       # 数字模式,2 就是 SGID

下方截图演示了完整过程(所有命令在 Ubuntu 24.04 实测):

SUID、SGID 与 Sticky 位实战演示

逐行解读:

  • /usr/bin/passwd 权限 -rwsr-xr-x,属主执行位上的 s 就是 SUID;
  • /tmp 权限 drwxrwxrwt,末尾的 t 是 Sticky 位(见下节);
  • chgrp nogroup shared && chmod 2775 shared 后,目录显示为 drwxrwsr-x,属组执行位的 s 即 SGID;
  • 关键在最后:touch shared/f1.txt 新建的文件显示 -rw-r--r-- 1 root nogroup,属组自动变成了 nogroup——这正是 SGID 目录的继承效果,创建者是 root 也一样继承。

Sticky Bit:公共目录里"只能删自己的"(1)

Sticky 位只对目录有意义:目录虽然对所有人可写,但每个用户只能删除、重命名自己拥有的文件,无法动别人的。/tmp 就是典型——drwxrwxrwt 末尾的 t 表明:人人可写,但谁也删不掉别人的文件。设置方法:

chmod +t /tmp/upload        # 符号模式
chmod 1777 /tmp/upload      # 数字模式,1 就是 Sticky

没有 Sticky 位的共享可写目录,任何用户都能删掉别人的文件,这是 /tmp 类目录必备的防护。注意 Sticky 不阻止修改文件内容,只限制删除与重命名。

ACL:给任意用户单独授权

传统权限模型只有一个属主、一个属组,遇到"这个文件要让 alice 读写、让 dev 组只读、其他人无权限"的需求就束手无策。ACL(访问控制列表) 可以给任意用户或组单独设置权限,突破了"一属主一属组"的限制。Ubuntu 需要先安装工具包:

apt install acl        # Ubuntu 24.04 实测:getfacl 2.3.2

查看与设置:getfacl / setfacl

setfacl -m u:alice:rw report.txt    # 给用户 alice 读写权限
setfacl -m g:dev:r-x report.txt     # 给组 dev 读+执行
setfacl -x u:alice report.txt       # 删除 alice 的条目
setfacl -b report.txt               # 清除所有扩展 ACL
getfacl report.txt                  # 查看 ACL

下图在 Ubuntu 24.04 上演示:先把 a.txt 归一到 644,再给用户 nobody 授予读写权限:

ACL 精细权限实战演示

注意两个细节:

  1. 设置 ACL 后,ls -l 的权限串末尾出现 + 号(-rw-rw-r--+),这是"该文件带扩展 ACL"的标志;
  2. ls -l属组位显示的是 mask 而非真实的组权限:图中组位显示 rw-,而 getfaclgroup::r-- 才是组实际权限。mask::rw- 是"所有命名用户/组的权限上限",由 setfacl 自动取各条目并集算出。

mask:权限的"天花板"

mask 的作用是把自定义条目的实际权限压到上限以内。把 mask 降为 r 后,即使 alice 的条目写着 rw-,实际生效也只有读:

setfacl -m m::r report.txt
getfacl report.txt | grep -E 'mask|alice'
# user:alice:rw-    #effective:r--
# mask::r--

#effective 标注的就是真实生效的权限——排查"明明授权了 rw 却只能读"这类问题时,第一个要看的就是 mask。权限判定顺序:属主 → 命名用户 → 命名组 → 属组(mask) → 其他。

默认 ACL:让新文件自动继承

给目录设置默认 ACL 后,其中新建的文件会自动继承授权,非常适合共享目录:

setfacl -d -m u:www-data:rwx /srv/shared   # 新文件自动带上 www-data 权限

getfacl 输出中带 default: 前缀的行就是默认条目。备份与恢复也有标准姿势(tar 等工具默认不保留 ACL,cp 记得加 -p):

getfacl -R /srv/shared > acl-backup.txt     # 备份
setfacl --restore acl-backup.txt            # 恢复

安全建议与日常巡检

  • 最小权限:能 644 不要 777,能 750 不要 755;Web 目录常见组合是文件 644、目录 755;
  • 定期审计 SUID:find / -perm -4000 -type f 2>/dev/null,核对每个结果是否必要;
  • 敏感文件给 600/700:SSH 私钥、凭据文件、备份脚本所在目录一律收紧;
  • 共享目录用 SGID + 默认 ACL 代替反复 chgrp,用 Sticky 保护公共可写目录;
  • 动手前先 ls -l:改权限前看清当前属主属组和权限,chown -R 这类命令确认路径无误再执行;
  • 验证权限时,用 sudo -u alice cat file 以目标用户身份实测,比只看 ls 更可靠。

参考资料

文中所有命令均在 Ubuntu 24.04 LTS(内核 6.8)上真实执行验证,截图即终端原始输出。

发表评论

暂无评论,快来抢沙发吧!