{"msg":"操作成功","code":200,"data":{"createBy":"admin","createTime":"2019-12-12 15:56:44","updateBy":"admin","updateTime":"2025-09-08 11:56:45","remark":null,"id":3,"articleTitle":"Linux基础：权限管理","articleUrl":"linux_permission","articleThumbnail":"https://www.asumimoe.com/imgfiles/20220908/ee03af4419724d50a127c34d6a588554.png","articleFlag":"0","draftStatus":"1","reprintStatement":"1","articleSummary":"Linux 的权限管理是一个核心且强大的安全特性。它决定了谁（用户）可以对什么（文件或目录）进行何种操作（读、写、执行）。","articleContent":"Linux 的权限管理是一个核心且强大的安全特性。它决定了**谁**（用户）可以对**什么**（文件或目录）进行**何种操作**（读、写、执行）。\n\n### 1.三类人\n\nLinux 系统通过三种身份来管控权限：\n\n- **所有者 (Owner/u)**: 创建文件或目录的用户。\n\n- **所属组 (Group/g)**: 文件或目录所属的用户组，组内的所有用户共享组权限。\n\n- **其他人 (Others/o)**: 既不是所有者，也不在所属组里的其他所有用户。\n\n### 2.三类权限\n\n对于文件和目录，这三种权限的含义有根本区别：\n\n| 权限         | 对文件的含义                       | 对目录的含义                                        |\n| :----------- | :--------------------------------- | :-------------------------------------------------- |\n| **读 (r)**   | 可以**查看、读取**文件内容         | 可以**列出**目录下的文件和子目录名称（如使用 `ls`） |\n| **写 (w)**   | 可以**修改、截断**文件内容         | 可以在目录内**创建、删除、重命名**文件和子目录      |\n| **执行 (x)** | 可以将文件作为**程序或脚本**来执行 | 可以**进入 (cd)** 该目录，并访问目录中的元数据      |\n\n**关键点**：要对一个文件进行任何操作，你不仅需要文件本身的相应权限，还需要对文件路径上的所有目录拥有 **执行 (x)** 权限。\n\n### 3. 查看权限：`ls -l`\n\n使用 `ls -l` 命令可以查看详细的权限信息。\n\n```bash\n$ ls -l\ntotal 16\n-rwxr-xr-- 1 alice developers 2048 Oct 10 14:30 my_script.sh\ndrwxr-xr-x 2 bob sales      4096 Oct 10 14:31 reports/\nlrwxrwxrwx 1 root root        20 Oct 10 14:32 link -> /usr/share/zoneinfo/\n```\n\n- **第一列**：权限字符串（如 `-rwxr-xr--`）。\n- **第三列**：文件的所有者（如 `alice`）。\n- **第四列**：文件的所属组（如 `developers`）。\n\n**权限字符串分解（10个字符）：**\n\n```bash\n- r w x r - x r - -\n│ │ │ │ │ │ │ │ │ │\n│ │ │ │ │ │ │ │ │ └── 其他人 Others (o) 的权限 = 无权限 (-)\n│ │ │ │ │ │ │ │ └── 其他人 Others (o) 的权限 = 读 (r)\n│ │ │ │ │ │ │ └── 其他人 Others (o) 的权限 = 无权限 (-)\n│ │ │ │ │ │ └── 所属组 Group (g) 的权限 = 执行 (x)\n│ │ │ │ │ └── 所属组 Group (g) 的权限 = 无权限 (-)\n│ │ │ │ └── 所属组 Group (g) 的权限 = 读 (r)\n│ │ │ └── 所有者 Owner (u) 的权限 = 执行 (x)\n│ │ └── 所有者 Owner (u) 的权限 = 写 (w)\n│ └── 所有者 Owner (u) 的权限 = 读 (r)\n└── 文件类型 (- = 普通文件, d = 目录, l = 软链接, ...)\n```\n\n- **`my_script.sh`**：所有者（alice）可读、写、执行；组（developers）可读、执行；其他人只能读。\n- **`reports/`**：所有者（bob）对目录有全部权限；组（sales）和其他人可以进入和列出该目录，但不能在里面创建或删除文件。\n- **`link`**：软链接的权限通常是 `lrwxrwxrwx`，但实际权限由它指向的目标文件决定。\n\n---\n\n### 4. 修改权限：`chmod` 命令\n\n`chmod` (Change Mode) 用于修改文件或目录的权限。有两种设置方法：\n\n#### 方法一：符号模式（直观）\n\n使用 `u/g/o/a` 和 `+/-/=` 以及 `r/w/x` 来操作。\n\n**语法：** `chmod [who][operator][permissions] filename`\n\n* **示例 1**：给所有人添加执行权限\n\n  ```bash\n  chmod a+x my_script.sh\n  ```\n\n* **示例 2**：移除组和其他人的写权限\n\n  ```bash\n  chmod go-w my_script.sh\n  ```\n\n* **示例 3**：设置精确权限（所有者rwx，组rx，其他人无权限）\n\n  ```bash\n  chmod u=rwx,g=rx,o= my_script.sh\n  # 或者等价于\n  chmod u=rwx,g=rx,o=0 my_script.sh\n  ```\n\n#### 方法二：数字模式（高效）\n\n使用一个 3 位或 4 位的八进制数来表示权限。每位数字是 `r(4) + w(2) + x(1)` 的和。\n\n| 权限  | 数字          |\n| :---- | :------------ |\n| `rwx` | 4+2+1 = **7** |\n| `rw-` | 4+2+0 = **6** |\n| `r-x` | 4+0+1 = **5** |\n| `r--` | 4+0+0 = **4** |\n| `-wx` | 0+2+1 = **3** |\n| `-w-` | 0+2+0 = **2** |\n| `--x` | 0+0+1 = **1** |\n| `---` | 0+0+0 = **0** |\n\n**语法：** `chmod [abc] filename` (a=所有者, b=组, c=其他人)\n\n* **示例 1**：设置权限为 `rwxr-xr--` (所有者=7, 组=5, 其他人=4)\n\n  ```bash\n  chmod 754 my_script.sh\n  ```\n\n* **示例 2**：设置权限为 `rw-r--r--` (非常常见的普通文件权限)\n\n  ```bash\n  chmod 644 document.txt\n  ```\n\n* **示例 3**：设置目录权限为 `rwxr-xr-x` (常见目录权限)\n\n  ```bash\n  chmod 755 my_folder/\n  ```\n\n---\n\n### 5. 修改所有者和所属组\n\n* **`chown` (Change Owner)**: 改变文件的所有者和/或组。\n\n  ```bash\n  # 改变所有者\n  sudo chown bob myfile.txt\n  \n  # 同时改变所有者和组\n  sudo chown alice:developers myfile.txt\n  \n  # 只改变组（与 chgrp 命令效果相同）\n  sudo chown :developers myfile.txt\n  # 或者使用 chgrp\n  sudo chgrp developers myfile.txt\n  ```\n\n  *注意：通常需要 `sudo` 权限来改变文件的所有者。*\n\n* **`chgrp` (Change Group)**: 专门用于改变文件的所属组。\n\n  ```bash\n  sudo chgrp sales report.doc\n  ```\n\n---\n\n###  6. 特殊权限：SUID, SGID, Sticky Bit\n\n除了基本的 rwx，还有三个特殊权限位，它们有非常重要的安全含义。\n\n| 权限                    | 数字表示        | 符号表示 | 对文件的作用                                                 | 对目录的作用                                                 |\n| :---------------------- | :-------------- | :------- | :----------------------------------------------------------- | :----------------------------------------------------------- |\n| **SUID** (Set User ID)  | 4 (e.g. `4755`) | `u+s`    | 执行者在该文件运行时**拥有所有者的权限** (常用于 `/usr/bin/passwd`) | (无意义)                                                     |\n| **SGID** (Set Group ID) | 2 (e.g. `2755`) | `g+s`    | 执行者在该文件运行时**拥有所属组的权限**                     | 在该目录下**新建的文件/目录**，其**所属组会自动继承**此目录的所属组 |\n| **Sticky Bit** (粘滞位) | 1 (e.g. `1755`) | `o+t`    | (现代Linux已废弃此用法)                                      | 目录内的文件**只有其所有者、目录所有者或root才能删除/重命名** (常用于 `/tmp`) |\n\n**设置方法：**\n\n* **数字法**：在三位数字前再加一位（4/2/1）。\n\n  ```bash\n  chmod 4755 my_suid_script    # 设置 SUID\n  chmod 2755 my_folder/        # 设置 SGID（对目录）\n  chmod 1777 /tmp              # 为 /tmp 设置粘滞位（经典例子）\n  ```\n\n* **符号法**：\n\n  ```bash\n  chmod u+s my_suid_script\n  chmod g+s my_folder/\n  chmod o+t shared_folder/\n  ```\n\n---\n\n### 7. 访问控制列表 (ACL)：更精细的权限控制\n\n基本权限系统（u/g/o）有时不够用。ACL (Access Control List) 允许你为**特定的用户**或**特定的组**设置权限，而不仅仅是“所属组”和“其他人”。\n\n* **查看 ACL**: `getfacl filename`\n\n* **设置 ACL**: `setfacl`\n\n  *   `-m` 修改 ACL\n  *   `-x` 删除 ACL 条目\n\n  ```bash\n  # 允许用户 dave 对文件有读写权限，即使他不是所有者或所属组成员\n  setfacl -m u:dave:rw report.docx\n  \n  # 允许组 contractors 对目录有读和执行权限\n  setfacl -m g:contractors:rx /projects/\n  \n  # 删除一条特定的 ACL 规则\n  setfacl -x u:dave report.docx\n  ```\n\n要使用 ACL，文件系统必须在挂载时启用了 `acl` 选项（现代发行版通常默认开启）。\n\n### 8.sudo：允许用户以其他用户权限执行\n\n`sudo` 权限的设置是 Linux 系统管理中至关重要的一环。它允许普通用户以超级用户（root）或其他用户的身份安全地执行命令，而无需共享 root 密码，同时提供了详细的审计日志。\n\n核心的 `sudo` 配置是通过编辑 **`/etc/sudoers`** 文件来实现的。\n\n**黄金法则：永远使用 `visudo` 命令**\n\n**绝对不要** 直接用普通文本编辑器（如 `vim` 或 `nano`）直接编辑 `/etc/sudoers` 文件。\n\n**必须使用**：`sudo visudo`\n\n**原因**：\n\n*   `visudo` 会**锁定** `sudoers` 文件，防止多人同时编辑。\n*   `visudo` 会在你保存退出时**检查语法**。如果语法错误，它会阻止你保存，从而避免一个错误的配置导致所有 `sudo` 权限失效（那将是一场灾难，因为你可能无法再用 `sudo` 来修复它）。\n\n---\n\n#### `/etc/sudoers` 语法与结构\n\n`sudoers` 文件的基本语法规则是：\n\n```bash\nUSER/GROUP HOST=(RUNAS_USER:RUNAS_GROUP) COMMAND\n```\n\n1）**USER/GROUP**： 规定**谁**可以获得权限。\n\n*   `username`： 单个用户，如 `alice`。\n*   `%groupname`： 一个用户组，如 `%developers`（注意 `%` 符号）。\n*   `%sudo` 或 `%wheel`： 在很多系统中，默认有一个管理组，组成员默认可以获得 `sudo` 权限。\n*   `ALL`： 代表所有用户。\n\n2）**HOST**： 规定在**哪台机器**上生效。对于单机，几乎总是 `ALL`。\n\n3）**RUNAS_USER:RUNAS_GROUP**： 规定用户可以**作为谁**来运行命令。\n\n*   `(ALL:ALL)`： 可以以任何用户和任何组的身份运行命令（相当于 root）。\n*   `(root)`： 可以以 root 用户身份运行（最常见）。\n*   `(www-data)`： 可以以 `www-data` 用户身份运行。\n*   `(ALL)` 或 `(:)`： 省略部分时，默认代表所有。\n\n4）**COMMAND**： 规定用户可以运行**哪些命令**。\n\n*   必须使用**绝对路径**（例如 `/usr/bin/apt`，而不是 `apt`）。这是为了防止通过设置 `PATH` 环境变量来进行欺骗攻击。\n*   可以使用通配符 `*`，但要谨慎。\n*   目录结尾加 `/` 表示该目录下的所有命令。\n*   `ALL`： 代表所有命令。\n\n5）**标签 (Tag_Spec)**： 可选，放在命令之前，用于修改行为。\n\n*   `NOPASSWD:`： **最重要和最常用的标签**。执行该命令时**不需要输入密码**。常用于自动化脚本。\n*   `PASSWD:`： 默认行为，需要输入密码。\n*   `SETENV:`： 允许用户设置环境变量。\n*   `NOEXEC:`： 禁止在该命令中执行子命令（防止某些程序的 `shell escape` 功能）。\n\n---\n\n#### 常用配置示例\n\n假设我们有以下需求，来看看如何编写配置：\n\n1）**将用户 `alice` 加入 `sudo` 组（最简单通用的方法）**\n\n*   在许多发行版（如 Ubuntu/Debian）中，默认有一个管理组（通常是 `sudo` 或 `wheel`）。\n*   只需将用户加入这个组即可获得完整的 `sudo` 权限。\n\n```bash\nsudo usermod -aG sudo alice  # 在Ubuntu/Debian上\n# 或者\nsudo usermod -aG wheel alice # 在RHEL/CentOS/Fedora上\n```\n\n这对应的 `sudoers` 配置通常是：\n\n```bash\n# Allows people in group wheel to run all commands\n%wheel  ALL=(ALL:ALL) ALL\n# 或者\n%sudo   ALL=(ALL:ALL) ALL\n```\n\n2）**允许用户 `bob` 运行所有命令，但需要密码**\n\n```bash\nbob  ALL=(ALL:ALL) ALL\n```\n\n3）**允许用户 `jenkins` 无需密码重启 `nginx` 服务（用于自动化）**\n\n```bash\njenkins ALL=(root) NOPASSWD: /usr/sbin/systemctl restart nginx\n```\n\n4）**允许用户 `deployer` 以 `www-data` 用户的身份运行任何命令**\n\n```bash\ndeployer ALL=(www-data) ALL\n```\n\n使用方式：`sudo -u www-data <command>`\n\n5）**允许用户 `backup` 运行一个特定脚本（带参数），无需密码**\n\n```bash\nbackup ALL=(root) NOPASSWD: /opt/scripts/backup.sh --full\n# 如果希望允许所有参数，可以使用通配符\n# backup ALL=(root) NOPASSWD: /opt/scripts/backup.sh *\n```\n\n","categoryId":1,"viewCount":884,"categoryName":"Linux","author":"球接子","authorAvatar":null,"tagIds":[10],"tagNames":["Linux基础"]}}