Unix / Linux - 文件权限
Unix / Linux - 文件权限和访问模式
Section titled “Unix / Linux - 文件权限和访问模式”文件权限是 Unix 安全的基石,它控制着谁可以访问文件以及他们可以对文件做什么。每个文件和目录都有相关的所有权和权限。
所有权分为三个级别:
- 所有者 (Owner): 创建文件或目录的用户。所有者通常拥有最大的控制权。
- 用户组 (Group): 用户集合。文件属于一个用户组,可以为该组的所有成员设置权限。
- 其他 (Other / World): 不属于所有者且不属于文件用户组的任何用户。
对于每个级别(所有者、用户组、其他),可以授予或拒绝三种基本权限。
ls -l 命令提供详细列表,包括权限。第一列显示文件类型和权限:
$ ls -ltotal 8-rw-r--r-- 1 user staff 1024 Jul 25 10:30 report.txtdrwxr-x--- 2 user staff 4096 Jul 25 10:35 project_files我们来分解第一列(例如,-rw-r--r-- 或 drwxr-x---):
- 字符 1: 文件类型(
-表示普通文件,d表示目录,l表示软链接等)。 - 字符 2-4: 所有者权限 (User)。
rw-表示可读可写,不可执行。 - 字符 5-7: 用户组权限 (Group)。
r--表示只读。 - 字符 8-10: 其他用户权限 (Other / World)。
r--表示只读。
权限顺序始终是:读取 (r)、写入 (w)、执行 (x)。连字符 (-) 表示权限被拒绝。
文件访问模式
Section titled “文件访问模式”基本权限的含义根据是文件还是目录略有不同:
- 读取 (r): 允许查看文件内容。
- 写入 (w): 允许修改或删除文件内容。注意:删除文件本身通常取决于目录权限。
- 执行 (x): 如果文件是可执行的,允许将其作为程序或脚本运行。
- 读取 (r): 允许列出目录内容(文件名)。
- 写入 (w): 允许在目录内创建、删除或重命名文件(也需要执行权限)。
- 执行 (x): 允许进入(cd 进入)目录并访问其中的文件/子目录(通常称为“搜索”或“遍历”权限)。
常见误区:要访问 /home/user/docs/file.txt 这样的文件,您需要对 /、/home、/home/user 和 /home/user/docs 具有执行 (x) 权限,以及对 file.txt 本身具有必要的权限(例如,读取权限)。
使用 chmod 改变权限
Section titled “使用 chmod 改变权限”chmod(改变模式)命令用于修改文件或目录权限。它可以通过两种方式使用:符号模式和八进制(绝对)模式。
符号模式使用字母表示作用对象(u=用户/所有者,g=用户组,o=其他,a=所有)、操作(+ 添加,- 移除,= 精确设置)和权限(r, w, x)。
| 范围 | 操作符 | 权限 |
|---|---|---|
u (用户/所有者) | + (添加) | r (读取) |
g (用户组) | - (移除) | w (写入) |
o (其他) | = (精确设置) | x (执行) |
a (所有 = ugo) |
示例:从 myfile.txt 权限 -rw------- 开始。
$ ls -l myfile.txt-rw------- 1 user staff 1024 Jul 25 10:40 myfile.txt
# Add read permission for group and other$ chmod go+r myfile.txt$ ls -l myfile.txt-rw-r--r-- 1 user staff 1024 Jul 25 10:40 myfile.txt
# Remove write permission for owner$ chmod u-w myfile.txt$ ls -l myfile.txt-r--r--r-- 1 user staff 1024 Jul 25 10:40 myfile.txt
# Set execute permission only for the owner (removes r/w for owner)$ chmod u=x myfile.txt$ ls -l myfile.txt--x-r--r-- 1 user staff 1024 Jul 25 10:40 myfile.txt
# Add write for user, set group to read-execute, remove all for other$ chmod u+w,g=rx,o= myfile.txt$ ls -l myfile.txt--wxr-x--- 1 user staff 1024 Jul 25 10:40 myfile.txt八进制(绝对)模式
Section titled “八进制(绝对)模式”八进制模式使用数字表示权限。每个权限有一个值:读取 (4),写入 (2),执行 (1)。将这些值 для 每个范围(所有者、用户组、其他)相加。
| 数字 | 二进制 | 权限 | 含义 |
|---|---|---|---|
| 0 | 000 | --- | 无权限 |
| 1 | 001 | —x | 仅执行 |
| 2 | 010 | -w- | 仅写入 |
| 3 | 011 | -wx | 写入和执行 |
| 4 | 100 | r— | 仅读取 |
| 5 | 101 | r-x | 读取和执行 |
| 6 | 110 | rw- | 读取和写入 |
| 7 | 111 | rwx | 读取、写入和执行 |
一个三位八进制数字分别设置所有者、用户组和其他用户的权限。
7=rwx(4+2+1)6=rw-(4+2+0)5=r-x(4+0+1)4=r--(4+0+0)
示例:将权限设置为 所有者=rwx, 用户组=rx, 其他用户=r (rwxr-xr--)
# Owner = rwx = 7# Group = r-x = 5# Other = r-- = 4$ chmod 754 script.sh$ ls -l script.sh-rwxr-xr-- 1 user staff 256 Jul 25 10:55 script.sh示例:将权限设置为 所有者=rw, 用户组=r, 其他用户=无访问权限 (rw-r-----)
# Owner = rw- = 6# Group = r-- = 4# Other = --- = 0$ chmod 640 config.dat$ ls -l config.dat-rw-r----- 1 user staff 102 Jul 25 11:00 config.dat最佳实践:应用最小权限原则。只授予用户或进程执行其功能所需的必要权限。
改变所有权:chown 和 chgrp
Section titled “改变所有权:chown 和 chgrp”您可以使用 chown 和 chgrp 来改变文件或目录的所有者和用户组。
改变所有者 (chown)
Section titled “改变所有者 (chown)”语法:chown new_owner file_or_directory
语法(同时改变所有者和用户组):chown new_owner:new_group file_or_directory
# Change owner of data.csv to 'alice'$ chown alice data.csv
# Change owner to 'bob' and group to 'editors' for report.doc$ chown bob:editors report.doc注意:普通用户通常只能改变他们拥有的文件的所有权,并且通常只能将其改变为他们所属的用户组。root 用户(超级用户)可以自由改变所有权。对目录进行递归更改时使用 -R 选项。
改变用户组 (chgrp)
Section titled “改变用户组 (chgrp)”语法:chgrp new_group file_or_directory
# Change group of shared_script.py to 'developers'$ chgrp developers shared_script.py同样,权限和用户组成员资格适用。对目录进行递归更改时使用 -R 选项。
特殊权限:SUID, SGID 和 Sticky Bit
Section titled “特殊权限:SUID, SGID 和 Sticky Bit”除了 r, w, x 之外,还有一些特殊权限位可以改变执行行为或目录交互。
SUID (Set User ID)
Section titled “SUID (Set User ID)”当在可执行文件上设置 SUID 位时,运行该文件的用户在执行期间可以临时获得该文件所有者的特权。这常用于需要提升权限执行特定任务的命令,例如 passwd,它需要修改 /etc/shadow(由 root 用户拥有)。
在所有者的执行权限位上用 s 表示(例如,-rwsr-xr-x)。如果所有者没有执行权限,则显示为 S。
**安全警告:**如果 SUID 可执行文件编写不慎,可能会带来安全风险,因为它们授予了提升的权限。使用 chmod u+s 文件 或 chmod 4755 文件(八进制)来设置。
SGID (Set Group ID)
Section titled “SGID (Set Group ID)”对于可执行文件:类似于 SUID,但进程以文件用户组的特权运行。
对于目录:当在目录上设置 SGID 位时,在该目录内创建的新文件/子目录会继承该目录的用户组所有权,而不是创建用户的主要用户组。这对于协作项目目录非常有用。
在用户组的执行权限位上用 s 表示(例如,-rwxr-sr-x 或 drwxrwsr-x)。如果用户组没有执行权限,则显示为 S。
使用 chmod g+s 文件或目录 或 chmod 2775 目录(八进制,用于目录)来设置。
Sticky Bit
Section titled “Sticky Bit”主要用于目录。当在目录上设置 Sticky Bit 时,用户只能删除或重命名该目录内的文件,如果他们拥有该文件、拥有该目录或本身是 root 用户。这可以防止用户在 /tmp 等共享目录中删除彼此的文件。
在“其他”用户的执行权限位上用 t 表示(例如,drwxrwxrwt)。如果“其他”用户没有执行权限,则显示为 T。
$ ls -ld /tmpdrwxrwxrwt 1 root root 4096 Jul 25 11:20 /tmp使用 chmod +t 目录 或 chmod 1777 目录(八进制)来设置。
超越基本权限:访问控制列表 (ACLs)
Section titled “超越基本权限:访问控制列表 (ACLs)”为了获得比标准的 所有者/用户组/其他 模型更精细的控制,许多类 Unix 系统支持访问控制列表 (ACLs)。ACLs 允许您向特定的额外用户或用户组授予权限。
常用命令包括 getfacl(查看 ACLs)和 setfacl(修改 ACLs)。ls -l 权限末尾的 + 符号通常表示存在 ACL。
$ ls -l acl_example.txt-rw-rwxr--+ 1 user staff 50 Jul 25 11:30 acl_example.txt
$ getfacl acl_example.txt# file: acl_example.txt# owner: user# group: staffuser::rw-user:alice:rw- # Alice has specific rw permissionsgroup::r--mask::rwxother::r--ACLs 提供了强大的灵活性,但也增加了复杂性。它们超出了基本权限的范围,但了解它们的存在也很重要。有关详细信息,请查阅您的系统文档(man getfacl, man setfacl)。