Files
MyBlog/src/programming/linux/基础/01-权限.md
T
2026-05-11 17:37:25 +08:00

321 lines
9.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
# 页面基础信息
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 的协同,
结合共享目录实战案例,帮助你系统掌握多用户环境下的安全与协作配置。
<!-- more -->
# 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 权限体系的可靠指南!