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

9.4 KiB
Raw Blame History

title, icon, date, category, tag, star, article, timeline, description
title icon date category tag star article timeline description
Linux 权限 simple-icons:linux 2024-11-14
Linux 基础
系统运维
Linux
权限管理
用户与用户组
文件系统
运维实践
false true true 深度解析 Linux 权限体系,从用户、用户组到 SGID 与 umask 的协同, 结合共享目录实战案例,帮助你系统掌握多用户环境下的安全与协作配置。

深度解析 Linux 权限体系,从用户、用户组到 SGID 与 umask 的协同, 结合共享目录实战案例,帮助你系统掌握多用户环境下的安全与协作配置。

Linux 权限体系深度解析:从用户组到共享目录的完整实践

这是一份关于 Linux 用户与权限体系的深度整理,涵盖基础概念、核心机制与实战配置,帮助你彻底理解并灵活运用 Linux 权限管理。


一、Linux 权限体系基础

Linux 的权限体系是系统安全和多用户协作的基石。它通过用户用户组权限位三个核心要素,精确控制谁能对文件做什么操作。

1.1 用户类型

# 超级用户(root
- 拥有系统的全部权限,命令提示符为 #
- 可修改任何文件、安装软件、管理用户

# 普通用户
- 只能操作自己有权限的文件和目录,命令提示符为 $

# 切换方式
su 用户名          # 切换用户
sudo 命令          # 临时提升权限执行操作

1.2 文件权限结构

每个文件或目录都有三类访问者和三种基本权限:

三类访问者

  • Owner(拥有者):文件的创建者或指定用户
  • Group(所属组):同组用户共享一定权限
  • Others(其他人):系统中所有其他用户

三种基本权限

  • r(read):读权限,可查看文件内容或列出目录
  • w(write):写权限,可修改文件或在目录中添加/删除文件
  • x(execute):执行权限,可运行文件或进入目录

权限表示示例

-rw-r--r--
  • 文件类型:- 表示普通文件
  • 拥有者:rw- → 可读可写
  • 所属组:r-- → 只读
  • 其他人:r-- → 只读

1.3 权限管理命令

chmod 755 file        # 拥有者可读写执行,组和其他人可读执行
chown 用户:组 file     # 修改文件拥有者和所属组
chgrp 组 file         # 修改文件所属组
umask 002             # 设置默认权限掩码

二、深入理解用户组(Group

用户组是 Linux 权限体系的精髓所在,它能极大简化多用户协作场景下的权限管理。

2.1 组的两种类型

主组(Primary Group

  • 每个用户必须属于一个主组
  • 用户创建文件时,文件的所属组默认就是该用户的主组

附加组(Secondary Group

  • 用户可以属于多个附加组
  • 附加组赋予用户额外的权限,比如访问某些共享目录

2.2 权限与组的关系

Linux 判断文件访问权限的顺序是:Owner → Group → Others

-rw-r----- 1 alice dev 1234 Nov 14 report.txt
  • alice(拥有者)→ rw- 可读写
  • dev组成员r-- 只读
  • 其他人--- 无权限

关键结论:拥有者、组、其他人的权限是独立设置的,完全可能出现"拥有者有权限,但组没有权限"的情况,这在保护敏感文件时非常有用。

2.3 组管理常用命令

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,需要让 user1user2user3 三人都能操作该目录。

4.1 核心配置步骤

# 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 中添加:

umask 0002

这样新建文件权限为 664(组成员可读写),目录为 775

4.3 验证配置

# 切换到 user2 测试
su - user2
cd /home/sunri/PRS7950
touch test.txt
ls -l test.txt  # 所属组应为 prsgroup

五、SGID 位与 umask 深度解析

5.1 SGID 位(Set Group ID

作用:主要用于目录,确保目录下新建文件自动继承目录的所属组。

# 设置 SGID 位
chmod g+s /shared_dir    # 符号模式
chmod 2770 /shared_dir   # 八进制模式(推荐)

典型场景:团队共享目录,保证所有成员创建的文件都属于同一组。

5.2 umask(用户文件创建掩码)

定义:决定新建文件/目录的默认权限。

计算方式:实际权限 = 默认权限 - umask

  • 文件默认:666rw-rw-rw-
  • 目录默认:777rwxrwxrwx
# 示例: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 组的本质

# 安装 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 限制特定命令
# 更安全的做法:限制只能执行特定 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 审计与监控

# 查看 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 权限的"为什么",更能灵活应对各种多用户协作场景,实现既安全又高效的权限管理。


参考命令速查

# 创建共享目录完整流程
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 权限体系的可靠指南!