Chapter6 - 使用访问控制列表(ACL)控制对文件的访问
访问控制列表概念
标准Linux 文件权限可以满足绝大多数情况的要求,但它也有局限性。限制访问文件的权限也仅限授予文件所有者、单组成员或其他任何人。进程(正在运行的程序)可能不适合成为文件所属的成员,授予所有人权限则更不是理想的操作。
ACL 允许向文件分配细化权限。除标准的文件所有者、组所有者和其他文件权限之外,还可以向指定用户或指定组,以及由UID或GUID确定的用户和组授予权限。这个权限均应用相同的权限标志:r w x
.
文件所有者可以在单个文件或目录上设置ACL 。新文件和子目录可以自动从父目录默认ACL(若存在)中继承ACL设置。与常规文件的访问规则相似,父目录层次结构需要至少设置其他执行权限,以便启用指定用户和指定组的访问权限。
文件系统挂载选项
文件系统挂载已经启用的ACL 支持。XFS 文件系统内置有 ACL支持。在 RHEL 7上创建的ext4 文件系统默认启用了 acl 选项,而安装红帽早期版本中创建的ext4 文件系统则可能需要通过挂载请求包含ACL 选项,或者在超级块中设置选项。
查看和解释ACL 权限
ls -l
仅输入最少的 ACL 设置详细信息

如果由10个字符组成的权限字符串的末尾是 “+”,即表示此文件有相关联的ACL 设置 。对用户、组和其它的“rwx”标志解释如下:
- 用户:显示用户 ACL 设置,其与标准的用户文件设置相同:rwx
- 组:显示当前的 ACL 掩码设置,而不是组所有者设置:rw
- 其他:显示其他 ACL 设置,其与标准的其它文件设置相同,无访问权限。
TIPS
如果使用chmod 更改具有 ACL 文件的组权限,则不会更改组所有者仅限,而是更改 ACL 掩码。如果目的是更新文件的组所有者权限,需要使用
setfacl -m g::perms file
查看文件 acl
要显示文件上的 ACL 设置 ,使用 getfacl file


提示
#前三行是注释,用于识别文件名、所有者(student)、和组所有者(controller).如果存在任何其它文件标志(如 setuid 或 setgid ),则会出现第四行注释来显示所设置的标志。

- 文件所有者权限。student 具有 rwx 。
- 指定用户权限。与此文件相关联的每位指定用户均有一个条目。james 不具有任何权限。
- 指定用户权限。UID 1005 具有 rwx ,但是掩码将有效权限限制为rw
掩码条目:

掩码设置显示可能为所有指定用户、组所有者和指定组提供的最大权限 。 UID 1005 、controller 和 GID 2210 无法执行此文件,即便每个条目增均已经设置执行权限。
其它条目:

其他或“全局”权限。所有其他的UID 和GID 均无任何权限。
查看目录 ACL
要显示目录上的 ACL 设置,使用 getfacl /direcotry:

打开注释条目:

前三行是注释,用于识别目录名、所有者(student)和组所有者(controller)。如果存在任何其他目录标志(如 setuid,setgid,sticky),则会出现第四行注释来显示所设置的标志(示例为 setgid)
标准 ACL 条目

此目录上的 ACL 权限与前述文件示例中的相同,但适用于目录。其关键区别在于这些条目包含了执行权限(适用时),以允许目录搜索权限
默认条目

- 默认文件所有者 ACL 权限。 文件所有者将获得 rwx ,并在新子目录上执行操作
- 默认指定用户 ACL 权限,每位指定用户均有一个条目,他们将自动获得应用到新文件或子目录的默认ACL ,james 始终默认设置为没有任何权限

默认掩码设置显示可能为所有新建文件或目录,(其具有指定用户 ACL 、组所有者 ACL 或指定组 ACL )提供的初始最大权限: 读取和写入新文件,对新子目录的执行权限,但是新文件永远不可获得执行权限。

默认其它或“全局”权限,所有其它 UID 和 GID 对新文件或新子目录均没有任何权限。
上述示例中的默认条目不包括指定用户 ( UID 1005)和指定组(GID 2210),因此,它们不会自动获得添加至任何新文件或新子目录的初始 ACL 条目。这会有效的将他们限制在其已具有 ACL 的文件和子目录中,或者限制在相关文件所有者后来使用 setfacl 添加了 ACL 的文件和子目录。这些条目仍可创建自己的文件和子目录。
TIPS
getfacl 中的输出可用作 setfacl 的输入。使用 getfacl -R /directory
生成目录及其内容的输出,通过将此输出传递给 setfacl –set-file=file
进行批量更新,可保存此输出并可用于日后恢复。
ACL 掩码
ACL 掩码定义可授予指定用户、组所有者和指定组的最大权限。它不限制文件所有者或其他用户的权限。所有实施 ACL 的文件和目录都将具有ACL 掩码。
可使用 getfacl
查看掩码,并通过 setfacl
显示设置掩码。如果未显式设置,系统会自动计算并添加掩码;但也可从父目录默认掩码设置中继承掩码。默认情况下,每当添加、修改或删除任何受影响的 ACL 时,均会重新计算掩码。
ACL 权限优先级
在决定一个进程(正在运行的程序)能否访问文件时,将按如下所示应用文件权限和 ACL :
- 如果正在以文件所有者身份运行进程,则应用文件的用户 ACL 权限。
- 如果正在以指定用户 ACL 条目中列出的用户身份运行进程,则应用指定用户 ACL 权限(只要掩码允许)
- 如果正在以与文件的组所有者相匹配的组身份运行进程,或者以具有显式指定组 ACL 条目的组身份运行进程,则应用相匹配的 ACL 权限(只要掩码允许 )
- 否则,将应用文件的其它 ACL 权限。
使用 ACL 保护文件安全
更改 ACL 文件权限
使用 setfacl 添加、修改或删除文件和目录的标准 ACL
ACL 采用普通的权限文件系统表示法:rwx (读、写、执行),“-”表示缺少相关权限。X(大写) 表示如果文件还没有相关的执行权限,则只设置目录的执行权限,用户同 chmod
添加或修改 ACL 权限
可以使用 -m 通过合作行设置,或者使用 -M(使用“-”(短划线),而不使用 stdin 的文件名)通过文件传递 ACL 。这两个选项会为文件或目录添加新的 ACL 条目,或替换特定的现在 ACL 条目。文件或目录的任何其它现在 ACL 条目不变
使用 –set 或 –set-file 选项来完全替换文件的 ACL 设置
首次定义文件的 ACL 时,如果添加操作不包含文件所有者、组所有者或其它权限的设置,则系统会基于当前标准文件权限来设置以上权限的设置(这些设置也称为基础 ACL ,且无法删除),系统也会计算并添加新掩码值。
要添加或修改用户 ACL 或指定用户 ACL :
setfacl -m u:name:rX file
如果 name 留空,则它适用于文件所有者,否则 name 可以是用户名或 UID 值。在本例中,授予权限为只读和执行(需要文件所属组有执行权限)(除非 file 为目录,此时目录设置执行权限,以允许进程目录搜索)
ACL 文件所有者和标准文件所有者权限相同,因此使用chmod 设置所有者权限对 ACL 没有任何影响
要添加或修改组 ACL 或指定组 ACL
setfacl -m g:name:rw file
与添加或修改用户 ACL 的模式相同,如果 name 留空,则它适用于所有者。否则请指定组名或 GID 值。
对于具有 ACL 设置的谁的, chmod 的对任何组权限都没有影响,但会更新 ACL 掩码。
要添加或修改其它 ACL
setfacl -m o::- file
其它 ACL 仅接受权限设置,权限通常为 “-”即无权限,或者指定任何标准权限 rwx
ACL 其它权限及标准其他权限相同,因此使用其它权限中的 chmod 等于使用其它权限中的 setfacl
通过一条命令添加多个条目,并以逗号分隔各个条目
setfacl -m u::rwx,g:sodor:rX,o::- file
使用 getfacl 作为输入
getfacl 的输出作为 setfacl 输入
getfacl file-A | setfacl --set-file=- file-B
# --set-file 接受文件或 stdin 中的输入,‘-’指定了 stdin 的使用。在此例中,file-B 和 file-A 设置相同。
设置明确的 ACL 掩码
可以明确设置文件或目录的 ACL 掩码,以限制指定用户、组所有者和指定组的最大有效权限。限制超出掩码的权限。
setfacl -m m::r file
该操作会设置 ACL 的掩码值为只读权限,此设置不影响所有者和其它用户。
getfacl 时会在受掩码设置限制的条目旁边显示 “注释”
TIPS:
默认情况下,每当修改或删除受影响的 ACL 设置(指定用户、组所有者或指定组)时系统都会重新计算 ACL 掩码,进而可能重新设置上一个明确的掩码设置。
为避免重新计算掩码,请使用 -n ,或者将掩码设置 ( -m m::perms) 包含在会修改受掩码影响的 ACL 设置的任何 setfacl 操作中。
递归 ACL 修改,使用 -R 选项
setfacl -R -m u:name:rX directory
#该操作会将用户name 添加到 directory 和所有文件和子目录中,从而授予只读和条件执行权限。
删除 ACL
无需指定 ":perms(权限)" 外,删除特定 ACL 条目与修改操作的基本形式相同。
setfacl -x u:name,g:name file
该操作只会从文件或目录 ACL 列表中删除指定用户和指定组。任何其它现有 ACL 均保持活动。可以在同一 setfacl 操作中使用删除 (-x) 和 修改 (-m)操作。
掩码只能在未设置其它 ACL (无法删除的基础 ACL 除外)的情况下删除。因此必须最后删除。文件不再有 ACL ,并且 ls -l 不会在权限字符串旁边显示 “+” 符号。要删除文件或目录的所有 ACL (包括目录的默认 ACL )使用:
setfacl -b file
控制默认 ACL 文件权限
目录可以设置默认 ACL ,这些 ACL 会由所有新文件和新子目录自动继承,可以针对各个标准 ACL 设置来设置默认 ACL 权限,其中包括默认掩码
目录仍然需要具备标准 ACL 才能进程访问权限控制,因为默认 ACL 不会对目录实施访问权限控制;他们仅提供 ACL 权限继承支持。
setfacl -m d:u:name:rx directory
该命令会添加一个默认的指定用户(d:u:name),该用户拥有对子目录的只读和执行权限。
用于为各个 ACL 类型添加默认 ACL 的 setfacl 命令与用于标准 ACL 的命令完全相同,但是以 "d:" 开关,或者在命令行使用 "-d" 选项。
TIPS:
设置目录默认 ACL 时,需要在默认 ACL 中包含执行权限(X)来确保用户可以访问子目录.
用户不会自动设置对新文件的常规文件执行权限,新常规文件的掩码为rw-
新文件和新子目录会继续从创建用户设置自己的 UID 和主要组 GID 值,不过当父目录 setgid 标志启用时除外,这种情况下,主要组 GID 与 父目录 GID 相同。
删除默认 ACL
setfacl -x d:u:name directory
setfacl -k /directory #删除目录的所有默认 ACL
setfacl -b /directory #删除目录的所有 ACL
setfacl -Rm g:sodor:rwX /shares/steamies #递归授予sodor组 读取、写入、条件执行权限。(仅针对目录和现有可执行文件)
setfacl -Rm u:james:- /shares/steamies #递归授予 james 无任何权限
setfacl -m d:g:sodor:rwx /shares/steamies #添加sodor 组默认访问规则,steamies 目录的读取、写入、执行权限
setfacl -m d:u:james:- /share/steamies #添加用户james 对steamies 目录无任何权限