第一次提交
This commit is contained in:
@@ -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 权限体系的可靠指南!
|
||||
Reference in New Issue
Block a user