linux: 全面讲解 ACL(访问控制列表)中的用户权限和掩码问题

192 阅读5分钟

在 Linux 和其他类 UNIX 系统中,传统的文件权限管理通过三种权限模型来控制:所有者(user)、组(group)、其他用户(others)。然而,这种权限模型在处理复杂权限需求时显得不足。为了解决这种局限性,文件系统引入了访问控制列表(Access Control List,ACL),使我们能够为不同的用户和组指定更加灵活的权限。

在学习 ACL 时,许多用户常常会忽略一个关键的概念:掩码(mask)。掩码对 ACL 的最终生效权限有重要影响。本文将详细解释 ACL 的工作原理,尤其是如何正确理解和使用掩码。

1_xz3HDfAU_uZ7WNhV7JnKtg.png

1. 基础权限模型回顾

在传统的权限模型中,每个文件或目录的权限结构如下:

  • 所有者(user):文件的拥有者。
  • 组(group):文件所属的用户组。
  • 其他用户(others):系统中除文件所有者和组以外的用户。

每种权限由三位字符表示:

  • r:表示读取权限。
  • w:表示写入权限。
  • x:表示执行权限(对于目录则表示进入权限)。

例如,rwxr-x--- 表示所有者有读取、写入和执行权限;同组用户有读取和执行权限;其他用户没有任何权限。

2. ACL 的引入

ACL 提供了更灵活的权限管理。通过 ACL,我们可以为特定用户或组分配权限,而不仅仅局限于所有者、组和其他用户。例如,我们可以为某个文件设置特定的用户有读取权限,而其他用户没有权限。

我们可以通过 getfaclsetfacl 命令来查看和设置 ACL。一个典型的 ACL 输出如下:

# file: /var/log/nginx/access.log
# owner: nginx
# group: nginx
user::rw-
user:tomcat:r--
group::---
mask::r--
other::---

这里表示:

  • 文件所有者 nginx 有读取和写入权限。
  • 用户 tomcat 有读取权限。
  • 所有组用户没有任何权限。
  • 掩码为 r--,这会影响 ACL 的实际生效权限。

3. 理解掩码(mask)

掩码是 ACL 中的关键概念,它决定了ACL权限在最终生效时的上限。掩码会与每个用户和组的权限进行比较,决定最终有效的权限。例如:

  • 如果某个用户被赋予了 rwx 权限,而掩码是 r--,那么该用户的最终权限只会是读取权限,而写和执行权限会被掩码屏蔽。
  • 掩码不会影响文件传统模式的权限,主要作用于在 ACL 中定义的特定用户和组。

从上面的 ACL 输出中可以看到:

user:tomcat:r--  # effective:---
mask::---

尽管 tomcat 用户被授予了 r-- 的权限,但由于掩码是 ---effective 实际为 ---,意味着 Tomcat 用户实际上没有权限读取文件。

4. 掩码的作用范围

掩码控制的是除了传统模式授权外的所有用户和组的权限。具体而言,掩码的作用范围包括:

  • 通过 ACL 指定的特定用户权限。
  • 通过 ACL 指定的特定组的权限。

掩码不会影响文件的所有者,组和其他用户的权限。例如:

  • 如果文件所有者的权限是 rwx,掩码不会限制所有者的这些权限。
  • 掩码也不会影响 other 的权限。

当我们设置了 ACL 条目时,掩码会根据最高权限自动调整,但掩码仍然是决定最终权限的上限。

5. 如何查看和修改掩码

查看掩码

我们可以使用 getfacl 命令查看文件的 ACL 及其掩码。例如:

getfacl /var/log/nginx/access.log

输出中会显示掩码,例如:

mask::r--

这表示当前掩码为 r--,会限制特定用户和组的权限。

修改掩码

掩码可以通过 setfacl 命令修改。例如,如果我们想让掩码允许 r-x(读取和执行),可以使用以下命令:

setfacl -m m::r-x /var/log/nginx

这将修改掩码,允许指定用户和组对文件具有读取和执行权限。执行完修改后,再次查看 ACL 时,可以看到掩码已经更新。

6. 实际案例解析

在处理某些复杂权限时,掩码的设置常常会带来困惑。以一个实际问题为例:

[root@localhost ~]# getfacl /var/log/nginx
# file: /var/log/nginx
# owner: nginx
# group: nginx
user::rwx
user:tomcat:r-x  #effective:---
group::---
mask::---
other::---

在这个例子中,尽管为用户 tomcat 设置了 r-x(读取和进入目录权限),但实际生效权限却是 ---,因为掩码的默认值(mask::---)限制了 tomcat 用户的有效权限。

通过修改掩码来允许读取和执行权限,可以解决这个问题:

setfacl -m m::r-x /var/log/nginx

修改完毕后,tomcat 用户将能够进入 /var/log/nginx 目录并读取其中的文件。

更多示例:

       # Granting an additional user read access
              setfacl -m u:lisa:r file

       # Revoking write access from all groups and all named users (using the effective rights mask)
              setfacl -m m::rx file

       # Removing a named group entry from a file's ACL
              setfacl -x g:staff file

       # Copying the ACL of one file to another
              getfacl file1 | setfacl --set-file=- file2

       # Copying the access ACL into the Default ACL
              getfacl --access dir | setfacl -d -M- dir

7. 总结

ACL 提供了灵活的权限管理方式,但掩码是一个容易被忽视却至关重要的因素。为了正确配置文件权限,我们不仅要关注用户和组的权限设置,还要确保掩码与我们期望的权限相符。

在使用 ACL 时,请注意:

  1. 掩码会影响特定用户和组的权限,但不会影响文件所有者和所所属组权限。
  2. 有效权限受掩码影响,如果掩码设置为限制性权限,即使用户或组拥有更高的权限,实际生效的权限也会被掩码降低。
  3. 正确理解和使用掩码 可以避免权限问题,确保文件的访问控制符合预期。

通过合理设置 ACL 和掩码,可以实现复杂的权限控制,满足各种业务需求。如果在权限配置过程中遇到问题,检查掩码的设置是一个非常重要的步骤。