Skip to content

Linux-权限

权限基础概念

三位一体权限系统:

  • 用户权限 (u):文件所有者
  • 组权限 (g):文件所属组
  • 其他用户权限 (o):除拥有着和属组之外的用户权限(最低的)

权限类型

符号数字文件权限目录权限
r4读取文件内容列出目录内容
w2修改文件内容创建/删除目录内文件
x1执行文件进入目录
-0无权限无权限

目录权限

查看目录的权限需要读(r)权限,进入目录创建文件需要执行(x)权限,在该目录中创建文件或文件夹和删除需要写(w)权限

NOTE

对文件写入内容需要文件的权限。对文件创建和删除需要上级目录的权限

特殊权限

suid(Set - User - ID)

概念

  • 当一个可执行文件设置了 suid 位后,用户在执行该文件时,会临时拥有该文件所有者的权限。换句话说,就是进程在执行过程中会以文件所有者的用户身份来运行。这对于一些需要特定权限才能完成任务的程序非常有用。例如,/usr/bin/passwd 这个用于更改用户密码的程序就设置了 suid 位。因为只有超级用户(root)才有权限修改密码文件(/etc/shadow),通过设置 suid,普通用户在运行 passwd 命令时,就可以临时获得 root 权限来修改密码。

设置和查看方法

  • 设置:使用 chmod 命令,格式为 chmod u+s 文件名。例如,要给一个名为 test 的可执行文件设置 suid,可以执行 chmod u+s test。
  • 查看:在 ls -l 命令的输出中,文件权限的第 4 位(原本是用户权限位)如果显示为 s(对于可执行文件)或者 S(对于不可执行文件),则表示设置了 suid。例如,-rwsr - xr - x 表示文件设置了 suid,其中 s 的出现位置表示它替代了原来的用户可执行权限位。

应用场景和注意事项

  • 应用场景主要是用于系统管理工具。像前面提到的 passwd、mount、umount 等命令,它们需要以 root 权限来操作系统的敏感文件(如密码文件、挂载点等),通过设置 suid,可以让普通用户在使用这些命令时获得必要的权限。
  • 然而,suid 也存在安全风险。如果一个具有 suid 权限的可执行文件存在漏洞,恶意用户可能利用这个漏洞以较高的权限执行恶意操作。因此,系统管理员应该谨慎使用 suid,只在必要的程序上设置,并且定期检查这些程序的完整性。

sgid(Set - Group - ID)

概念

  • 对于目录来说,设置 sgid 位后,该目录下的所有新创建的文件和子目录都会继承该目录的所属组。这样可以保证在一个共享目录中,所有文件的所属组保持一致,方便组内成员对该目录下的文件进行操作。
  • 对于文件,如果设置了 sgid 位,当文件被执行时,进程会以文件所属组的权限来运行。不过这种情况相对较少使用。

设置和查看方法

  • 设置:使用 chmod 命令,格式为 chmod g+s 目录名(对于目录)或 chmod g+s 文件名(对于文件)。例如,要给一个名为 shared_dir 的目录设置 sgid,可以执行 chmod g+s shared_dir。
  • 查看:在 ls -l 命令的输出中,文件权限的第 5 位(原本是组权限位)如果显示为 s(对于可执行文件或目录)或者 S(对于不可执行文件),则表示设置了 sgid。例如,drwxrwsr - x 表示目录设置了 sgid,其中 s 出现在组权限位。

应用场景和注意事项

  • 主要应用场景是共享目录。例如,在一个开发团队中,有一个共享的代码目录,通过设置 sgid,团队成员在这个目录下创建的文件都会属于团队组,这样组内的其他成员可以更容易地进行代码协作。
  • 对于 sgid 在文件上的应用,由于使用场景较少,而且同样存在潜在的安全风险,需要谨慎使用。如果一个具有 sgid 权限的文件被恶意利用,可能会导致组权限的滥用。

sbits(Sticky Bit)

概念

  • 主要用于目录。当一个目录设置了 sticky bit 位后,只有文件的所有者或者超级用户才有权限删除或重命名该目录下的文件。这可以防止用户删除其他用户在共享目录中的文件。例如,在 /tmp 目录下,许多用户都会存储临时文件,设置了 sticky bit 后,用户不能随意删除其他用户的文件,只能删除自己创建的文件。

设置和查看方法

  • 设置:使用 chmod 命令,格式为 chmod o+t 目录名。例如,要给一个名为 common_dir 的目录设置 sticky bit,可以执行 chmod o+t common_dir。
  • 查看:在 ls -l 命令的输出中,文件权限的最后一位(其他用户权限位)如果显示为 t,则表示设置了 sticky bit。例如,drwxrwxr - t 表示目录设置了 sticky bit。

应用场景和注意事项

  • 典型应用场景就是类似 /tmp 这样的共享目录。它有效地保护了用户在共享目录下的文件不被其他用户随意删除。
  • 但对于非共享目录,一般不需要设置 sticky bit。在设置时,要确保目录的权限设置合理,因为如果目录权限过于宽松,即使设置了 sticky bit,可能还会存在其他安全风险,例如其他用户可能对文件有写权限等情况。

权限和归属

mermaid
graph TD
    A[ls -l install.log] --> B["-rw-r--r--"]
    A --> C["1"]
    A --> D["root"]
    A --> E["root"]
    A --> F["34298"]
    A --> G["04-02"]
    A --> H["00:23"]
    A --> I["install.log"]

    subgraph 注释
        B -->|文件类型、权限| J["-rw-r--r--"]
        J -->|文件类型| K["-:普通文件"]
        J -->|属主权限| L["r-w-:读写权限"]
        J -->|属组权限| M["r--:只读权限"]
        J -->|其他用户权限| N["r--:只读权限"]

        C -->|硬链接计数| O["1:硬链接数量"]

        D -->|属主| P["root:文件所有者"]

        E -->|属组| Q["root:文件所属组"]

        F -->|文件大小| R["34298:文件大小(字节)"]

        G -->|最后修改日期| S["04-02:4月2日"]

        H -->|最后修改时间| T["00:23:0点23分"]

        I -->|文件名| U["install.log:文件名称"]
    end

第一列 文件类型、权限

第1位表示文件类型

  • -:表示普通文件
  • d:表示目录
  • l:表示软链接
  • p:表示 PIPE 管道文件
  • s:表示 socket 通信套接字文件
  • c:表示字符设备文件
  • b:表示块设备文件

第2、3、4位归属主

rw- 表示文件归属主权限。

  • r:可读,数字4表示,
  • w:可写,数字2表示
  • x:可执行,数字1表示
  • -:无权限

第5、6、7位归属组

r--表示的文件归属附属组的权限。

  • r:可读,数字4表示,
  • w:可写,数字2表示
  • x:可执行,数字1表示
  • -:无权限

第二列

1:硬链接计数,表示该文件有多少个硬链接指向它。

第三列归属主

root表示归属主。

第四列归属组

root表示归属的附属组。

第五列

1表示的文件大小,以字节为单位。

第六列

04-02文件的最后修改日期。

第七列

00:23文件的最后修改时间

第八列

install.log:文件名。

权限掩码 umask

umask(user file-creation mask)是Linux系统中用于控制新建文件/目录默认权限的掩码值。它通过屏蔽(取消)特定权限位来设置安全基线。

语法格式

bash
umask [-p] [-S] [mode]
  • 无参数:显示当前umask值
  • -S:符号模式显示(rwx形式)
  • -p:可重用输出格式
  • mode:设置新umask值(八进制或符号格式)

权限计算原理

  • 文件默认权限:666 - umask

  • 目录默认权限:777 - umask

  • 实际权限 = 默认权限 & (~umask)

    选项说明
    0022典型安全设置(文件644,目录755)
    0002组可写(文件664,目录775)
    0077严格模式(文件600,目录700)

注意事项

  1. umask是进程属性,只在当前shell会话有效

  2. 系统服务可能有自己的umask设置(如/etc/init.d/脚本)

  3. 新建文件的执行权限需单独赋予(chmod +x)

  4. 安全模式修改,在文件/etc/profile末尾追加如下

    bash
    # 判断当uid大于199并且uid=gid时umask设置027,创建目录权限就变成750,文件权限为640
    # umask 安全
    if [ $UID -gt 199 ] && [ "`/usr/bin/id -gn`" = "`/usr/bin/id -un`" ]; then
            umask 027
        else
            umask 022
    fi
    
    # 使配置文件生效 
    source ~/.bashrc

权限对照表

umask文件权限目录权限
022644755
027640750
077600700

NOTE

使用umask -p输出的命令可直接在脚本中重用

案例

bash
# 查看当前umask(八进制)
umask
# 输出示例:0022

# 查看符号表示
umask -S
# 输出:u=rwx,g=rx,o=rx

# 临时修改umask
umask 027  # 文件默认640,目录默认750

# 永久生效(添加到~/.bashrc或/etc/profile)
echo "umask 022" >> ~/.bashrc
# 使配置文件生效 
source ~/.bashrc

权限验证流程

当用户访问文件时,系统按以下顺序检查权限:

  1. 是否为所有者 → 检查用户权限(u)
  2. 是否属于文件组 → 检查组权限(g)
  3. 其他情况 → 检查其他用户权限(o)
  4. ACL规则(如果存在)→ 覆盖传统权限