Linux 的权限系统主要围绕“用户类型”、“权限类型”和“特殊权限”三个核心维度展开。


一、 核心基础:权限的三要素 (rwx)

Linux 中的每个文件或目录都有对应的读 r (read)、写 w (write)、执行 x (execute) 权限:

  • r (4):读取文件内容,或列出目录下的文件名。
  • w (2):修改文件内容,或在目录下创建/删除/重命名文件。
  • x (1):作为程序执行文件,或进入(cd)目录。

二、 用户身份划分 (ugo)

Linux 将权限检查分为三个维度:

1. u (User/Owner):文件所有者。
2. g (Group):文件所属组的成员。
3. o (Others):既不是所有者,也不在组内的其他用户。
4. (还有一个 a - All,代表 u+g+o)

当我们执行 ls -l 时,会看到类似 -rwxr-xr-- 的字符串,解析如下:
* 第一个字符:文件类型 (- 是普通文件,d 是目录,l 是软链接等)。
* 接下来的 rwx:所有者权限。
* 中间的 r-x:所属组权限。
* 最后的 r--:其他用户权限。


三、 权限的数学表示法 (Chmod)

为了方便管理,Linux 用八进制数表示权限组合:
* r=4, w=2, x=1, -=0
* 例如 rwxr-xr-x 即为 755 (4+2+1, 4+0+1, 4+0+1)

常用命令: chmod
* chmod 755 file:所有者读写执行,组和其他只读执行。
* chown user:group file:修改文件所属用户和组。


四、 进阶:特殊权限 (SUID, SGID, Sticky Bit)

作为资深工程师,这部分内容在处理复杂的生产环境问题(如权限提升、共享目录冲突)时至关重要:

1. SUID (Set User ID)
* 表现:文件所有者权限位上的 xs 替换。
* 作用:当普通用户执行该文件时,程序会以“文件所有者”的权限运行(如 /usr/bin/passwd,普通用户改密码需要修改 /etc/shadow,这是只有 root 才能读写的)。
2. SGID (Set Group ID)
* 表现:组权限位上的 xs 替换。
* 作用:在目录下启用时,新创建的文件会继承该目录的所属组,而不是创建者的主组,非常适合团队协作目录。
3. Sticky Bit (粘滞位)
* 表现:其他用户权限位上的 xt 替换。
* 作用:常见于 /tmp 目录。使用后,用户即便对目录有写权限,也只能删除/修改属于自己的文件,不能删除别人的文件。


五、 资深工程师的排查逻辑

当你遇到“Permission Denied”时,我通常建议按以下步骤排查:

1. 检查所有者与组:确认你是谁 (whoami),以及文件属于谁 (ls -l)。
2. 检查路径权限这是最容易忽略的。即使文件本身权限 777,但如果其上一级目录没有 x 权限,你依然无法进入该目录访问文件。
3. 检查 ACL (Access Control Lists):如果传统 ugo 不够用,使用 getfaclsetfacl 查看是否有更细粒度的控制。
4. 检查安全模块:排除了文件权限仍报错?检查 SELinuxAppArmor 的策略日志(通常在 /var/log/audit/audit.logdmesg 中),它们在内核层面对进程行为有额外限制。
5. 检查文件挂载选项:如果是在外部存储或 NFS 上,检查挂载参数是否包含 noexec(禁止执行)或 ro(只读)。


思考建议
在生产环境中,“最小权限原则 (Principle of Least Privilege)” 是最高准则。尽量不要使用 777,如果要授权,优先考虑通过用户组权限变更来实现,而不是盲目打开文件权限。

对于这段权限原理,你是在具体的项目部署中遇到了阻碍,还是希望深入理解这块的系统安全?我可以针对具体场景为你深入细化。