权限是 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 确认新文件的默认权限(下一节详解):

图中 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 之外还有三个特殊位,分别用 s、s、t 表示,它们只在特定场景生效,却是安全漏洞的重灾区。
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 上会看到 sudo、su、mount、chsh、newgrp、fusermount3 等系统必备工具。对不属于系统的 SUID 文件保持警惕,定期用这条命令巡检。
SGID:目录里的"组继承"魔法(2)
SGID 对文件的作用类似 SUID 的组版本;更常用的是对目录的作用:在带 SGID 的目录中新建的文件和子目录,自动继承该目录的属组,而不是创建者的主组。团队共享目录靠它省去大量 chgrp 操作。
chmod g+s shared_dir # 符号模式
chmod 2775 shared_dir # 数字模式,2 就是 SGID下方截图演示了完整过程(所有命令在 Ubuntu 24.04 实测):

逐行解读:
/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 后,
ls -l的权限串末尾出现+号(-rw-rw-r--+),这是"该文件带扩展 ACL"的标志; ls -l的属组位显示的是 mask 而非真实的组权限:图中组位显示rw-,而getfacl里group::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 更可靠。
参考资料
- Understanding File Permissions with chmod and chown on Ubuntu
- GNU Coreutils 手册:chmod 调用
- Ubuntu Manpages:chmod(1)
- Ubuntu Manpages:setfacl(1)
- Ubuntu Manpages:getfacl(1)
- Red Hat 企业版 Linux:使用访问控制列表(ACL)
文中所有命令均在 Ubuntu 24.04 LTS(内核 6.8)上真实执行验证,截图即终端原始输出。
评论 (0)
暂无评论,快来抢沙发吧!