Linux 文件权限
Chen Kai CTO

Linux 文件权限系统围绕属主、属组、其他人三大角色进行控制。本篇从概念出发,带你理解如何通过 chmod、chown 等操作,配置文件安全与访问策略。

一、Linux 文件权限概述

文件属主与属组

  • 属主(Owner, u):创建或被指定为文件/目录拥有者的用户。
  • 属组(Group, g):多个用户可以同属一个组,在组内具有共享/协同权限。
  • 其他用户(Others, o):不属于该文件属主或属组的所有人。

基础权限位

  • r(读):对文件可读取内容;对目录可列出文件名。
  • w(写):对文件可修改内容;对目录可创建、删除、重命名文件。
  • x(执行):对文件可执行程序;对目录可 cd 进入、访问子文件。

示例权限串:rwxr-xr-x 表示:

  • 属主拥有 rwx(4+2+1=7)
  • 属组拥有 r-x(4+0+1=5)
  • 其他拥有 r-x(4+0+1=5)

二、常规权限命令

1.chmod 与数字/符号表示法

数字表示

权限位 数字
r (读) 4
w (写) 2
x (执行) 1

三种权限相加构成属主、属组、其他三组数,如 754 表示 rwx / r-x / r--

1
chmod 754 file.sh

代表让文件对于属主可读写执行,对于属组和其他仅读和执行。

![Demystifying SUID and SGID bits](./Linux 文件权限/image-37.png)

符号表示

1
2
3
chmod u+w file.txt
chmod g-x somefile
chmod a+r notes.md
  • u/g/o/a:针对属主/属组/其他/所有。
  • + - =:添加、去除、直接赋值权限。

2.chown 与所有权变更

1
2
3
chown newowner file
chown newowner.newgroup file
chown .newgroup file
  • 只有 root 或具有特权的用户可执行。
  • chown 能一次改属主和属组(用 “.” 或 “:” 分割),也可只改属组。

3.目录权限与区别

目录而言:

  • r:可用 ls 查看目录内容。
  • w:可在目录内新增/删除/改名文件。
  • x:可 cd 进去或访问该目录里的内容。

4. umask

umask 是 Linux 和 Unix 系统中的一个命令,用于设置文件或目录的默认权限屏蔽值(User File Creation Mask)。它决定了新创建的文件或目录的默认权限。

![Umask](./Linux 文件权限/Users_Groups-Umask_Example.png)

如何计算权限

  1. 默认权限

    1. 文件默认权限:666(rw-rw-rw-,不包括执行权限)
    2. 目录默认权限:777(rwxrwxrwx,读、写、执行权限)
  2. 实际权限

    1. 实际权限 = 默认权限 - umask 值

例如:umask 为 022,文件默认权限为 666,实际权限为:

1
666 - 022 = 644 (rw-r--r--)

同样,目录默认权限为 777,实际权限为:

1
777 - 022 = 755 (rwxr-xr-x)

如何查看和设置 umask

1
umask

设置新的 umask

1
umask 027

这里设置屏蔽值为 027,新创建的文件将具有权限 640,目录权限为 750。

永久设置 umask

编辑 Shell 配置文件(如 ~/.bashrc 或 ~/.zshrc),添加以下内容:

1
umask 027

常见 umask 值

  • 022:文件权限 644,目录权限 755(常用,保护文件不被其他用户修改)。
  • 027:文件权限 640,目录权限 750(更严格,仅允许同组用户访问,常用于生产环境)。
  • 002:文件权限 664,目录权限 775(适合共享环境,允许同组用户修改,常用于开发环境)。

5. 修改文件特殊属性 chattr

chattr 是 Linux 系统中的一个命令,用于更改文件或目录的属性(change attributes)。通过 chattr 设置的属性可以控制文件的某些行为,比如防止文件被删除或修改。可以通过 lsattr 查看到对应属性。

常见用途

  1. 保护文件不被修改或删除
  2. 加速日志文件的追加写入
  3. 防止文件被意外覆盖或重命名

语法

1
chattr [选项] [+/-/=][属性] 文件或目录

常用属性

属性 作用
a 仅允许追加写入(append-only)。
i 不允许修改或删除(immutable)。
d 在使用 dump 备份时,忽略该文件或目录。
e 文件使用扩展格式存储(extents),默认值。
s 文件被删除时,用 0 填充文件数据(安全删除)。
u 文件被删除时,内容会被保存,可以稍后恢复(undelete)。

示例

  1. 防止文件被删除或修改

    1
    2
    3
    4
    sudo chattr +i example.txt

    # 防止 /etc/fstab 或 /etc/passwd 等重要系统文件被误修改:
    sudo chattr +i /etc/fstab
  2. 日志文件只允许追加写入

    1
    2
    3
    4
    sudo chattr +a logfile.txt

    # 防止日志文件被覆盖或意外清空:
    sudo chattr +a /var/log/syslog
  3. 备份时忽略某个目录

    1
    sudo chattr +d myfolder

注意事项

  1. 权限要求:需要超级用户权限(sudo)才能更改大多数文件的属性。
  2. 支持的文件系统:chattr 主要适用于 ext2/ext3/ext4 文件系统,其他文件系统可能不支持某些属性。
  3. 谨慎使用:设置 +i 属性后,无法删除或修改文件,只有超级用户能解除限制。

6. lsattr 查看特殊权限

选项 作用
-a 显示包括隐藏文件(以 . 开头的文件)的所有文件属性。
-d 显示目录本身的属性,而不是目录中的内容。
-R 递归显示目录及其子目录中的文件属性。
-v 显示文件的版本号(很少用)。

lsattr 输出中,每个文件或目录的属性由 10 个字符表示,常见的格式如下:

![image-20250127005208300](./Linux 文件权限/image-20250127005208300.png)

三、进阶:特殊权限(SUID / SGID / Sticky 位)

特殊权限可赋予可执行文件或目录,使它们具有超出常规 rwx 的特殊行为。本节重点分析 SUID、SGID、Sticky 三种。

![Linux File Permissions are not only about R+W+X, it’s also about SUID, SGID, and sticky bit](./Linux 文件权限/FcTez6NWQAYxkr7.jpeg)

1.SUID(Set User ID)

1.1 原理

当一个可执行文件被赋予 SUID 权限后,普通用户执行该文件时,会以该文件的属主身份运行程序,而不仅仅是调用者自身的身份。常见示例是 /usr/bin/passwd,它的属主为 root,且 SUID 生效,让任何用户都能安全地更改自己密码(进而写入 /etc/shadow)。

![image-20250126231517290](./Linux 文件权限/image-20250126231517290.png)

Why:SUID 让特定程序能突破调用者权限执行关键操作,但仅限程序内部实现,非给用户全局 root 权限。

1.2 查看与设置

ls -l 中,如果可执行文件设置了 SUID,则属主的执行权限位会显示 s 而非 x。例如:-rwsr-xr-x

  • 设置 SUID

    1
    chmod u+s myprog
  • 去除 SUID

    1
    chmod u-s myprog
  • 数字方式:在原有权限基础上加 4 至属主位,比如 chmod 4755 file 表示 rwsr-xr-x

1.3 测试示例

先编写一个简易 C 程序 myprog.c

1
2
3
4
5
6
7
8
9
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main() {
printf("Real UID=%d, Effective UID=%d\n", getuid(), geteuid());
system("id");
return 0;
}
  1. 编译生成 myprog:

    1
    gcc -o myprog myprog.c
  2. 将属主设为 root 且加 SUID:

    1
    2
    sudo chown root myprog
    sudo chmod 4755 myprog
  3. 普通用户执行:

    1
    ./myprog

打印出 Real UID 为当前普通用户,但 Effective UID 显示 0(root),从而以 root 权限执行 system("id")

![image-20250126231949945](./Linux 文件权限/image-20250126231949945.png)

1.4 安全注意事项

  • SUID 程序一旦出现漏洞,可能被恶意利用获取更高权限。
  • 避免对不可信或不必要的程序设置 SUID。
  • 检查并最小化系统 SUID 程序列表(find / -perm -4000)以降低安全风险。

2.SGID(Set Group ID)

2.1 SGID 应用场景

  1. 可执行文件:进程运行时,其有效组 ID 替换为文件的属组。常见于一些特殊组可访问的工具。
  2. 目录:更常用场景:当目录设置 SGID,则在此目录中新建的文件或子目录会继承该目录的组,而非创建者的默认组,从而便于同一项目组成员共享文件,类似于共享文件夹的概念。下面创建的文件夹也会有对应的 s 权限,实现了递归的效果。

2.2 设置 SGID

  • 查看:若 sgid 在文件/目录属组执行位,则显示 s,如 rwxr-sr-x
  • 设置: chmod g+s shared_dir 或数字方式加 2,如 chmod 2775 shared_dir

2.3 案例:共享项目组目录

假如有 /home/project/ 目录,需要多个组员共同读写且希望新建文件继承组 dev

  1. 建目录并属组设为 dev

    1
    2
    mkdir /home/project
    chown :dev /home/project
  2. 设 SGID:

    1
    chmod g+s /home/project

令各用户都在 dev 组内,这样任何人创建的文件都默认属组为 dev,便于组内共享。

3.Sticky 位(粘滞位)

3.1 作用与机理

Sticky 位最常见于多用户可写的公共目录,如 /tmp。当目录设置 Sticky 位后,该目录中文件只能被其属主或 root 删除或改名,即使其他人对该目录也有写权限,因此作用简单来说就是避免恶意用户删除他人的文件。

3.2 设置方法

  • chmod o+t dirname
  • 数字方式加 1:如 chmod 1777 /tmp 表示 rwxrwxrwt

3.3 /tmp 目录示例

ls -ld /tmp 常见显示: drwxrwxrwt

  • 说明 /tmp 对所有用户开放读写,但最后一个 t 使得只有文件属主能删除自己的文件。

四、应用与案例整合

1.合并特殊权限数字

若一个脚本需要 SUID + rwx (755) 则:

  • SUID = 4
  • rwx for owner, r-x for group/others = 755
  • 合并 → 4755

同理,如果某目录要 SGID + rwxrwsr-x = 2775:

1
chmod 2775 some_dir

2.检查系统中的 SUID 程序

1
find / -perm -4000 2>/dev/null
  • 定期审计可避免被不必要的 SUID 程序带来安全隐患。

3.安全小结

  • SUID:常见于 passwd, sudo, mount, umount 等关键程序,需谨慎管理。
  • SGID:适用于共享目录。
  • Sticky:防止公共写目录里文件被他人删除。

  • 本文标题:Linux 文件权限
  • 本文作者:Chen Kai
  • 创建时间:2025-02-14 00:00:00
  • 本文链接:https://www.chenk.top/Linux 文件权限/
  • 版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
 评论