16.8.文件系统访问控制列表 ========================= 访问控制列表(ACL)以兼容 POSIX®.1e 的方式扩展了标准 UNIX® 权限模型。这使得管理员可以使用更细化的权限模型。 FreeBSD **GENERIC** 内核为 UFS 文件系统提供了 ACL 支持。偏好编译定制内核的用户必须在他们的定制内核配置文件中加入下列选项: .. raw:: latex \diilbookstyleinputcell .. code:: shell-session options UFS_ACL 如果未编译此选项,则在尝试挂载支持 ACL 的文件系统时将显示一条警告消息——ACLs rely on extended attributes which are natively supported in UFS2.(ACL 依赖于 UFS2 中原生支持的扩展属性) 本章介绍了如何启用 ACL 支持,并提供了一些使用示例。 16.8.1.启用 ACL 支持 -------------------- ACL 是由挂载时的管理标签 ``acls`` 启用的,可以将其添加至 **/etc/fstab**\ 。也可以用 `tunefs(8) `__ 来修改文件系统标签中的超级块 ACL 标签,以实现用持久化的方式自动设置挂载时的参数。一般来说,出于几个原因,最好使用超级块标签: - 超级块标签不会被 ``mount -u`` 的重新挂载所改变,因为它需要完整的 ``umount`` 和新的 ``mount``\ 。这意味着启动后不能在根文件系统上启用 ACL。这也意味着文件系统上的 ACL 支持在系统使用时不能被改变。 - 设置超级块标签会强制始终在启用 ACL 的情况下挂载文件系统,即使没有 **fstab** 参数,设备顺序发生变化也如此。这可以防止在没有启用 ACL 的情况下意外挂载文件系统。 .. **注意** 阻止在没有启用 ACL 的情况下意外挂载是可取的,因为如果 ACL 被启用,然后被禁用,紧接着在没有刷新扩展属性的情况下重新启用,就会发生令人讨厌的事情。一般来说,一旦在文件系统上启用了 ACL,就不应该被禁用,因为所产生的文件保护措施可能与系统用户所期望的不一致,而且重新启用 ACL 可能会将以前的 ACL 重新附加到权限已经改变的文件上,导致不可预测的行为。 启用了 ACL 的文件系统将在其权限设置中显示加号(+)号: .. raw:: latex \diilbookstyleinputcell .. code:: shell-session drwx------ 2 robert robert 512 Dec 27 11:54 private drwxrwx---+ 2 robert robert 512 Dec 23 10:57 directory1 drwxrwx---+ 2 robert robert 512 Dec 22 10:20 directory2 drwxrwx---+ 2 robert robert 512 Dec 27 11:57 directory3 drwxr-xr-x 2 robert robert 512 Nov 10 11:54 public_html 在此示例中,\ **directory1**\ 、\ **directory2** 和 **directory3** 都使用了 ACL,而 **private** 和 **public_html** 则没有。 16.8.2.使用 ACL --------------- 可以用 ``getfacl`` 查看文件系统的 ACL。例如,要查看 **test** 中的 ACL 设置: .. raw:: latex \diilbookstyleinputcell .. code:: shell-session % getfacl test #file:test #owner:1001 #group:1001 user::rw- group::r-- other::r-- 要改变这个文件的 ACL 设置,须使用 ``setfacl``\ 。要从一个文件或文件系统中删除所有当前定义的 ACL,可使用 ``-k``\ 。然而,首选方法是使用 ``-b``\ ,因为它保留了 ACL 工作所需的基本参数。 .. raw:: latex \diilbookstyleinputcell .. code:: shell-session % setfacl -k test 要修改默认的 ACL 条目,请使用 ``-m``\ : .. raw:: latex \diilbookstyleinputcell .. code:: shell-session % setfacl -m u:trhodes:rwx,group:web:r--,o::--- test 在这个例子中,没有预定义的条目,因为它们已经被前一条命令删除了。这条命令恢复了默认选项,并分配了所列的选项。如果添加的用户或组在系统中不存在,将显示 ``Invalid argument`` 错误。 有关这些命令的更多可用选项的信息,请参阅 `getfacl(1) `__ 和 `setfacl(1) `__\ 。