引言:为什么理解 Linux 权限至关重要?
在现代软件部署架构中,Linux 几乎是服务器端操作系统的绝对主流。无论是运行 Java 应用的 Tomcat、Spring Boot 内嵌容器,还是 Kafka、Redis、MySQL 等中间件,它们都运行在 Linux 环境下。而这些服务能否安全、稳定、高效地运行,很大程度上依赖于底层文件系统的权限控制和用户隔离机制。
一个常见的生产事故场景是:开发人员将应用日志目录权限设为 777,导致任意用户可写入甚至删除日志;或者数据库配置文件被错误地赋予了全局读权限,造成敏感信息泄露。这些问题的根源,往往是对 Linux 权限模型理解不深。
本文将从零开始,系统性地讲解 Linux 的文件权限体系、用户与组管理、特殊权限位(SUID/SGID/Sticky Bit)、ACL 扩展权限、umask 机制、以及在容器化时代(如 Docker)中的权限实践。
第一章:Linux 文件权限基础模型
1.1 三元权限结构:User / Group / Others
Linux 的权限模型基于“三元主体”设计:
- User (Owner):
- Group:
- Others:
每个主体拥有三种基本权限:
⚠️ 注意:对目录而言,执行权限(x)是访问的前提。没有 x 权限,即使有 r 权限也无法 ls 目录内容(会提示 "Permission denied")。
1.2 权限表示法:符号 vs 数值
符号表示法(Symbolic Notation)
-rwxr-xr-- 1 alice dev 1024 Feb 21 15:35 app.jar
分解如下:
[文件类型][User][Group][Others] - rwx r-x r--
- 首字符
- 表示普通文件(d=目录,l=软链接,c=字符设备等) rwx:所有者有读、写、执行权限r-x:组成员有读、执行权限(无写)r--:其他用户仅有读权限
数值表示法(Octal Notation)
每组权限可用三位二进制表示,再转为八进制:
rwx = 111₂ = 7₈r-x = 101₂ = 5₈r-- = 100₂ = 4₈
因此 rwxr-xr-- = 754
常用权限组合:
1.3 查看与修改权限
查看权限
ls -l filename # 查看单个文件ls -ld dirname # 查看目录自身权限(非内容)stat filename # 显示更详细信息(含 inode、访问时间等)
修改权限:`chmod`
# 符号模式chmod u+x script.sh # 所有者加执行chmod g-w file.txt # 组移除写权限chmod o=r file.conf # 其他用户设为只读chmod a+r public.txt # 所有用户加读(a=all)# 数值模式chmod 755 deploy.shchmod 644 config.yamlchmod 600 private.key
💡 提示:chmod -R 可递归修改目录及子项,但需谨慎使用,避免误授高权限。
修改所有者与组:`chown` / `chgrp`
chown alice:dev app.jar # 同时改用户和组chown alice app.jar # 仅改用户chgrp ops app.jar # 仅改组chown :ops app.jar # 仅改组(冒号前留空)
Linux 权限三元模型
第二章:用户与组管理机制
2.1 用户账户的本质
在 Linux 中,每个用户由一个唯一的 用户 ID(UID) 标识,而非用户名。用户名只是 UID 的别名,便于人类记忆。
关键配置文件:
/etc/passwd:存储用户基本信息(不含密码)/etc/shadow:存储加密后的密码(仅 root 可读)/etc/group:存储组信息/etc/gshadow:存储组密码(极少使用)
`/etc/passwd` 结构(以冒号分隔)
alice:x:1001:1001:Alice Smith:/home/alice:/bin/bash
字段含义:
- 用户名
- 密码占位符(
x 表示密码在 /etc/shadow) - UID
- GID(主组 ID)
- 用户描述(GECOS)
- 家目录
- 登录 Shell
📌 默认 UID 范围:
- 0:root(超级用户)
- 1–999:系统用户(服务账户)
- 1000+:普通用户
2.2 创建与管理用户
创建用户
# 基础创建(自动创建家目录、设置默认 shell)sudo useradd -m alice# 指定 UID、家目录、shellsudo useradd -u 2000 -d /opt/alice -s /bin/zsh -m bob# 创建但不设密码(常用于服务账户)sudo useradd --system --no-create-home nginx
设置密码
sudo passwd alice # 交互式输入echo"password" | sudo passwd --stdin alice # 非交互(某些系统支持)
删除用户
sudo userdel alice # 保留家目录sudo userdel -r alice # 同时删除家目录和邮件池
2.3 用户组管理
每个用户有一个 主组(Primary Group),还可加入多个 附加组(Supplementary Groups)。
创建组
sudo groupadd developerssudo groupadd -g 3000 ops # 指定 GID
将用户加入组
# 方法1:usermod(永久生效,需重新登录)sudo usermod -aG developers alice# 方法2:临时加入(当前会话有效)newgrp developers
⚠️ -aG 中的 -a(append)极其重要!若省略,会覆盖用户原有附加组。
查看用户所属组
groups alice # 查看 alice 的所有组id alice # 显示 UID、GID、附加组
用户与组关系模型
第三章:特殊权限位(Special Permission Bits)
除了基本的 r/w/x,Linux 还提供三种特殊权限位,用于实现高级控制。
3.1 SUID(Set User ID)
- 作用:当可执行文件设置了 SUID,任何用户执行它时,进程将以文件所有者的身份运行。
- 典型应用:
passwd 命令(普通用户可修改 /etc/shadow)
ls -l /usr/bin/passwd# -rwsr-xr-x 1 root root ... passwd# ↑# s 表示 SUID 已设置
chmod u+s programchmod 4755 program # 4 = SUID
🔒 安全风险:若 SUID 程序存在漏洞,攻击者可获得所有者权限(通常是 root)。切勿随意给自定义程序加 SUID!
3.2 SGID(Set Group ID)
mkdir sharedchgrp developers sharedchmod g+s shared # 设置 SGIDchmod 2775 shared # 2 = SGID# 此后,alice 和 bob 在 shared 中创建的文件都属于 developers 组
chmod g+s file_or_dirchmod 2755 dir
3.3 Sticky Bit(粘滞位)
- 作用:仅用于目录。设置后,只有文件所有者或 root 才能删除该目录下的文件,即使其他用户有写权限。
- 典型应用:
ls -ld /tmp# drwxrwxrwt 10 root root ... /tmp# ↑# t 表示 Sticky Bit
chmod +t directorychmod 1777 /tmp
特殊权限位对比