Skip to content

Unix / Linux - 文件权限

Unix / Linux - 文件权限和访问模式

Section titled “Unix / Linux - 文件权限和访问模式”

文件权限是 Unix 安全的基石,它控制着谁可以访问文件以及他们可以对文件做什么。每个文件和目录都有相关的所有权和权限。

所有权分为三个级别:

  • 所有者 (Owner): 创建文件或目录的用户。所有者通常拥有最大的控制权。
  • 用户组 (Group): 用户集合。文件属于一个用户组,可以为该组的所有成员设置权限。
  • 其他 (Other / World): 不属于所有者且不属于文件用户组的任何用户。

对于每个级别(所有者、用户组、其他),可以授予或拒绝三种基本权限。

ls -l 命令提供详细列表,包括权限。第一列显示文件类型和权限:

$ ls -l
total 8
-rw-r--r-- 1 user staff 1024 Jul 25 10:30 report.txt
drwxr-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)。连字符 (-) 表示权限被拒绝。

基本权限的含义根据是文件还是目录略有不同:

  • 读取 (r): 允许查看文件内容。
  • 写入 (w): 允许修改或删除文件内容。注意:删除文件本身通常取决于目录权限。
  • 执行 (x): 如果文件是可执行的,允许将其作为程序或脚本运行。
  • 读取 (r): 允许列出目录内容(文件名)。
  • 写入 (w): 允许在目录内创建、删除或重命名文件(也需要执行权限)。
  • 执行 (x): 允许进入(cd 进入)目录并访问其中的文件/子目录(通常称为“搜索”或“遍历”权限)。

常见误区:要访问 /home/user/docs/file.txt 这样的文件,您需要对 /、/home、/home/user 和 /home/user/docs 具有执行 (x) 权限,以及对 file.txt 本身具有必要的权限(例如,读取权限)。

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

八进制模式使用数字表示权限。每个权限有一个值:读取 (4),写入 (2),执行 (1)。将这些值 для 每个范围(所有者、用户组、其他)相加。

数字二进制权限含义
0000---无权限
1001—x仅执行
2010-w-仅写入
3011-wx写入和执行
4100r—仅读取
5101r-x读取和执行
6110rw-读取和写入
7111rwx读取、写入和执行

一个三位八进制数字分别设置所有者、用户组和其他用户的权限。

  • 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 来改变文件或目录的所有者和用户组。

语法: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 new_group file_or_directory

# Change group of shared_script.py to 'developers'
$ chgrp developers shared_script.py

同样,权限和用户组成员资格适用。对目录进行递归更改时使用 -R 选项。

除了 r, w, x 之外,还有一些特殊权限位可以改变执行行为或目录交互。

当在可执行文件上设置 SUID 位时,运行该文件的用户在执行期间可以临时获得该文件所有者的特权。这常用于需要提升权限执行特定任务的命令,例如 passwd,它需要修改 /etc/shadow(由 root 用户拥有)。

在所有者的执行权限位上用 s 表示(例如,-rwsr-xr-x)。如果所有者没有执行权限,则显示为 S。

**安全警告:**如果 SUID 可执行文件编写不慎,可能会带来安全风险,因为它们授予了提升的权限。使用 chmod u+s 文件 或 chmod 4755 文件(八进制)来设置。

对于可执行文件:类似于 SUID,但进程以文件用户组的特权运行。

对于目录:当在目录上设置 SGID 位时,在该目录内创建的新文件/子目录会继承该目录的用户组所有权,而不是创建用户的主要用户组。这对于协作项目目录非常有用。

在用户组的执行权限位上用 s 表示(例如,-rwxr-sr-x 或 drwxrwsr-x)。如果用户组没有执行权限,则显示为 S。

使用 chmod g+s 文件或目录 或 chmod 2775 目录(八进制,用于目录)来设置。

主要用于目录。当在目录上设置 Sticky Bit 时,用户只能删除或重命名该目录内的文件,如果他们拥有该文件、拥有该目录或本身是 root 用户。这可以防止用户在 /tmp 等共享目录中删除彼此的文件。

在“其他”用户的执行权限位上用 t 表示(例如,drwxrwxrwt)。如果“其他”用户没有执行权限,则显示为 T。

$ ls -ld /tmp
drwxrwxrwt 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: staff
user::rw-
user:alice:rw- # Alice has specific rw permissions
group::r--
mask::rwx
other::r--

ACLs 提供了强大的灵活性,但也增加了复杂性。它们超出了基本权限的范围,但了解它们的存在也很重要。有关详细信息,请查阅您的系统文档(man getfacl, man setfacl)。