%% # 纲要 > 主干纲要、Hint/线索/路标 # Q&A #### 已明确 #### 待明确 > 当下仍存有的疑惑 **❓<font color="#c0504d"> 有什么问题?</font>** # Buffer ## 闪念 > sudden idea ## 候选资料 > Read it later %% # Linux 权限管理 - 用户 - 组 - 文件权限 # 用户和组相关文件 ![[_attachment/02-开发笔记/11-Linux/Linux 权限管理.assets/IMG-Linux 权限管理-F7198B9C063139E6D63E1C8C39928965.png|593]] - `/etc/passwd` 文件 - `/etc/shadow` 文件 - `/etc/group` 文件 <br><br> # 用户 User **用户账户**:每个能访问 Linux 系统的用户都会被分配一个唯一的**用户账户**。 - 用户账户的**唯一标识**:**用户名**(uname)和 **用户 ID**(UID)。 - 用户账户**配置信息**保存于 `/etc/passwd` 文件。 - 用户账号**登录密码**保存于 `/etc/shadow` 文件。 - **用户权限**通过 UID 进行跟踪。 > [!NOTE] root 超级用户的 **UID 固定为 0** **系统账户**:Linux 系统会为各种各样的功能创建不同的用户账户,这些账户并非真正的人类用户,称其为系统账户,它们是**系统中运行的各种服务进程访问资源使用的特殊账户**。**所有运行在后台的服务都需要通过一个系统用户账户登录到 Linux 系统**中。 #### `/etc/passwd` 文件 `/etc/passwd` 文件中的 7 个字段含意: `登录名:用户密码(x):UID:登录组的GID:用户备注:用户家目录:用户的默认shell` > [!NOTE] > 绝大多数 Linux 系统将**用户密码**保存在单独的文件 `/etc/shadow `中(称为 shadow 文件),只有 root 用户以及特定的程序(比如登录程序)才能访问该文件。 > <br><br> # 组 Group Linux 中的 "**组**"(**Group**)允许**同一组中的多个用户对系统资源(文件、目录或设备等)==共享权限==**。 - 组的唯一标识符:**组名**(gname) 以及 **GID**(Group ID); - **组信息**保存在`/etc/group` 文件中。 # 用户所属的组 Linux 中每个用户都必须属于一个组,不能独立于组外。 用户所属的组可以分为两类:**主要组(登录组)** 和 **附加组**。 ## 主要组(登录组) 当用户创建一个文件或目录时,**默认的所有权会设置为该用户的登录组**。 - 每个用户都有一个登录组,**通常一个用户的登录组名和用户名相同**,也在创建用户账户时可以设置为指定的组。 - 用户的**登录组 ID**存储在`/etc/passwd`文件中。 注:当一个用户在`/etc/passwd` 中指定某个组作为其 **登录组** 时,该用户不会再作为该组成员出现在 `/etc/group` 文件中。 ## 附加组 **附加组允许用户访问其他组拥有的文件和目录** (前提是这些文件和目录的权限设置允许组成员访问) - 用户可以属于一个或多个附加组. - 用户的**附加组信息**存储在`/etc/group`文件中。 通常,系统资源和服务(如打印服务、网络管理等)会通过将用户添加到特定的系统组来授予权限。 ### `/etc/group` 文件 `/etc/passwd` 文件中的 4 个字段含意: `组名:组密码:GID:属于该组的用户列表`。 注:该文件中有存在一些组 "看上去" 没有任何用户,但实际上**并不一定代表这些组没有成员**。当一个用户在`/etc/passwd` 中指定某个组作为其 **登录组** 时,该用户不会再作为该组成员出现在 `/etc/group` 文件中 <br><br><br> # 文件权限 ### 文件权限种类 Linux 中的文件权限有三种:**读**、**写**、**执行权限**。 (**互相独立**) ![[_attachment/02-开发笔记/11-Linux/Linux 权限管理.assets/IMG-Linux 权限管理-872A2AA7AD5B422029E12DDB69DE46A2.png|502]] > [!NOTE] 文件权限对于==目录==的含义[^1](P80) > > - `r` 权限:允许**读取**目录中的 "**==文件或子目录名==**"(可执行 `ls` 命令,**==列出其中文件名、子目录名==**) > - `w` 权限:允许**修改目录**(可在该目录下**创建、删除、重命名文件或子目录**,同时需要 `x` 权限) > - `x` 权限:允许**搜索/进入目录**,例如: > - 通过 `cd` 进入目录需要具有该目录的 `x` 权限; > - 通过 "**文件路径**" 打开任一文件时,对该 "**文件路径**" 上包含的**每一个目录(包括可能隐含的当前工作目标),都必须具有 `x` 权限**。 > > ![[_attachment/02-开发笔记/11-Linux/Linux 权限管理.assets/IMG-Linux 权限管理-5E6838266CAF4012C00F615E264736E0.png|597]] > > ![[_attachment/02-开发笔记/11-Linux/Linux 权限管理.assets/IMG-Linux 权限管理-629AC6A41BF7A81CEE27D8EBE1B54317.png|477]] > > ### 每个文件的权限构成 每个文件的权限包括**三部分**: - 针对**所属用户**的权限 - 针对**所属组**的权限 - 针对**其他用户**的权限 每一部分的权限分别**由上述三种文件权限(读、写、执行)明确**。因此,一共**有 9 个权限位**。 #### 文件权限的表示 三种表示方式:**八进制模式**、**位模式**、**符号模式**: ![[_attachment/02-开发笔记/11-Linux/Linux 权限管理.assets/IMG-Linux 权限管理-A6B28E0A87846A12180BF99C10F0BE6D.png|564]] - 在 `ls -l` 命令中显示的是**位模式**。 - 通过 `chmod` 修改文件权限时,可使用 "**八进制模式**" 或 "**符号模式**" 进行指定 <br><br><br> # Linux 文件权限 在 Unix 和类 Unix 系统中: - 每个文件都有一个关联的 **"文件所有者"** 和 "**组**"(也称用户组或文件组)。 - 文件权限对应分为三级,可为每一级设置不同权限,从而实现**权限管理**: - 文件所有者(Owner) - 用户组(Group) - 其它用户(Others) 创建新文件时: - **文件所有者**及**所属组**通常默认为**当前用户**以及**该用户的主要组** - 文件的**默认权限**则由 **"全权限值**" 与 "**umask 掩码"** 相减得到 > [!NOTE] **umask 权限掩码** > > - umask 是 4 位八进制的**掩码值**,第 1 位为特别安全特性,后 3 位为用户/组/Other 八进制权限值的掩码。 > - umask 值通常会被设置在 `/etc/profile ` 启动文件中 > - umask 掩码值可通过命令`$ umask xxx` 修改。 > > **全权限值**(full permission): > > - 对常规文件而言,全权限制是`666`( `rw-rw-rw-` 权限) > - 对目录而言,全权限值是`777`(` rwxrwxrwx` 权限) > <br><br> ## 基本文件权限 ### 常规文件权限 - `rwx`:读、写、执行。 ![image-20231103222208956|661](_attachment/02-开发笔记/11-Linux/Linux%20权限管理.assets/IMG-Linux%20权限管理-51CC530E2DC6002E370716B698C4506C.png) ![image-20231103214631059|714](_attachment/02-开发笔记/11-Linux/Linux%20权限管理.assets/IMG-Linux%20权限管理-F6D06DEEE09FC369669D9E674252B4C6.png) **八进制数字模式**与**符号模式**的对应: ![image-20231103222323503|549](_attachment/02-开发笔记/11-Linux/Linux%20权限管理.assets/IMG-Linux%20权限管理-125A7363992EAD1AB391A26A39469884.png) ### 特殊文件权限 除了常规的 `rwx` 权限以外,还有以下**特殊文件权限**,可以被设置在**可执行文件或目录**上,以影响这些文件或目录的使用方式。 - SUID 权限 - SGID 权限 - 粘滞位 #### 1. SUID(Set User ID) 当一个**可执行文件**的 `SUID` 位被设置时,任何用户执行该文件时都会**以文件所有者的权限**来运行。 `chmod u+s file` > 例如,`passwd` 命令就设置了 SUID 位,因为它需要以 root 权限运行来修改系统上的密码信息,当前用户使用该命令修改自己密码时就以 root 权限运行。 #### 2. SGID(Set Group ID) 可设置在**可执行文件**或**目录**上。 `chmod g+s <file|dir>` - 对可执行文件而言:任何用户**执行**该文件时,都以**文件组**的权限运行; > 例如,对一个`.sh` 脚本文件设置 SGID 位,则任何用户执行该脚本时,**脚本都能以该文件所属组的权限来执行**,**具有该所属组的权限**,即可以访问/修改该组能够访问/修改的任何资源,而无论执行脚本的用户是否属于该组。 - 对目录而言,该目录中创建的**新文件**都将以**目录的文件组作为默认组**。 (而不是当前用户的主要组) > 例如,创建一个用户间共享目录并设置 SGID 位,使得该目录下的新文件的默认组都继承目录的文件组,实现共享。 示例:创建一个**用户间的共享目录** 要使得目录中**所有新文件都沿用目录的文件组**,即需要设置 SGID 位 ```shell mkdir shared_dir chgrp shared shared_dir chmod g+s shared_dir # 设置目录的SGID位 ``` #### 3. 粘滞位(Sticky Bit) 通常只对目录设置,设置后,只有**文件的所有者**、**目录的所有者**或**root 用户**可以**删除或重命名该目录中的文件**。 `chmod o+t dir` > **粘滞位通常用于公共目录**,例如 `/tmp`,防止某个用户删除或重命名其他用户的文件。 > > 在`ls -l` 输出中,粘滞位用 `t` 表示在"Others"的执行位上,例如`drwxrwxrwt` 中的`t` 表明该目录设置了粘滞位。 %% ## 访问控制列表 > Linux 的基本文件权限只能为单个用户或单个组指定。 > > 要为多个不同用户或不同组分别指定权限,需要通过 ACL 实现。 **访问控制列表**(Access Control List,**ACL**): ACL 允许为 **多个不同用户或组 **分配不同的 `rwx` 权限。 - ACL 是在 Linux 基本文件权限之上的一个**额外权限层**。 - 设置了 ACL 之后,**可在文件权限后看到一个 `+` 符号**,表示该文件有额外的 ACL。 - 并非所有文件系统都支持 ACL。 例如,ext3 和 ext4 支持 ACL,而某些老式的文件系统则不支持。 ACL 有两种类型: - **访问 ACL**(Access ACL): 用于控制对文件和目录的 `rwx` 权限 - **默认 ACL**(Default ACL): 只对目录有效,**为目录中创建的新文件或子目录指定默认的 ACL 权限** ACL 相关命令: - `getfacl` 查看文件的访问控制列表 - `setfacl` 设置文件的访问控制列表 %% <br><br> # 参考资料 # Footnotes [^1]: 《UNIX 环境高级编程》UNP