4. RHEL文件权限基础
在RHEL中,文件权限不是“一个开关”,而是一套由三组身份、三种操作位和若干特殊位共同组成的判定体系。理解它的关键,是先建立UGO模型:每个文件或目录都同时记录“属主(User)”“属组(Group)”“其他人(Other)”三类主体的权限,内核在访问时按“属主→属组→其他人”的顺序匹配,一旦命中某一类,就只使用该类权限位做判断,不再继续向后匹配。这个顺序决定了权限排查的基本方向:先看当前用户是谁,再看它落在哪一类,最后看该类是否具备所需权限。
UGO模型与rwx权限位
用 ls -l 查看文件时,第一列形如 -rwxr-x---,共10个字符。第1位表示文件类型(-普通文件、d目录、l符号链接等),后9位每3位一组,依次对应属主、属组、其他人的权限。每组内固定为 r、w、x 三个位置,缺失时用 - 占位。
对普通文件而言:r 允许读取内容,w 允许修改内容,x 允许作为程序执行。对目录而言,含义完全不同:r 允许列出目录中的文件名,w 允许在目录中创建、删除、重命名条目,x 允许进入目录并访问其中已知路径的元数据。目录的 x 位常被忽视,但它是“能否穿过该目录”的前提;只有 r 没有 x 时,可以列出名字却无法读取文件属性,只有 x 没有 r 时,知道确切文件名仍可访问,但无法枚举目录内容。
权限位也可以用八进制表示:r=4、w=2、x=1,每组三位相加得到0~7。例如 rwxr-x--- 对应 750,rw-r--r-- 对应 644,rwxrwxrwx 对应 777。八进制写法在批量设置时更简洁,符号写法在只调整某一位时更安全。
chmod、chown、chgrp:权限与归属的调整
chmod 修改权限位,支持符号和八进制两种模式。符号模式格式为 [ugoa][+-=][rwx],例如 chmod u+x script.sh 给属主增加执行权限,chmod go-w file 去掉属组和其他人的写权限,chmod a=r file 把三类主体都设为只读。八进制模式直接给出三位或四位数字,例如 chmod 640 report.txt、chmod 750 /srv/app。使用 -R 可递归处理目录,但递归修改前应确认目标范围,避免把不该开放的路径一并放开。
chown 修改属主和属组,chgrp 只改属组。常见写法:chown alice file 改属主;chown alice:dev file 同时改属主和属组;chown :dev file 只改属组;chgrp dev file 等价于只改属组。目录递归时常用 chown -R alice:dev /srv/project。需要注意,普通用户不能把自己的文件“送”给别人,只有 root 或具备相应能力的主体才能任意变更属主。
umask:新建对象的默认权限
新建文件和目录时,系统不会直接使用 777,而是用“基准权限减去 umask”得到默认权限。普通文件的基准是 666(默认不给执行位),目录的基准是 777。umask 表示“要屏蔽掉的位”,计算时按位取反再与基准相与,实际效果可理解为从基准中扣除 umask 中为1的位。
例如 umask 为 022 时:文件默认权限为 666 & ~022 = 644,目录默认权限为 777 & ~022 = 755。若 umask 为 027,文件为 640,目录为 750。查看当前 umask 用 umask,符号形式用 umask -S。临时修改只影响当前 shell:umask 027;持久化通常写入 /etc/profile、/etc/bashrc 或用户级 ~/.bashrc。RHEL 中 root 默认 umask 常为 022,普通用户也常为 002 或 022,具体以实际环境为准。
# 查看与验证 umask 效果
umask # 输出如 0022
umask -S # 输出如 u=rwx,g=rx,o=rx
umask 027
touch demo.txt && mkdir demo_dir
ls -ld demo.txt demo_dir
# 预期:demo.txt 为 -rw-r-----,demo_dir 为 drwxr-x---
特殊权限:SUID、SGID、Sticky
特殊权限位位于权限字符串中原本属于 x 的位置,用 s 或 t 表示,同时对应八进制的高位:SUID=4、SGID=2、Sticky=1。设置方式如 chmod 4755 /usr/bin/prog、chmod 2775 /srv/share、chmod 1777 /srv/tmp,也可用符号模式 chmod u+s、chmod g+s、chmod +t。
SUID 让可执行文件在运行时以文件属主身份执行,典型例子是 /usr/bin/passwd:普通用户需要写入 /etc/shadow,但该文件属主为 root 且权限严格,正是 SUID 让 passwd 临时获得 root 能力完成密码更新。SUID 风险较高,不应随意给脚本或自编程序设置,排查时可用 find / -perm -4000 -type f 2>/dev/null 列出所有 SUID 文件。
SGID 对文件的作用与 SUID 类似,只是切换为属组身份;对目录则用于继承属组:在设置了 SGID 的目录中新建文件,其属组会自动继承父目录属组,而不是创建者的主组。这在团队共享目录中非常实用,配合 chmod 2775 /srv/share 和 chgrp dev /srv/share,可让所有成员新建的文件都归入 dev 组。
Sticky 只对目录有意义,作用是限制删除和重命名:即使目录对其他人开放了写权限,也只有文件属主、目录属主或 root 能删除或重命名其中的文件。/tmp 就是典型场景,权限为 drwxrwxrwt,所有用户都能创建临时文件,但不能随意删除他人的文件。
777。权限排查的实用顺序
遇到“权限不够”时,可按以下顺序定位:先用 id 确认当前用户 UID、GID 和附加组;再用 ls -l 或 namei -l /path/to/file 查看目标文件及路径上每一级目录的权限;然后按 UGO 顺序判断当前用户命中哪一类,检查该类是否具备所需 r/w/x;最后确认是否涉及特殊权限或 ACL。目录路径中任意一级缺少 x,都会导致无法访问,这一点在排查“文件权限看起来没问题却打不开”时尤其常见。
掌握UGO模型、rwx语义、chmod/chown/chgrp、umask和特殊权限,就具备了RHEL权限管理的基本功。后续无论是配置服务目录、搭建共享空间,还是做安全基线加固,都建立在对这套权限判定逻辑的准确理解之上。