--- # 页面基础信息 title: Linux 权限 icon: simple-icons:linux date: 2024-11-14 category: - Linux 基础 - 系统运维 tag: - Linux - 权限管理 - 用户与用户组 - 文件系统 - 运维实践 # 主题相关增强 star: false # 在文章列表中高亮显示 article: true # 标记为文章(而非文档/幻灯片等) timeline: true # 在时间线中显示 # SEO & 列表摘要 description: >- 深度解析 Linux 权限体系,从用户、用户组到 SGID 与 umask 的协同, 结合共享目录实战案例,帮助你系统掌握多用户环境下的安全与协作配置。 --- 深度解析 Linux 权限体系,从用户、用户组到 SGID 与 umask 的协同, 结合共享目录实战案例,帮助你系统掌握多用户环境下的安全与协作配置。 # Linux 权限体系深度解析:从用户组到共享目录的完整实践 > 这是一份关于 Linux 用户与权限体系的深度整理,涵盖基础概念、核心机制与实战配置,帮助你彻底理解并灵活运用 Linux 权限管理。 --- ## 一、Linux 权限体系基础 Linux 的权限体系是系统安全和多用户协作的基石。它通过**用户**、**用户组**和**权限位**三个核心要素,精确控制谁能对文件做什么操作。 ### 1.1 用户类型 ```bash # 超级用户(root) - 拥有系统的全部权限,命令提示符为 # - 可修改任何文件、安装软件、管理用户 # 普通用户 - 只能操作自己有权限的文件和目录,命令提示符为 $ # 切换方式 su 用户名 # 切换用户 sudo 命令 # 临时提升权限执行操作 ``` ### 1.2 文件权限结构 每个文件或目录都有三类访问者和三种基本权限: **三类访问者** - **Owner(拥有者)**:文件的创建者或指定用户 - **Group(所属组)**:同组用户共享一定权限 - **Others(其他人)**:系统中所有其他用户 **三种基本权限** - **r**(read):读权限,可查看文件内容或列出目录 - **w**(write):写权限,可修改文件或在目录中添加/删除文件 - **x**(execute):执行权限,可运行文件或进入目录 **权限表示示例** ```bash -rw-r--r-- ``` - 文件类型:`-` 表示普通文件 - 拥有者:`rw-` → 可读可写 - 所属组:`r--` → 只读 - 其他人:`r--` → 只读 ### 1.3 权限管理命令 ```bash chmod 755 file # 拥有者可读写执行,组和其他人可读执行 chown 用户:组 file # 修改文件拥有者和所属组 chgrp 组 file # 修改文件所属组 umask 002 # 设置默认权限掩码 ``` --- ## 二、深入理解用户组(Group) 用户组是 Linux 权限体系的精髓所在,它能极大简化多用户协作场景下的权限管理。 ### 2.1 组的两种类型 **主组(Primary Group)** - 每个用户必须属于一个主组 - 用户创建文件时,文件的所属组默认就是该用户的主组 **附加组(Secondary Group)** - 用户可以属于多个附加组 - 附加组赋予用户额外的权限,比如访问某些共享目录 ### 2.2 权限与组的关系 Linux 判断文件访问权限的顺序是:**Owner → Group → Others** ```bash -rw-r----- 1 alice dev 1234 Nov 14 report.txt ``` - **alice**(拥有者)→ `rw-` 可读写 - **dev组成员** → `r--` 只读 - **其他人** → `---` 无权限 **关键结论**:拥有者、组、其他人的权限是**独立设置**的,完全可能出现"拥有者有权限,但组没有权限"的情况,这在保护敏感文件时非常有用。 ### 2.3 组管理常用命令 ```bash groups 用户名 # 查看用户所属组 id 用户名 # 查看用户详细信息 groupadd 组名 # 创建组 groupdel 组名 # 删除组 usermod -aG 组名 用户名 # 把用户加入附加组(-a表示追加,-G指定附加组) ``` --- ## 三、常用权限模式对比表 | 权限模式 | Owner | Group | Others | 典型场景 | |----------|-------|-------|--------|-----------| | `600` | 读写 | 无 | 无 | 私钥文件(如 `~/.ssh/id_rsa`) | | `644` | 读写 | 只读 | 只读 | 配置文件(如 `/etc/hosts`) | | `660` | 读写 | 读写 | 无 | 项目组共享文件 | | `700` | 读写执行 | 无 | 无 | 个人脚本或私有目录 | | `755` | 读写执行 | 读执行 | 读执行 | 公共程序或脚本 | | `775` | 读写执行 | 读写执行 | 读执行 | 团队共享目录 | | `777` | 读写执行 | 读写执行 | 读写执行 | 临时目录(如 `/tmp`) | --- ## 四、共享目录实战配置 假设公司智能巡视程序位于 `/home/sunri/PRS7950`,需要让 `user1`、`user2`、`user3` 三人都能操作该目录。 ### 4.1 核心配置步骤 ```bash # 1. 创建专用组(推荐,而非使用 docker 组) sudo groupadd prsgroup # 2. 把用户加入组 sudo usermod -aG prsgroup user1 sudo usermod -aG prsgroup user2 sudo usermod -aG prsgroup user3 # 3. 修改目录所属组 sudo chgrp -R prsgroup /home/sunri/PRS7950 # 4. 设置 SGID 位和权限 sudo chmod 2770 /home/sunri/PRS7950 ``` **关键说明**:这里的 `2` 就是 **SGID 位**,它确保在该目录下创建的文件自动继承 `prsgroup` 组。 ### 4.2 调整 umask(可选) 在用户的 `~/.bashrc` 或 `~/.profile` 中添加: ```bash umask 0002 ``` 这样新建文件权限为 `664`(组成员可读写),目录为 `775`。 ### 4.3 验证配置 ```bash # 切换到 user2 测试 su - user2 cd /home/sunri/PRS7950 touch test.txt ls -l test.txt # 所属组应为 prsgroup ``` --- ## 五、SGID 位与 umask 深度解析 ### 5.1 SGID 位(Set Group ID) **作用**:主要用于目录,确保目录下新建文件自动继承目录的所属组。 ```bash # 设置 SGID 位 chmod g+s /shared_dir # 符号模式 chmod 2770 /shared_dir # 八进制模式(推荐) ``` **典型场景**:团队共享目录,保证所有成员创建的文件都属于同一组。 ### 5.2 umask(用户文件创建掩码) **定义**:决定新建文件/目录的默认权限。 **计算方式**:实际权限 = 默认权限 - umask - 文件默认:`666`(rw-rw-rw-) - 目录默认:`777`(rwxrwxrwx) ```bash # 示例:umask=022 666 - 022 = 644 (rw-r--r--) # 文件 777 - 022 = 755 (rwxr-xr-x) # 目录 # 示例:umask=002(适合团队协作) 666 - 002 = 664 (rw-rw-r--) # 文件(组成员可写) 777 - 002 = 775 (rwxrwxr-x) # 目录(组成员可写) ``` ### 5.3 两者配合的最佳实践 在共享目录场景下,**SGID + umask 002** 是黄金组合: - **SGID** 确保文件所属组统一 - **umask 002** 确保组成员有写权限 --- ## 六、特殊场景:Docker 组权限详解 ### 6.1 Docker 组的本质 ```bash # 安装 Docker 时会自动创建 docker 组 # 关键:/var/run/docker.sock 套接字的组权限 ls -l /var/run/docker.sock # 输出示例:srw-rw---- 1 root docker 0 Nov 14 10:20 /var/run/docker.sock ``` Docker 组通过**套接字的组权限**让用户能与 Docker 守护进程通信,**并非**通过 SGID 或 umask 实现。 ### 6.2 安全警示 **加入 docker 组 ≈ 获得 root 权限** - 组成员可以启动特权容器,挂载宿主机根目录 - 可以修改系统文件,完全控制系统 - **生产环境应谨慎使用**,建议通过 `sudoers` 限制特定命令 ```bash # 更安全的做法:限制只能执行特定 Docker 命令 username ALL=(ALL) /usr/bin/docker ps, /usr/bin/docker exec ``` ### 6.3 常见误区澄清 **误区**:docker 组成员创建的文件会自动属于 docker 组 **事实**: - docker 组**不会**自动设置 SGID 位 - 用户在非 SGID 目录创建文件时,文件属于主组,不是 docker 组 - 要实现共享,仍需手动配置 SGID + umask --- ## 七、安全建议与最佳实践 ### 7.1 最小权限原则 - 不要直接加入 **root 组**,使用 **sudo 机制**临时提权 - Docker 组权限极大,仅在开发环境或可信场景使用 - 为不同项目创建独立组(如 `prsgroup`),而非混用 docker 组 ### 7.2 权限配置检查清单 配置共享目录时,请确认: - [ ] 是否创建了专用组? - [ ] 所有用户是否已加入该组? - [ ] 目录是否设置了 SGID 位?(`chmod 2770`) - [ ] 用户 umask 是否设为 0002? - [ ] 目录权限是否为 770 或 775? ### 7.3 审计与监控 ```bash # 查看 sudo 操作日志 sudo grep sudo /var/log/auth.log # 查看文件访问记录 auditctl -w /home/sunri/PRS7950 -p wa -k prs7950_access ``` --- ## 八、总结 Linux 权限体系的精髓在于 **用户 + 用户组 + 权限位** 的组合: 1. **用户分类**:root 拥有全部权限,普通用户受权限约束 2. **用户组**:是用户的集合,简化批量权限管理 3. **权限独立性**:Owner、Group、Others 的权限完全独立 4. **SGID + umask**:多用户协作的黄金组合,确保文件自动继承组且组成员可读写 5. **Docker 组**:本质是套接字访问权限,不是文件共享机制,需谨慎使用 掌握这些概念后,你不仅能理解 Linux 权限的"为什么",更能灵活应对各种多用户协作场景,实现既安全又高效的权限管理。 --- **参考命令速查** ```bash # 创建共享目录完整流程 sudo groupadd projectgroup sudo usermod -aG projectgroup user1 user2 user3 mkdir /shared/project sudo chgrp -R projectgroup /shared/project sudo chmod 2770 /shared/project echo "umask 0002" >> ~/.bashrc ``` 希望这份整理能成为你理解和运用 Linux 权限体系的可靠指南!