%%
# 纲要
> 主干纲要、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`:读、写、执行。


**八进制数字模式**与**符号模式**的对应:

### 特殊文件权限
除了常规的 `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