跳至主要內容

Chapter6 - 使用访问控制列表(ACL)控制对文件的访问

Change Lee...大约 11 分钟LinuxRHEL134

访问控制列表概念

标准Linux 文件权限可以满足绝大多数情况的要求,但它也有局限性。限制访问文件的权限也仅限授予文件所有者、单组成员或其他任何人。进程(正在运行的程序)可能不适合成为文件所属的成员,授予所有人权限则更不是理想的操作。

ACL 允许向文件分配细化权限。除标准的文件所有者、组所有者和其他文件权限之外,还可以向指定用户或指定组,以及由UID或GUID确定的用户和组授予权限。这个权限均应用相同的权限标志:r w x .

文件所有者可以在单个文件或目录上设置ACL 。新文件和子目录可以自动从父目录默认ACL(若存在)中继承ACL设置。与常规文件的访问规则相似,父目录层次结构需要至少设置其他执行权限,以便启用指定用户和指定组的访问权限。

文件系统挂载选项

文件系统挂载已经启用的ACL 支持。XFS 文件系统内置有 ACL支持。在 RHEL 7上创建的ext4 文件系统默认启用了 acl 选项,而安装红帽早期版本中创建的ext4 文件系统则可能需要通过挂载请求包含ACL 选项,或者在超级块中设置选项。

查看和解释ACL 权限

ls -l 仅输入最少的 ACL 设置详细信息

image.png
1526285537683356.png

如果由10个字符组成的权限字符串的末尾是 “+”,即表示此文件有相关联的ACL 设置 。对用户、组和其它的“rwx”标志解释如下:

  • 用户:显示用户 ACL 设置,其与标准的用户文件设置相同:rwx
  • 组:显示当前的 ACL 掩码设置,而不是组所有者设置:rw
  • 其他:显示其他 ACL 设置,其与标准的其它文件设置相同,无访问权限。

TIPS

如果使用chmod 更改具有 ACL 文件的组权限,则不会更改组所有者仅限,而是更改 ACL 掩码。如果目的是更新文件的组所有者权限,需要使用

setfacl -m g::perms file

查看文件 acl

要显示文件上的 ACL 设置 ,使用 getfacl file

image.png
1526286552326310.png
image.png
1526286628954630.png

提示

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

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

掩码条目:

image.png
1526288457208748.png

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

其它条目:

image.png
1526288467671948.png

其他或“全局”权限。所有其他的UID 和GID 均无任何权限。

查看目录 ACL

要显示目录上的 ACL 设置,使用 getfacl /direcotry:

image.png
1526288669879354.png

打开注释条目:

image.png
1526288787444516.png

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

标准 ACL 条目

image.png
1526347461483244.png

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

默认条目

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

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

image.png
1526347988908292.png

默认其它或“全局”权限,所有其它 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 目录无任何权限
上次编辑于:
贡献者: change,lichangyangccm@163.com
评论
  • 按正序
  • 按倒序
  • 按热度
Powered by Waline v3.1.3