文件权限
概述
Linux 是一个多用户操作系统,文件权限机制是其安全性的重要基础。每个文件和目录都有一组权限,控制谁可以读取、写入或执行它。
权限基础
查看权限
使用 ls -l 命令查看文件权限:
bash
$ ls -l
-rw-r--r-- 1 maxwell maxwell 1234 Jan 1 10:00 file.txt
drwxr-xr-x 2 maxwell maxwell 4096 Jan 1 10:00 directory权限字符串解读
-rw-r--r--
│├─┤├─┤├─┤
│ │ │ └── 其他用户权限(other)
│ │ └───── 所属组权限(group)
│ └──────── 所有者权限(owner/user)
└────────── 文件类型权限类型
| 符号 | 含义 | 对文件的意义 | 对目录的意义 |
|---|---|---|---|
r | 读取(read) | 查看文件内容 | 列出目录内容 |
w | 写入(write) | 修改文件内容 | 创建/删除文件 |
x | 执行(execute) | 运行程序 | 进入目录 |
- | 无权限 | - | - |
三类用户
| 类别 | 说明 |
|---|---|
| 所有者(Owner/User) | 文件的创建者 |
| 所属组(Group) | 文件所属的组 |
| 其他用户(Others) | 除上述两类之外的用户 |
数字表示法
权限可以用八进制数字表示:
| 权限 | 数值 |
|---|---|
| r(读) | 4 |
| w(写) | 2 |
| x(执行) | 1 |
| -(无) | 0 |
计算权限数字
rwx = 4 + 2 + 1 = 7
rw- = 4 + 2 + 0 = 6
r-x = 4 + 0 + 1 = 5
r-- = 4 + 0 + 0 = 4
--- = 0 + 0 + 0 = 0常见权限组合
| 数字 | 符号 | 含义 |
|---|---|---|
| 755 | rwxr-xr-x | 所有者完全控制,其他人可读和执行 |
| 644 | rw-r--r-- | 所有者可读写,其他人只读 |
| 700 | rwx------ | 只有所有者可访问 |
| 777 | rwxrwxrwx | 所有人完全控制(不推荐) |
| 600 | rw------- | 只有所有者可读写 |
| 666 | rw-rw-rw- | 所有人可读写 |
修改权限
chmod - 修改权限
符号模式
bash
# 格式:chmod [ugoa][+-=][rwx] 文件
# 给所有者添加执行权限
$ chmod u+x script.sh
# 移除组的写权限
$ chmod g-w file.txt
# 设置其他用户只读
$ chmod o=r file.txt
# 给所有人添加执行权限
$ chmod a+x script.sh
# 组合使用
$ chmod u+x,g-w,o-rwx file.txt
# 递归修改目录
$ chmod -R u+w directory/符号说明
| 符号 | 含义 |
|---|---|
| u | 所有者(user) |
| g | 所属组(group) |
| o | 其他用户(others) |
| a | 所有人(all) |
| + | 添加权限 |
| - | 移除权限 |
| = | 设置权限 |
数字模式
bash
# 设置为 755
$ chmod 755 script.sh
# 设置为 644
$ chmod 644 file.txt
# 递归修改
$ chmod -R 755 directory/常见使用场景
bash
# 使脚本可执行
$ chmod +x script.sh
$ chmod 755 script.sh
# 保护配置文件
$ chmod 600 config.ini
# 共享目录
$ chmod 775 shared_dir/
# 网站目录
$ chmod 755 /var/www/html/
$ chmod 644 /var/www/html/*.html修改所有权
chown - 修改所有者
bash
# 修改所有者
$ sudo chown newowner file.txt
# 修改所有者和组
$ sudo chown newowner:newgroup file.txt
# 只修改组
$ sudo chown :newgroup file.txt
# 递归修改
$ sudo chown -R newowner:newgroup directory/chgrp - 修改所属组
bash
# 修改组
$ sudo chgrp newgroup file.txt
# 递归修改
$ sudo chgrp -R newgroup directory/特殊权限
SUID(Set User ID)
当可执行文件设置了 SUID 位时,该文件将以文件所有者的权限运行,而不是执行者的权限。
bash
# 查看 SUID 文件
$ ls -l /usr/bin/passwd
-rwsr-xr-x 1 root root 68208 Jan 1 10:00 /usr/bin/passwd
# ^-- s 表示 SUID
# 设置 SUID
$ chmod u+s executable
$ chmod 4755 executable安全提示:SUID 文件存在安全风险,应谨慎使用。
SGID(Set Group ID)
- 对文件:以文件所属组的权限运行
- 对目录:目录中创建的文件继承目录的组
bash
# 设置 SGID
$ chmod g+s directory/
$ chmod 2755 directory/
# 查看
$ ls -ld directory/
drwxr-sr-x 2 user group 4096 Jan 1 10:00 directory/
# ^-- s 表示 SGIDSticky Bit
设置在目录上时,只有文件所有者、目录所有者或 root 才能删除或移动其中的文件。
bash
# 设置 sticky bit
$ chmod +t directory/
$ chmod 1777 directory/
# 查看
$ ls -ld /tmp
drwxrwxrwt 10 root root 4096 Jan 1 10:00 /tmp
# ^-- t 表示 sticky bit特殊权限数字
| 权限 | 数字 |
|---|---|
| SUID | 4 |
| SGID | 2 |
| Sticky | 1 |
bash
# 完整的四位权限
$ chmod 4755 file # SUID + rwxr-xr-x
$ chmod 2755 dir # SGID + rwxr-xr-x
$ chmod 1777 dir # Sticky + rwxrwxrwx默认权限:umask
umask 决定新创建文件和目录的默认权限。
理解 umask
bash
# 查看当前 umask
$ umask
0022
# 计算默认权限
# 文件默认权限 = 666 - umask = 666 - 022 = 644
# 目录默认权限 = 777 - umask = 777 - 022 = 755设置 umask
bash
# 临时设置
$ umask 027
# 文件默认权限:640
# 目录默认权限:750
# 永久设置(添加到 ~/.bashrc)
$ echo "umask 027" >> ~/.bashrc常见 umask 值
| umask | 文件权限 | 目录权限 | 说明 |
|---|---|---|---|
| 022 | 644 | 755 | 系统默认 |
| 027 | 640 | 750 | 较安全 |
| 077 | 600 | 700 | 只有所有者可访问 |
| 002 | 664 | 775 | 组成员可写 |
访问控制列表(ACL)
ACL 提供比传统权限更细粒度的访问控制。
查看 ACL
bash
$ getfacl file.txt
# file: file.txt
# owner: maxwell
# group: maxwell
user::rw-
group::r--
other::r--设置 ACL
bash
# 给特定用户设置权限
$ setfacl -m u:alice:rw file.txt
# 给特定组设置权限
$ setfacl -m g:developers:rx directory/
# 设置默认 ACL(对新文件生效)
$ setfacl -d -m u:alice:rw directory/
# 删除 ACL
$ setfacl -x u:alice file.txt
# 删除所有 ACL
$ setfacl -b file.txt
# 递归设置
$ setfacl -R -m u:alice:rx directory/ACL 示例
bash
# 场景:让 alice 可以读取私有文件
$ setfacl -m u:alice:r secret.txt
$ getfacl secret.txt
# file: secret.txt
# owner: maxwell
# group: maxwell
user::rw-
user:alice:r--
group::---
other::---文件属性
lsattr - 查看属性
bash
$ lsattr file.txt
----i------------ file.txtchattr - 修改属性
bash
# 设置不可修改(immutable)
$ sudo chattr +i file.txt
# 即使 root 也无法修改或删除
# 移除不可修改
$ sudo chattr -i file.txt
# 只能追加(append only)
$ sudo chattr +a logfile.txt
# 安全删除
$ sudo chattr +s file.txt常用属性
| 属性 | 说明 |
|---|---|
| i | 不可修改 |
| a | 只能追加 |
| s | 安全删除 |
| u | 可恢复删除 |
| c | 自动压缩 |
权限实践
网站目录权限
bash
# 设置所有者为 www-data
$ 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 {} \;SSH 密钥权限
bash
# ~/.ssh 目录
$ chmod 700 ~/.ssh
# 私钥
$ chmod 600 ~/.ssh/id_rsa
# 公钥
$ chmod 644 ~/.ssh/id_rsa.pub
# authorized_keys
$ chmod 600 ~/.ssh/authorized_keys共享目录
bash
# 创建共享目录
$ sudo mkdir /shared
# 设置组
$ sudo chgrp developers /shared
# 设置 SGID(新文件继承组)
$ sudo chmod 2775 /shared脚本文件
bash
# 使脚本可执行
$ chmod 755 script.sh
# 或只对所有者
$ chmod 700 private_script.sh排查权限问题
检查清单
bash
# 1. 查看文件权限
$ ls -la file.txt
# 2. 查看当前用户和组
$ id
# 3. 查看文件 ACL
$ getfacl file.txt
# 4. 查看目录权限链
$ namei -l /path/to/file.txt
# 5. 检查 SELinux(如果启用)
$ ls -Z file.txt
$ getenforce常见问题
无法执行脚本
bash$ chmod +x script.shPermission denied 访问目录
bash# 需要目录的 x 权限 $ chmod +x directory/无法删除文件
bash# 检查目录的 w 权限 $ chmod +w parent_directory/SSH 密钥不工作
bash$ chmod 600 ~/.ssh/id_rsa $ chmod 700 ~/.ssh
小结
本章介绍了 Linux 文件权限的核心概念:
- 基本权限:读(r)、写(w)、执行(x)
- 三类用户:所有者、组、其他
- 权限表示:符号(rwx)和数字(755)
- 修改权限:
chmod、chown、chgrp - 特殊权限:SUID、SGID、Sticky Bit
- 默认权限:umask
- 高级控制:ACL
正确设置文件权限是系统安全的重要组成部分。在日常使用中,遵循最小权限原则——只赋予必要的权限。
上一章:文件基本操作
下一章:文件查找