认证目标4.02 访问控制列表及其他

曾经有一个时期,用户对其他用户的文件都有读权限。但是默认情况下,用户只是对自己目录中的文件有权限。利用访问控制列表(ACL)可以把自己主目录中特定文件的读、写入和执行权限分配给特定用户。它提供了第二级的自主访问控制,这种方法可以覆盖标准的ugo/rwx权限。

严格地说,普通的ugo/rwx权限是第一级自主访问控制。换言之,ACL是从本章前面提到的所有权和权限开始的,后面读者马上就会看到这一切如何用ACL命令显示。

为配置ACL,需要先用acl选项挂载正确的文件系统。接下来要在相关的目录上设置执行权限。只有这样,我们才可以配置ACL表,给特定的用户分配所需要的权限。

ext4和XFS文件系统,以及网络文件系统(Network File System, NFS)版本4支持ACL。

4.2.1 getfacl命令

假设已经安装acl程序包,则我们可以使用getfacl命令,它显示一个文件的当前ACL。例如,下面这个命令显示/root目录中anaconda-ks.cfg文件的当前权限和ACL。

        [root@server1~]# getfacl anaconda-ks.cfg
        # file: anaconda-ks.cfg
        # owner: root
        # group: root
        user::rw-
        group::---
        other::---

执行ls -l /root/anaconda-ks.cfg命令。你应该知道此输出结果中的每个元素,因为anaconda-ks.cfg文件中不设置ACL, getfacl命令仅显示标准权限和所有权。稍后将要添加的ACL表是以它为基础的。但首先要使一个文件系统成为第二级ACL的友好系统。

4.2.2 使文件系统成为ACL友好系统

RHEL 7使用XFS文件系统。在RHEL 7上创建XFS或ext2/ext3/ext4文件系统时,默认启用ACL。另一方面,在更早版本的Red Hat上创建ext2、ext3和ext4文件系统可能不会自动启用对ACL的支持。

实际经验

为验证在分区设备(如dev/sda1)上,ext2/ext3/ext4文件系统是否默认启用了acl挂载选项,可以执行命令tune2fs -l/dev/sda1。记住,在RHEL 7上创建的XFS文件系统和所有ext文件系统都默认启用ACL支持。因此,只有在较早的Red Hat企业版Linux上创建ext文件系统时,或者在已经显式删除acl选项的ext2/ext3/ext4文件系统中,才需要使用acl选项挂载文件系统。


如果想要在没有配置acl挂载选项的文件系统上启用ACL,则可以正确地重新挂载现有的分区。例如,通过执行下面的命令,我们可以使用ACL重新挂载/home分区:

        # mount -o remount -o acl /home

为保证它就是下次重新启动时/home的挂载方式,编辑/etc/fstab文件。根据前面的命令,如果/home采用ext4格式,可能会包含如下一行内容:

        /dev/sda3    /home    ext4      defaults, acl     1,2

修改了/etc/fstab文件后,用下面的命令启动该文件:

        # mount -o remount /home

为验证/home文件已经用acl选项挂载,单独执行mount命令,不要带任何开关选项,就会看到如下所示的输出结果:

        /dev/sda3 on /home type ext4(rw, acl)

现在我们就用ACL命令对需要的文件和目录设置访问控制列表。

4.2.3 管理文件的ACL

有了一个正确挂载的文件系统和合适的权限,我们就可以管理系统上的ACL。为了查看当前ACL,执行getfacl filename 命令。例如,我们已在/home/examprep目录中创建了一个名为TheAnswers的文本文件。下面是getfacl /home/examprep/TheAnswers命令的输出结果:

        # file home/examprep/TheAnswers
        # owner: examprep
        # group: proctors
        user::rw-
        group::r--
        other::---

注意,TheAnswers文件属于examprep用户和proctors组所有。此用户所有者具有读、写权限,组所有者对此文件有读权限。也就是说,examprep用户可以读取和修改Answers文件,而proctors组中的成员可以读TheAnswers文件。

现在假设你是该系统的root用户或者examprep用户,则可以用setfacl命令为作者之一(用户michael)给名为TheAnswers的文件分配ACL。例如,下面的命令允许miachel拥有该文件的读、写和执行权限:

        # setfacl -m u:michael:rwx /home/examprep/TheAnswers

这个命令修改了该文件的ACL,修改(-m)michael用户的ACL,给他分配了该文件的读、写和执行权限。为了验证此命令的执行结果,对该文件执行getfacl命令后得到如图4-2所示的结果。

图4-2 TheAnswers文件的ACL

但当我们用michael的用户账户访问这个文件时却不成功。实际上,当我们用vi文本编辑器访问这个文件时,它提示/home/examprep/TheAnswers文件是一个新文件。接下来它拒绝保存所有对这个文件的修改。

在/home/examprep目录的文件可以访问之前,管理员用户需要修改这个目录的权限或ACL设置。在修改一个目录的自主访问控制之前,我们先来介绍几个不同的setfacl命令选项。

其实setfacl命令名不符实际,它和-x开关选项可以用来删除ACL权限。例如,下面的命令删除前面为michael用户配置的rwx特权:

        # setfacl -x u:michael /home/examprep/TheAnswers

此外,setfacl命令也可应用于组。例如,假设存在一个teachers组,下面的命令把读权限分配给这个组中的成员:

        # setfacl -m g:teachers:r /home/examprep/TheAnswers

还可以使用setfacl命令删除指定用户的所有权限。例如,下面的命令拒绝用户michael访问/home/examprep目录:

        # setfacl -m u:michael:- /home/examprep

如果想了解ACL的工作模式,就不要删除TheAnswers文件的ACL权限,至少现在不要删除。或者如果想从头开始,则下面的命令和-b开关选项一起可以删除该文件的全部ACL记录:

        # setfacl -b /home/examprep/TheAnswers

setfacl命令的部分可用选项列在表4-5中。

表4-5 文件权限说明

有一个与其他用户有关的比较危险的选项。例如下面的命令:

        # setfacl -m o:rwx /home/examprep/TheAnswers

它允许其他用户对TheAnswers文件具有读、写和执行权限,这是通过修改此文件的主权限而完成的,这可以从ls -l/home/examprep/TheAnswers命令的输出结果中看出。-b和-x开关选项不会删除这样的修改,必须使用下面的命令:

        # setfacl -m o:- /home/examprep/TheAnswers

4.2.4 配置ACL的目录

有几种方法可使用ACL建立目录并进行文件分享。第一种方法是为其他所有用户设置普通执行位。方法之一是把下面的命令应用于上述目录:

        # chmod 701 /home/examprep

这是访问目录中文件的最简单方法。只有examprep和root用户才可以列出这个目录中的文件。只有当我们确信TheAnswers文件存在,才可以访问它。

但当我们为其他用户设置了执行位后,则任何用户只要拥有此权限,就可以访问/home/examprep目录中的文件。这会带来安全问题。任何用户?即使将文件隐藏起来,难道我们真的愿意把任何文件的真实权限分配给任何人吗?诚然,我们已经为/home/examprep目录中的TheAnswers文件(只有这个文件)建立了ACL,但是这一层的安全措施是我们自愿放弃的。

正确的方法是在/home/examprep目录上应用setfacl命令。设置共享的最安全方法是下面的命令为michael用户账户设置指定目录的ACL执行权限:

        # setfacl -m u:michael:x /home/examprep

由于examprep用户是/home/examprep目录的所有者,因此这个用户也可以执行前面的setfacl命令。

有时我们希望把这样的ACL作用于一个目录中的所有文件。此时-R开关选项可以递归地应用所有的修改。例如,下面的命令允许michael用户对/home/examprep目录以及它的任何子目录中的全部文件都有读和执行权限:

        # setfacl -R -m u:michael:rx /home/examprep

有两种方法可以取消这些选项。第一个方法是把-x开关选项用于前面的命令,同时忽略其中的权限设置:

        # setfacl -R -x u:michael /home/examprep

另一种方法是使用-b开关选项。但是这会删除为所有用户配置的对该目录具有的ACL权限(加上-R开关选项,此命令可应用于子目录):

        # setfacl -R -b /home/examprep

4.2.5 配置默认ACL

目录还可以包含一个或多个默认ACL。默认ACL的概念类似于普通ACL记录,不同之处在于,默认ACL对当前目录权限没有影响,但会被该目录内创建的文件继承。

例如,如果一个ACL将读和执行权限分配给用户michael,而我们想让/home/examprep中的所有新文件和目录继承该ACL,就可以执行下面的命令:

        # setfacl -d -m u:michael:rx /home/examprep

上面命令中的-d选项指定,当前操作适用于默认ACL。getfacl命令可显示指定目录上的标准和默认ACL:

        # getfacl /home/examprep
        getfacl: Removing leading '/' from absolute path names
        # file: home/examprep
        # owner: examprep
        # group: examprep
        user::rwx
        user:michael:--x
        group::---
        mask::--x
        other::---
        default:user::rwx
        default:user:michael:r-x
        default:group::---
        default:mask::r-x
        default:other::---

4.2.6 ACL和屏蔽位

与ACL有关的屏蔽位(Mask)可以限制指定用户和组以及组所有者对一个文件的可用权限。图4-2所示的屏蔽位是rwx,这表示它对权限没有任何限制。如果将屏蔽位设置为r,则用setfacl等命令赋予的权限只能是读权限。为把TheAnswers文件的屏蔽位改为只读,执行以下命令:

        # setfacl -m mask:r-- /home/examprep/TheAnswers

现在用getfacl /home/examprep/TheAnswers命令检查上述命令的执行结果。注意某个特定用户的记录。根据前面赋给michael用户的ACL特权,我们可以看到与图4-2的差别:

        user:michael:rwx    #effective:r--

换言之,用r--屏蔽位可以把所有特权分配给其他用户。但这个屏蔽位只可以设置读特权。

实际经验

屏蔽位只能作用于组所有者,以及指定的用户和组。它对文件的用户所有者以及“其他”权限组不起作用。

4.2.7 练习4-1:用ACL拒绝一个用户的访问

本练习可以建立ACL来拒绝普通用户对回环配置文件的访问。回环配置文件就是/etc/sysconfig/network-scripts目录中的ifcfg-lo文件。本练习假设我们已建立了一个普通用户,由于我们已经在系统上设置了michael用户,它就是本练习中的普通用户。做相应的替换。为了拒绝他对此文件的访问,要执行以下步骤:

(1)备份回环设备的当前配置文件,它就是位于/etc/sysconfig/netwok-scripts目录中的ifcfg-lo文件(提示:要用cp命令,而不是mv命令)。

(2)执行setfacl -m u:michael:- /etc/sysconfig/network-scripts/ifcfg-lo命令。

(3)检查上述命令的执行结果。分别对/etc/sysconfig/network-scripts/ifcfg-lo和它的备份目录执行getfacl命令。看看两者有什么差别。

(4)以目标用户身份登录到系统。如果当前是root管理员账户,一个方法是执行su - michael命令。

(5)用vi文本编辑器或者用cat命令查看/etc/sysconfig/network-scripts/ifcfg-lo文件。看看会出现什么现象?

(6)对备份目录中的文件重复前一个操作。看看会出现什么现象?

(7)现在对备份的ifcfg-lo文件执行cp命令,并覆盖/etc/sysconfig/network-scripts文件的当前版本(不要用mv命令)。要恢复到root用户账户。

(8)再次尝试getfacl /etc/sysconfig/network-scripts/ifcfg-lo命令,你难道没有对结果感到惊奇吗?

(9)有两个方法可以恢复ifcfg-lo文件的初始ACL配置。第一个方法是把setfacl -b命令应用于此文件。看看这个命令是否有效。可以用getfacl命令进行验证。如果已经执行其他任何命令,则它可能起作用,也可能不起作用。

(10)恢复一个文件的初始ACL配置的另一种方法是恢复备份文件,但是需要先删除/etc/sysconfig/network-scripts目录中已修改的文件,然后将备份目录中的文件复制到这里。

(11)然而,如果我们执行了步骤10,则可能还需要用下面的命令恢复文件的SELinux上下文:

        restorecon -F /etc/sysconfig/network-scripts/ifcfg-lo

本章后面将介绍有关restorecon命令的更多信息。

4.2.8 NFS共享与ACL

虽然没有证据表明Red Hat考试包含了基于NFS的ACL,但这是一个Linux管理员必须掌握的功能。因此本节的讨论只是提供几个实例,远谈不上全面。更多信息可访问nfs4-acl-tools RPM程序包安装的nfs4_acl man手册。

通常情况下,从一个共享的NFS卷中分配一个空间作为/home目录。事实上,基于NFS的ACL比标准的ACL更加精细、更加严格。这个功能最早引入到NFS版本4中,它是RHEL 7的标准。为此,nfs4_getfacl命令可以显示与共享目录中的文件有关的ACL。针对前面给出的ACL,图4-3是nfs4_getfacl命令的结果。

图4-3 NFS v4的访问控制列表

这个输出结果采用以下格式:

        type:flags:principal:permissions

参数之间用冒号分隔。简单地说,显示的两个类型(type)表示给主体(用户或组)允许(Allow, A)或拒绝(Deny, D)某个权限(permission)。图4-3中没有显示标志(flags),标志可以提供更加精细的控制。主体(principal)可以是一个普通用户或组,用小写表示。它甚至可以是一个原型用户,如OWNER文件、拥有文件的GROUP或由EVERYONE表示的其他用户。表4-6中的权限更加细化。其效果取决于处理对象是一个文件还是一个目录。

表4-6 NFSv4 ACL权限描述

第6章将介绍如何使用其他本地和网络文件系统把NFS配置为一个客户端。NFS服务器的配置属于RHCE认证目标,这将在第16章中介绍。