命令行手册

Man » acl 手册在线 - acl 手册页的详细在线文档

🌍
acl — 访问控制列表

描述

本手册页描述了 POSIX 访问控制列表,用于为文件和目录定义更细粒度的自主访问权限。

ACL 类型

每个对象都可以看作与它关联一个 ACL,该 ACL 规范了对该对象的自主访问权限;此 ACL 被称为访问 ACL。 此外,目录可以具有与之关联的 ACL,该 ACL 规范了在目录中创建的对象所使用的初始访问 ACL;此 ACL 被称为默认 ACL。

ACL 条目

ACL 由一组 ACL 条目组成。 ACL 条目指定与关联对象相关的访问权限,针对单个用户或一组用户,这些权限由读取、写入和搜索/执行权限组合而成。

ACL 条目包含一个条目标签类型、一个可选的条目标签限定符以及一组权限。 我们使用术语限定符来表示 ACL 条目的条目标签限定符。

限定符表示用户或组的标识符,用于标签类型为 ACL_USER 或 ACL_GROUP 的条目。 标签类型不是 ACL_USER 或 ACL_GROUP 的条目没有定义的限定符。

定义了以下条目标签类型:

ACL_USER_OBJ    ACL_USER_OBJ 条目表示文件所有者的访问权限。

ACL_USER        ACL_USER 条目表示由条目的限定符标识的用户的访问权限。

ACL_GROUP_OBJ   ACL_GROUP_OBJ 条目表示文件组的访问权限。

ACL_GROUP       ACL_GROUP 条目表示由条目的限定符标识的组的访问权限。

ACL_MASK        ACL_MASK 条目表示可以由 ACL_USER、ACL_GROUP_OBJ 或 ACL_GROUP 类型的条目授予的最大访问权限。

ACL_OTHER       ACL_OTHER 条目表示不与 ACL 中的任何其他条目匹配的进程的访问权限。

当执行访问检查时,将 ACL_USER_OBJ 和 ACL_USER 条目与有效的用户 ID 进行比较。 有效的组 ID 以及所有辅助组 ID 都与 ACL_GROUP_OBJ 和 ACL_GROUP 条目进行比较。

有效的 ACL

有效的 ACL 包含恰好一个具有 ACL_USER_OBJ、ACL_GROUP_OBJ 和 ACL_OTHER 标签类型的条目。 具有 ACL_USER 和 ACL_GROUP 标签类型的条目可以在 ACL 中出现零次或多次。 包含具有 ACL_USER 或 ACL_GROUP 标签类型的条目的 ACL 必须包含恰好一个具有 ACL_MASK 标签类型的条目。 如果 ACL 不包含具有 ACL_USER 或 ACL_GROUP 标签类型的条目,则 ACL_MASK 条目是可选的。


所有用户 ID 限定符必须在所有 ACL_USER 标记类型的条目中是唯一的,并且所有组 ID 必须在所有 ACL_GROUP 标记类型的条目中是唯一的。

^ cl_get_file() 函数返回一个包含零个 ACL 条目的 ACL,作为目录的默认 ACL,如果该目录未与默认 ACL 关联。 acl_set_file() 函数也接受一个包含零个 ACL 条目的 ACL 作为目录的有效默认 ACL,表示该目录不应与默认 ACL 关联。 这等效于使用 acl_delete_def_file() 函数。

ACL 条目与文件权限位的对应关系

ACL 定义的权限是文件权限位指定权限的超集。

文件所有者、组和其他权限与特定的 ACL 条目之间存在对应关系:所有者权限对应于 ACL_USER_OBJ 条目的权限。如果 ACL 具有 ACL_MASK 条目,则组权限对应于 ACL_MASK 条目的权限。否则,如果 ACL 没有 ACL_MASK 条目,则组权限对应于 ACL_GROUP_OBJ 条目的权限。其他权限对应于 ACL_OTHER 条目的权限。

文件所有者、组和其他权限始终与相应的 ACL 条目的权限匹配。修改文件权限位会导致相关 ACL 条目的修改,修改这些 ACL 条目会导致文件权限位的修改。

对象创建和默认 ACL

文件对象的访问 ACL 在使用 creat()mkdir()mknod()mkfifo()open() 函数创建对象时初始化。如果将默认 ACL 与目录关联,则用于确定新对象的 ACL 时,将使用传递给创建文件对象的函数的模式参数和目录的默认 ACL:

新对象将其访问 ACL 作为其访问 ACL 继承自包含目录的默认 ACL。

修改与文件权限位对应的访问 ACL 条目,使其不包含未包含在模式参数中指定的权限的任何权限。

如果没有将默认 ACL 与目录关联,则用于确定新对象的 ACL 时,将使用传递给创建文件对象的函数的模式参数和文件创建掩码(参见 umask(2)):

新对象被分配一个访问 ACL,其中包含 ACL_USER_OBJ、ACL_GROUP_OBJ 和 ACL_OTHER 标记类型的条目。这些条目的权限设置为文件创建掩码指定的权限。

修改与文件权限位对应的访问 ACL 条目,使其不包含未包含在模式参数中指定的权限的任何权限。

访问检查算法

进程可以请求访问受 ACL 保护的文件对象的读取、写入或执行/搜索权限。访问检查算法确定是否允许访问该对象。


如果进程的有效用户 ID 与文件对象的拥有者用户 ID 匹配,则:

    如果 ACL_USER_OBJ 条目包含请求的权限,则授予访问权限;
    否则,拒绝访问。

否则,如果进程的有效用户 ID 与任何类型为 ACL_USER 条目的条目的限定符匹配,则:

    如果匹配的 ACL_USER 条目和 ACL_MASK 条目包含请求的权限,则授予访问权限;
    否则,拒绝访问。

否则,如果进程的有效组 ID 或任何辅助组 ID 与文件组或任何类型为 ACL_GROUP 条目的条目的限定符匹配,则:

    如果 ACL 包含 ACL_MASK 条目,则:

        如果 ACL_MASK 条目和任何匹配的 ACL_GROUP_OBJ 或 ACL_GROUP 条目包含请求的权限,则授予访问权限;
        否则,拒绝访问。

    否则(请注意,不能在没有 ACL_MASK 条目的情况下存在 ACL_GROUP 条目):

        如果 ACL_GROUP_OBJ 条目包含请求的权限,则授予访问权限;
        否则,拒绝访问。

否则,如果 ACL_OTHER 条目包含请求的权限,则授予访问权限。
否则,拒绝访问。

ACL 文本形式

定义了用于表示 ACL 的长文本形式和短文本形式。在这两种形式中,ACL 条目都表示为三个冒号分隔的字段:ACL 条目标签类型、ACL 条目限定符和自主访问权限。第一个字段包含以下条目标签类型关键字之一:

user  用户 ACL 条目指定授予文件所有者(条目标签类型 ACL_USER_OBJ)或指定用户(条目标签类型 ACL_USER)的访问权限。

group  组 ACL 条目指定授予文件组(条目标签类型 ACL_GROUP_OBJ)或指定组(条目标签类型 ACL_GROUP)的访问权限。

mask  掩码 ACL 条目指定除文件所有者的用户条目和“其他”条目之外,任何 ACL 条目可以授予的最大访问权限(条目标签类型 ACL_MASK)。

other  其他 ACL 条目指定授予不与任何用户或组 ACL 条目匹配的任何进程的访问权限(条目标签类型 ACL_OTHER)。

第二个字段包含与 ACL 条目关联的用户或组的标识符,对于条目标签类型为 ACL_USER 或 ACL_GROUP 的条目,该字段为空,对于所有其他条目也是如此。用户标识符可以是用户名或十进制形式的用户 ID 编号。组标识符可以是组名或十进制形式的组 ID 编号。

第三个字段包含自主访问权限。读、写和搜索/执行权限分别由字符 r、w 和 x 表示,顺序为从左到右。将这些字符中的每一个替换为“-”字符,以表示 ACL 条目中缺少权限。在从文本形式转换为内部表示形式时,不需要指定缺少的权限。


每个 ACL 条目的开头和结尾都允许有空格,并且在字段分隔符(冒号字符)之前和之后也可以有空格。

长文本格式

长文本格式每行包含一个 ACL 条目。此外,井号 (#) 可以用来表示注释,注释一直持续到行尾。如果 ACL_USER、ACL_GROUP_OBJ 或 ACL_GROUP ACL 条目包含 ACL_MASK 条目中没有的权限,则该条目后面会跟一个井号、字符串“effective:”以及该条目定义的有效访问权限。以下是一个长文本格式的示例:

user::rw-
user:lisa:rw-         #effective:r-
group::r-
group:toolies:rw-     #effective:r-
mask::r-
other::r-

短文本格式

短文本格式是一系列由逗号分隔的 ACL 条目,用于输入。不支持注释。条目标签类型关键字可以以完整的未缩写形式或单字母缩写形式出现。用户的缩写是 u,组的缩写是 g,掩码的缩写是 m,其他的是 o。权限最多可以包含以下字符中的一个,顺序不限:r、w、x。以下是短文本格式的示例:

u::rw-,u:lisa:rw-,g::r--,g:toolies:rw-,m::r--,o::r-
g:toolies:rw,u:lisa:rw,u::wr,g::r,o::r,m::r

理由

IEEE 1003.1e 草案 17 定义了包含标签类型 ACL_MASK 的访问控制列表,并定义了文件权限位之间的映射关系,该映射关系不是恒定的。标准工作组定义了这个相对复杂的接口,以确保符合 IEEE 1003.1 (“POSIX.1”) 的应用程序在具有 ACL 的系统上仍然能够正常工作。IEEE 100.1e 草案 17 在第 B.23 节中包含了选择该接口的理由。

文件实用程序的更改

在支持 ACL 的系统上,文件实用程序 ls(1)、cp(1) 和 mv(1) 的行为会发生以下变化:

对于具有默认 ACL 或访问 ACL 的文件,如果该 ACL 包含多于三个必需的 ACL 条目,则 ls(1) 实用程序在长格式输出(由 ls -l 产生)中会在权限字符串后显示一个加号 (+)。

如果指定了 -p 标志,则 cp(1) 实用程序也会保留 ACL。如果这不可能,则会产生一个警告。

mv(1) 实用程序始终保留 ACL。如果这不可能,则会产生一个警告。

chmod(1) 实用程序和 chmod(2) 系统调用对访问 ACL 的影响在“ACL 条目与文件权限位之间的对应关系”中描述。

标准

IEEE 1003.1e 草案 17 (“POSIX.1e”) 文档描述了 IEEE 100.1 标准的几个安全扩展。虽然对 1003.1e 的工作已经停止,但许多类 UNIX 系统都实现了 POSIX.1e 草案 17 或早期草案的部分内容。


Linux 访问控制列表实现了 POSIX.1e 中定义的完整访问控制列表函数和实用程序,以及一些扩展。 该实现完全符合 POSIX.1e 草案 17;扩展内容已明确标出。 访问控制列表操作函数定义在 ACL 库(libacl,-lacl)中。 POSIX 兼容接口声明在 头文件中。 Linux 特定的函数扩展声明在 头文件中。

注意事项

拒绝权限和 Linux 用户命名空间

虽然可以使用 ACL 根据进程所属的组来拒绝进程的权限,但这被认为是一种不好的做法。 具有特权助手的程序,例如 newuidmap(1),可以授予非特权进程访问 setgroups(2) 系统调用的权限,从而允许它们放弃辅助组的成员资格,并使基于该成员资格的限制失效。 有关更多详细信息,请参阅 user_namespaces(7)。

另请参阅

chmod(1), creat(2), getfacl(1), ls(1), mkdir(2), mkfifo(2), mknod(2), mount(8), open(2), setfacl(1), stat(2), umask(1)

POSIX 1003.1e 草案 17

https://wt.tuxomania.net/publications/posix.1e/download.html

POSIX 1003.1e 按类别划分的函数

ACL 存储管理 acl_dup(3), acl_free(3), acl_init(3)

ACL 条目操作 acl_copy_entry(3), acl_create_entry(3), acl_delete_entry(3), acl_get_entry(3), acl_valid(3)

acl_add_perm(3), acl_calc_mask(3), acl_clear_perms(3), acl_delete_perm(3),
acl_get_permset(3), acl_set_permset(3)

acl_get_qualifier(3), acl_get_tag_type(3), acl_set_qualifier(3), acl_set_tag_type(3)

对象上的 ACL 操作 acl_delete_def_file(3), acl_get_fd(3), acl_get_file(3), acl_set_fd(3), acl_set_file(3)

ACL 格式转换 acl_copy_entry(3), acl_copy_ext(3), acl_from_text(3), acl_to_text(3), acl_size(3)

POSIX 1003.1e 按可用性划分的函数

第一组函数在大多数具有类 POSIX 访问控制列表的系统上受支持,而第二组函数在较少的系统上受支持。 对于将移植到其他系统的应用程序,最好避免使用第二组。

acl_delete_def_file(3), acl_dup(3), acl_free(3), acl_from_text(3), acl_get_fd(3),
acl_get_file(3), acl_init(3), acl_set_fd(3), acl_set_file(3), acl_to_text(3), acl_valid(3)

acl_add_perm(3), acl_calc_mask(3), acl_clear_perms(3), acl_copy_entry(3), acl_copy_ext(3),
acl_copy_int(3), acl_create_entry(3), acl_delete_entry(3), acl_delete_perm(3), acl_get_entry(3),
acl_get_permset(3), acl_get_qualifier(3), acl_get_tag_type(3), acl_set_permset(3),
acl_set_qualifier(3), acl_set_tag_type(3), acl_size(3)

Linux 扩展

以下非可移植的扩展在 Linux 系统上可用。

acl_check(3), acl_cmp(3), acl_entries(3), acl_equiv_mode(3), acl_error(3), acl_extended_fd(3),
acl_extended_file(3), acl_extended_file_nofollow(3), acl_from_mode(3), acl_get_perm(3),
acl_to_any_text(3)

作者

Andreas Gruenbacher, <_>