第一次提交

This commit is contained in:
2025-12-15 23:16:59 +08:00
commit 3e0da32c18
93 changed files with 14105 additions and 0 deletions
+321
View File
@@ -0,0 +1,321 @@
---
# 页面基础信息
title: Linux 权限
icon: simple-icons:linux
date: 2024-11-14
category:
- Linux 基础
- 系统运维
tag:
- Linux
- 权限管理
- 用户与用户组
- 文件系统
- 运维实践
# 主题相关增强
star: true # 在文章列表中高亮显示
sticky: 1 # 置顶权重(数字越大越靠前,可按需调整)
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 权限体系的可靠指南!