Linux 权限管理细节详解
Linux 是典型的多用户、多任务操作系统 ,权限管理是 Linux 安全体系的核心之一。
它决定了:
- 谁可以读取文件
- 谁可以修改文件
- 谁可以执行程序
- 谁可以进入目录
- 谁可以管理系统资源
一、Linux 权限的基本模型
Linux 中每个文件或目录都有三类权限对象:
| 对象 | 含义 |
|---|---|
| 所有者 user / owner | 文件的拥有者 |
| 所属组 group | 文件所属的用户组 |
| 其他用户 others | 除所有者和所属组以外的其他用户 |
每类对象都有三种基本权限:
| 权限 | 字母 | 数字 | 对文件的含义 | 对目录的含义 |
|---|---|---|---|---|
| 读 | r |
4 | 可以查看文件内容 | 可以列出目录内容 |
| 写 | w |
2 | 可以修改文件内容 | 可以在目录中创建、删除、重命名文件 |
| 执行 | x |
1 | 可以执行该文件 | 可以进入该目录 |
二、查看文件权限
常用命令:
bash
ls -l
示例输出:
bash
-rwxr-xr-- 1 alice dev 1024 Apr 25 10:00 script.sh
逐段解释:
text
-rwxr-xr--
│││ │││ │││
│││ │││ └┴┴── 其他用户权限:r--
│││ └┴┴────── 所属组权限:r-x
│└┴────────── 所有者权限:rwx
└──────────── 文件类型
完整含义:
| 部分 | 含义 |
|---|---|
- |
普通文件 |
rwx |
所有者 alice 可读、可写、可执行 |
r-x |
所属组 dev 可读、可执行,不可写 |
r-- |
其他用户只读 |
alice |
文件所有者 |
dev |
文件所属组 |
1024 |
文件大小 |
script.sh |
文件名 |
三、文件类型标识
权限字符串第一位表示文件类型:
| 标识 | 类型 |
|---|---|
- |
普通文件 |
d |
目录 |
l |
符号链接 / 软链接 |
c |
字符设备 |
b |
块设备 |
s |
socket 文件 |
p |
管道文件 |
示例:
bash
drwxr-xr-x 2 root root 4096 Apr 25 10:00 /etc
lrwxrwxrwx 1 root root 11 Apr 25 10:00 link -> /etc/hosts
四、权限的数字表示法
Linux 权限可以用数字表示:
| 权限 | 数字 |
|---|---|
r |
4 |
w |
2 |
x |
1 |
组合方式是相加:
| 权限 | 数字 |
|---|---|
--- |
0 |
--x |
1 |
-w- |
2 |
-wx |
3 |
r-- |
4 |
r-x |
5 |
rw- |
6 |
rwx |
7 |
例如:
bash
chmod 755 script.sh
表示:
text
7 = rwx 所有者可读、写、执行
5 = r-x 所属组可读、执行
5 = r-x 其他用户可读、执行
即:
bash
-rwxr-xr-x
五、常见权限组合
1. 755
bash
-rwxr-xr-x
常用于:
- 脚本文件
- 可执行程序
- 普通目录
含义:
- 所有者:读、写、执行
- 组用户:读、执行
- 其他用户:读、执行
示例:
bash
chmod 755 deploy.sh
2. 644
bash
-rw-r--r--
常用于:
- 普通文本文件
- 配置文件
- 静态资源文件
含义:
- 所有者:读、写
- 组用户:只读
- 其他用户:只读
示例:
bash
chmod 644 config.txt
3. 600
bash
-rw-------
常用于:
- 私钥文件
- 敏感配置
- 用户凭据文件
示例:
bash
chmod 600 ~/.ssh/id_rsa
SSH 私钥通常必须是 600,否则可能报错:
bash
WARNING: UNPROTECTED PRIVATE KEY FILE!
4. 700
bash
-rwx------
常用于:
- 私有脚本
- 用户私有目录
示例:
bash
chmod 700 ~/.ssh
5. 777
bash
-rwxrwxrwx
表示所有人都可以读、写、执行。
不推荐使用,尤其是在服务器上:
bash
chmod 777 file
风险:
- 任意用户都能修改
- 容易被植入恶意脚本
- 可能造成权限越权
六、chmod 修改权限
chmod 用于修改文件或目录权限。
1. 数字方式
bash
chmod 755 file.sh
chmod 644 config.conf
chmod 600 private.key
递归修改目录:
bash
chmod -R 755 /var/www/html
注意:
-R 会递归影响目录下所有文件,使用时要谨慎。
2. 符号方式
格式:
bash
chmod [对象][操作][权限] 文件
对象:
| 符号 | 含义 |
|---|---|
u |
所有者 user |
g |
所属组 group |
o |
其他用户 others |
a |
所有人 all |
操作:
| 符号 | 含义 |
|---|---|
+ |
增加权限 |
- |
移除权限 |
= |
设置为指定权限 |
示例:
bash
chmod u+x script.sh
给所有者增加执行权限。
bash
chmod g-w file.txt
去掉所属组的写权限。
bash
chmod o-r file.txt
去掉其他用户的读权限。
bash
chmod a+r README.md
所有人增加读权限。
bash
chmod u=rwx,g=rx,o=r file.sh
设置为:
bash
-rwxr-xr--
七、chown 修改所有者
chown 用于修改文件所有者和所属组。
1. 修改所有者
bash
sudo chown alice file.txt
表示把 file.txt 的所有者改为 alice。
2. 修改所有者和所属组
bash
sudo chown alice:dev file.txt
表示:
- 所有者改为
alice - 所属组改为
dev
3. 递归修改
bash
sudo chown -R www-data:www-data /var/www/html
常用于 Web 服务目录。
八、chgrp 修改所属组
chgrp 只修改所属组。
bash
sudo chgrp dev file.txt
递归修改:
bash
sudo chgrp -R dev /project
九、目录权限和文件权限的区别
这是 Linux 权限管理中非常重要的一点。
1. 文件权限
对于普通文件:
| 权限 | 作用 |
|---|---|
r |
查看文件内容 |
w |
修改文件内容 |
x |
执行文件 |
例如:
bash
-rw-r--r-- file.txt
表示文件可以被读取,但不能执行。
2. 目录权限
对于目录:
| 权限 | 作用 |
|---|---|
r |
可以列出目录内容,如 ls |
w |
可以创建、删除、重命名目录内文件 |
x |
可以进入目录,如 cd |
目录的 x 权限非常关键。
例如:
bash
chmod 600 /testdir
即使有读写权限,没有执行权限,也无法进入目录。
常见目录权限:
bash
chmod 755 /some/dir
表示:
- 所有者可进入、查看、修改
- 其他用户可进入、查看
- 其他用户不能创建或删除文件
十、删除文件需要什么权限?
很多人误以为删除文件需要文件本身的写权限,其实不是。
删除文件需要对其所在目录有写权限和执行权限。
例如:
bash
-r--r--r-- file.txt
即使 file.txt 本身不可写,如果你对它所在目录有 wx 权限,仍然可以删除它。
原因是:
- 删除文件本质上是修改目录项
- 不是修改文件内容
十一、umask 默认权限掩码
umask 决定新建文件或目录的默认权限。
查看当前 umask:
bash
umask
常见输出:
bash
0022
默认权限规则:
| 类型 | 理论最大权限 |
|---|---|
| 文件 | 666 |
| 目录 | 777 |
实际权限:
text
实际权限 = 最大权限 - umask
例如:
bash
umask 022
新建文件:
text
666 - 022 = 644
新建目录:
text
777 - 022 = 755
所以:
bash
touch a.txt
mkdir test
ls -l
通常会看到:
bash
-rw-r--r-- a.txt
drwxr-xr-x test
临时修改 umask:
bash
umask 027
永久修改可以写入:
bash
~/.bashrc
/etc/profile
/etc/login.defs
十二、特殊权限:SUID、SGID、Sticky Bit
除了 rwx,Linux 还有三种特殊权限:
| 特殊权限 | 数字 | 作用 |
|---|---|---|
| SUID | 4 | 让执行者临时拥有文件所有者权限 |
| SGID | 2 | 让执行者临时拥有文件所属组权限;用于目录时可继承组 |
| Sticky Bit | 1 | 目录中只有文件所有者/root 能删除自己的文件 |
它们会出现在权限字符串中的执行位上。
1. SUID
SUID 作用于可执行文件。
典型例子:
bash
ls -l /usr/bin/passwd
可能看到:
bash
-rwsr-xr-x 1 root root ... /usr/bin/passwd
注意这里是:
text
rws
而不是:
text
rwx
passwd 命令需要修改 /etc/shadow,普通用户本来没有权限修改。
但因为 /usr/bin/passwd 拥有 SUID,所以普通用户执行它时,会临时拥有文件所有者 root 的权限。
设置 SUID:
bash
chmod u+s file
数字方式:
bash
chmod 4755 file
取消 SUID:
bash
chmod u-s file
安全提醒:
- 不要随意给脚本或程序加 SUID
- SUID 程序如果有漏洞,可能导致提权
2. SGID
SGID 可以作用于文件,也可以作用于目录。
作用于可执行文件
执行者临时拥有文件所属组权限。
设置:
bash
chmod g+s file
数字方式:
bash
chmod 2755 file
作用于目录
这是非常常见的协作目录用法。
如果一个目录设置了 SGID,则目录中新建的文件会自动继承该目录的所属组。
示例:
bash
sudo mkdir /project
sudo chown root:dev /project
sudo chmod 2775 /project
查看:
bash
drwxrwsr-x root dev /project
之后 dev 组成员在 /project 中创建的文件,所属组都会是 dev。
适用于:
- 团队共享目录
- 项目协作目录
- Web 项目目录
3. Sticky Bit
Sticky Bit 常用于公共可写目录,例如 /tmp。
查看:
bash
ls -ld /tmp
通常看到:
bash
drwxrwxrwt root root /tmp
最后一位是:
text
t
含义:
- 所有人都可以在
/tmp创建文件 - 但只能删除自己创建的文件
- root 可以删除任何文件
设置 Sticky Bit:
bash
chmod +t /shared
数字方式:
bash
chmod 1777 /shared
取消:
bash
chmod -t /shared
十三、ACL:更细粒度的权限控制
传统 Linux 权限只有:
- owner
- group
- others
如果想给某个特定用户单独授权,可以使用 ACL。
查看 ACL:
bash
getfacl file.txt
给用户 alice 添加读写权限:
bash
setfacl -m u:alice:rw file.txt
给用户 bob 添加只读权限:
bash
setfacl -m u:bob:r file.txt
给组 dev 添加读写执行权限:
bash
setfacl -m g:dev:rwx /project
递归设置 ACL:
bash
setfacl -R -m u:alice:rwx /project
设置默认 ACL,让目录下新建文件继承权限:
bash
setfacl -m d:u:alice:rwx /project
删除 ACL:
bash
setfacl -x u:alice file.txt
清空所有 ACL:
bash
setfacl -b file.txt
如果 ls -l 看到权限后面有 +:
bash
-rw-r--r--+ file.txt
说明该文件有 ACL。
十四、root、sudo 与权限提升
1. root 用户
root 是 Linux 超级管理员,UID 为 0。
查看当前用户:
bash
whoami
查看用户 ID:
bash
id
root 几乎可以绕过普通权限限制,所以使用时要谨慎。
2. sudo
sudo 允许普通用户以其他用户身份执行命令,默认是 root。
示例:
bash
sudo apt update
sudo systemctl restart nginx
查看当前用户可执行哪些 sudo 命令:
bash
sudo -l
sudo 配置文件:
bash
/etc/sudoers
建议使用:
bash
sudo visudo
而不是直接编辑 /etc/sudoers。
因为 visudo 会检查语法,避免配置错误导致 sudo 不可用。
十五、用户和用户组管理
1. 查看用户信息
bash
id username
示例:
bash
uid=1000(alice) gid=1000(alice) groups=1000(alice),27(sudo),1001(dev)
2. 添加用户
bash
sudo useradd -m alice
设置密码:
bash
sudo passwd alice
3. 添加用户组
bash
sudo groupadd dev
4. 把用户加入组
bash
sudo usermod -aG dev alice
注意:
-aG 中的 a 表示 append,追加到组。
如果少了 -a,可能会覆盖原来的附加组。
5. 查看用户所属组
bash
groups alice
十六、常见实战场景
场景 1:让脚本可以执行
bash
chmod +x deploy.sh
./deploy.sh
或:
bash
bash deploy.sh
区别:
./deploy.sh需要执行权限bash deploy.sh不一定需要执行权限,但需要读权限
场景 2:设置 SSH 密钥权限
bash
chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_rsa
chmod 644 ~/.ssh/id_rsa.pub
chmod 600 ~/.ssh/authorized_keys
推荐权限:
| 文件/目录 | 权限 |
|---|---|
~/.ssh |
700 |
| 私钥 | 600 |
| 公钥 | 644 |
authorized_keys |
600 |
场景 3:Web 目录权限
例如 Nginx 网站目录:
bash
sudo chown -R www-data:www-data /var/www/html
sudo find /var/www/html -type d -exec chmod 755 {} \;
sudo find /var/www/html -type f -exec chmod 644 {} \;
含义:
- 目录:755
- 文件:644
- 所属用户/组:www-data
场景 4:团队共享目录
bash
sudo groupadd dev
sudo mkdir /project
sudo chown root:dev /project
sudo chmod 2775 /project
sudo usermod -aG dev alice
sudo usermod -aG dev bob
2775 中的 2 是 SGID,保证新建文件继承 dev 组。
十七、权限排查思路
当你遇到:
bash
Permission denied
可以按这个顺序排查:
1. 看当前用户
bash
whoami
id
2. 看文件权限
bash
ls -l file
3. 看目录权限
bash
ls -ld /path
ls -ld /path/to
ls -ld /path/to/dir
注意:
访问一个文件,不仅需要文件权限,还需要路径上每一级目录的 x 权限。
4. 看 ACL
bash
getfacl file
5. 看是否需要 sudo
bash
sudo command
6. 看服务用户
例如 Nginx、Apache、MySQL 访问文件失败时,要确认服务运行用户:
bash
ps aux | grep nginx
ps aux | grep apache
ps aux | grep mysql
十八、权限管理最佳实践
推荐做法
- 普通文件使用
644 - 可执行脚本使用
755 - 私钥使用
600 .ssh目录使用700- Web 目录通常目录
755、文件644 - 团队目录使用
2775+ 用户组 - 使用
sudo代替直接登录 root - 使用
visudo修改 sudo 配置 - 用 ACL 做细粒度授权
避免做法
- 不要随意使用
chmod 777 - 不要把敏感文件设为全局可读
- 不要给未知程序设置 SUID
- 不要直接编辑
/etc/sudoers - 不要让服务以 root 身份运行
- 不要递归修改系统目录权限,例如:
bash
chmod -R 777 /
chmod -R 777 /etc
chmod -R 777 /usr
这些操作可能导致系统损坏或严重安全风险。
十九、一句话总结
Linux 权限管理可以理解为:
谁,对什么文件或目录,能做什么操作。
核心公式是:
text
用户身份 + 所属组 + 文件权限 + 目录权限 + ACL + 特殊权限 = 最终访问结果
如果你掌握了:
rwxchmodchownchgrpumaskSUID / SGID / Sticky BitACLsudo
就基本掌握了 Linux 权限管理的核心。