Linux ACL详解

Linux ACL教程

ACL 的全称是 Access Control List (访问控制列表) ,一个针对文件/目录的访问控制列表。它在 UGO 权限管理的基础上为文件系统提供一个额外的、更灵活的权限管理机制。

它被设计为 UNIX 文件权限管理的一个补充。ACL 允许你给任何的用户或用户组设置任何文件/目录的访问权限。

Linux ACL详解

ACL作用

既然是作为 UGO 权限管理的补充,ACL 自然要有 UGO 办不到或者很难办到的本事,例如:

  • 可以针对用户来设置权限。
  • 可以针对用户组来设置权限。
  • 子文件/目录继承父目录的权限。

ACL类型

类型 描述
access ACL 我们可以认为每一个对象(文件/目录)都可以关联一个 ACL 来控制其访问权限,这样的 ACL 被称为 access ACL。
default ACL 目录也可以关联一个 ACL 来控制在该目录中创建的对象的默认 ACL,这样的 ACL(目录关联的 ACL)被称为 default ACL。

ACL条目

一个 ACL 由多个 ACL 条目组成。一个 ACL 条目指定一个用户或者一组用户对所关联对象的读、写、执行权限。

ACL权限与ugo权限对应关系

ACL 定义的权限是 ugo 权限的超集。

  • 文件的 owner 权限对应于 ACL 权限中的 ACL_USER_OBJ 条目。
  • 当 ACL 权限中具有 ACL_MASK 条目时,文件的 group 权限对应于 ACL 权限中的 ACL_MASK 条目。否则,当 ACL 权限中具没有 ACL_MASK 条目时,文件的 group 权限对应于 ACL 权限中的 ACL_GROUP_OBJ 条目。
  • 文件的 other 权限对应于 ACL 权限中的 ACL_OTHER_OBJ 条目。

文件的 ugo 权限总是与对应的 ACL 条目保持一致。修改文件的 ugo 权限会导致修改相关的 ACL 条目,同样的,修改这些 ACL 条目会导致修改对应的 guo 权限。

新建文件default ACL

一个文件的 access ACL 会在通过 creat()、mkdir()、mknod()、mkfifo() 和 open() 函数创建该文件时被初始化。

如果一个目录被设置了 default ACL,那么将会由文件创建函数的 mode 参数和目录的 default ACL 共通决定新文件的 ACL 权限:

  • 新的文件继承父目录的 default ACL 作为自己的 access ACL。
  • 修改与 ugo 权限对应的 access ACL 条目,使其不包含文件创建函数的 mode 参数不包含的权限。

说明:此时 umask 被忽略。

如果一个目录没有被设置 default ACL,那么将由文件创建函数的 mode 参数和 umask 共同决定新文件的 ACL 权限:

  • 新建文件的 access ACL 包含 ACL_USER_OBJ, ACL_GROUP_OBJ, 和 ACL_OTHER 条目。这些条目的权限被设置为由 umask 决定的权限。
  • 修改与 ugo 权限对应的 access ACL 条目,使其不包含文件创建函数的 mode 参数不包含的权限。

ACL文本描述格式

ACL 格式是通过两个冒号把一个 ACL 条目分为三个部分:

ACL 条目的类型:ACL 条目 qualifier:权限信息

权限信息就是用 rwx 来表示的信息,不支持某个权限的话可以使用 - 表示。当 ACL 条目的类型为 ACL_USER 或 ACL_GROUP 时,ACL 条目 qualifier 包含与 ACL 条目关联的用户和组的标识符。

当 ACL 条目的类型为其它时,ACL 条目 qualifier 为空。

Linux ACL详解总结

ACL 的全称是 Access Control List (访问控制列表) ,一个针对文件/目录的访问控制列表。它在 UGO 权限管理的基础上为文件系统提供一个额外的、更灵活的权限管理机制。