Skip to content

Latest commit

 

History

History
795 lines (591 loc) · 29.7 KB

File metadata and controls

795 lines (591 loc) · 29.7 KB

八、访问控制列表和共享目录管理

在前一章中,我们回顾了自主访问控制 ( 数模转换器)的基础知识。普通的 Linux 文件和目录权限设置不是很精细。有了访问控制列表 ( ACL ),我们可以只允许某个人访问一个文件,也可以允许多人访问一个文件,每个人的权限不同。我们将把我们所学的知识放在一起,以便为一个组管理一个共享目录。

本章的主题包括以下内容:

  • 为用户或组创建 ACL
  • 为目录创建继承的 ACL
  • 使用 ACL 掩码删除特定权限
  • 使用tar --acls选项防止备份过程中 ACL 丢失
  • 创建用户组并向其添加成员
  • 为组创建共享目录,并对其设置适当的权限
  • 在共享目录上设置 SGID 位和粘性位
  • 使用 ACL 只允许组中的特定成员访问共享目录中的文件

为用户或组创建 ACL

正常的 Linux 文件和目录权限设置是可以的,但是它们不是很精细。有了 ACL,我们可以只允许某个人访问一个文件或目录,也可以允许多人以每个人不同的权限访问一个文件或目录。如果我们有一个对所有人都开放的文件或目录,我们可以使用 ACL 来允许对一个组或个人进行不同级别的访问。在这一章的最后,我们将把我们所学的东西放在一起,以便为一个组管理一个共享目录。

您可以使用getfacl来查看文件或目录的 ACL。(请注意,您不能使用它们一次查看目录中的所有文件。)首先,让我们使用getfacl来查看我们是否已经在acl_demo.txt文件上设置了任何 ACL:

[donnie@localhost ~]$ touch acl_demo.txt

[donnie@localhost ~]$ getfacl acl_demo.txt
# file: acl_demo.txt
# owner: donnie
# group: donnie
user::rw-
group::rw-
other::r--

[donnie@localhost ~]$

我们在这里看到的只是正常的权限设置,所以没有 ACL。

设置 ACL 的第一步是删除除文件用户之外的所有人的所有权限。这是因为默认权限设置允许组成员拥有读/写权限,而其他成员拥有读权限。因此,在不删除这些权限的情况下设置 ACL 是相当愚蠢的:

[donnie@localhost ~]$ chmod 600 acl_demo.txt

[donnie@localhost ~]$ ls -l acl_demo.txt
-rw-------. 1 donnie donnie 0 Nov  9 14:37 acl_demo.txt
[donnie@localhost ~]$

使用setfacl设置 ACL 时,可以允许用户或组拥有读、写或执行权限的任意组合。在我们的例子中,假设我想让 Maggie 读取文件,并阻止她拥有写或执行权限:

[donnie@localhost ~]$ setfacl -m u:maggie:r acl_demo.txt

[donnie@localhost ~]$ getfacl acl_demo.txt
# file: acl_demo.txt
# owner: donnie
# group: donnie
user::rw-
user:maggie:r--
group::---
mask::r--
other::---

[donnie@localhost ~]$ ls -l acl_demo.txt
-rw-r-----+ 1 donnie donnie 0 Nov  9 14:37 acl_demo.txt
[donnie@localhost ~]$

setfacl-m选项意味着我们将要修改 ACL。(嗯,这种情况下要创建一个,不过没关系。)u:意味着我们正在为用户设置 ACL。然后,我们列出用户名,后跟另一个冒号,以及我们要授予该用户的权限列表。在这种情况下,我们只允许 Maggie 读取访问。我们通过列出要应用此 ACL 的文件来完成该命令。getfacl输出显示玛吉确实有读取权限。最后,我们在ls -l输出中看到该组被列为具有读取权限,尽管我们已经在该文件上设置了600权限设置。但是,还有一个+标志,告诉我们文件有 ACL。当我们设置一个 ACL 时,ACL 的权限在ls -l中显示为组权限。

为了更进一步,假设我希望 Frank 对该文件具有读/写权限:

[donnie@localhost ~]$ setfacl -m u:frank:rw acl_demo.txt

[donnie@localhost ~]$ getfacl acl_demo.txt
# file: acl_demo.txt
# owner: donnie
# group: donnie
user::rw-
user:maggie:r--
user:frank:rw-
group::---
mask::rw-
other::---

[donnie@localhost ~]$ ls -l acl_demo.txt
-rw-rw----+ 1 donnie donnie 0 Nov  9 14:37 acl_demo.txt
[donnie@localhost ~]$

因此,我们可以将两个或更多不同的 ACL 分配给同一个文件。在ls -l输出中,我们看到我们为该组设置了rw权限,这实际上只是我们在两个 ACL 中设置的权限的汇总。

我们可以通过将u:替换为g:来设置组访问的 ACL:

[donnie@localhost ~]$ getfacl new_file.txt
# file: new_file.txt
# owner: donnie
# group: donnie
user::rw-
group::rw-
other::r--

[donnie@localhost ~]$ chmod 600 new_file.txt

[donnie@localhost ~]$ setfacl -m g:accounting:r new_file.txt

[donnie@localhost ~]$ getfacl new_file.txt
# file: new_file.txt
# owner: donnie
# group: donnie
user::rw-
group::---
group:accounting:r--
mask::r--
other::---

[donnie@localhost ~]$ ls -l new_file.txt
-rw-r-----+ 1 donnie donnie 0 Nov  9 15:06 new_file.txt
[donnie@localhost ~]$

accounting组的成员现在可以读取该文件。

为目录创建继承的 ACL

有时,您可能希望在共享目录中创建的所有文件都具有相同的 ACL。我们可以通过对目录应用继承的 ACL 来做到这一点。尽管,请理解,尽管这听起来是一个很酷的想法,但以正常方式创建文件将导致文件具有为该组设置的读/写权限,以及为其他人设置的读权限。因此,如果您要为一个用户通常只创建文件的目录设置这个权限,您最好希望创建一个 ACL,为某人添加写或执行权限。要么这样,要么确保用户在他们创建的所有文件上设置600权限设置,假设用户确实需要限制对其文件的访问。

另一方面,如果您正在创建一个在特定目录中创建文件的 shell 脚本,您可以包含chmod命令,以确保创建的文件具有使您的 ACL 按预期工作所必需的限制性权限。

为了演示,让我们创建new_perm_dir目录,并在上面设置继承的 ACL。我希望对我的 shell 脚本在此目录中创建的文件拥有读/写权限,并且希望 Frank 只有读权限。我不希望其他任何人能够读取这些文件:

[donnie@localhost ~]$ setfacl -m d:u:frank:r new_perm_dir

[donnie@localhost ~]$ ls -ld new_perm_dir
drwxrwxr-x+ 2 donnie donnie 26 Nov 12 13:16 new_perm_dir
[donnie@localhost ~]$ getfacl new_perm_dir
# file: new_perm_dir
# owner: donnie
# group: donnie
user::rwx
group::rwx
other::r-x
default:user::rwx
default:user:frank:r--
default:group::rwx
default:mask::rwx
default:other::r-x

[donnie@localhost ~]$

我所要做的就是在u:frank之前添加d:来使其成为一个继承的 ACL。我在目录上保留了默认权限设置,允许每个人对目录进行读取访问。接下来,我将创建donnie_script.sh shell 脚本,该脚本将在该目录下创建一个文件,并将只为新文件的用户设置读/写权限:

#!/bin/bash
cd new_perm_dir
touch new_file.txt
chmod 600 new_file.txt
exit

在使脚本可执行后,我将运行它并查看结果:

[donnie@localhost ~]$ ./donnie_script.sh

[donnie@localhost ~]$ cd new_perm_dir

[donnie@localhost new_perm_dir]$ ls -l
total 0
-rw-------+ 1 donnie donnie 0 Nov 12 13:16 new_file.txt
[donnie@localhost new_perm_dir]$ getfacl new_file.txt
# file: new_file.txt
# owner: donnie
# group: donnie
user::rw-
user:frank:r-- #effective:---
group::rwx #effective:---
mask::---
other::---

[donnie@localhost new_perm_dir]$

因此,new_file.txt是用正确的权限设置和允许 Frank 读取的 ACL 创建的。(我知道这是一个非常简单的例子,但是你明白了。)

使用 ACL 掩码删除特定权限

您可以使用-x选项从文件或目录中删除 ACL。让我们回到我之前创建的acl_demo.txt文件,并删除玛吉的 ACL:

[donnie@localhost ~]$ setfacl -x u:maggie acl_demo.txt

[donnie@localhost ~]$ getfacl acl_demo.txt
# file: acl_demo.txt
# owner: donnie
# group: donnie
user::rw-
user:frank:rw-
group::---
mask::rw-
other::---

[donnie@localhost ~]$

所以,玛姬的 ACL 没了。但是,-x选项会删除整个 ACL,即使这不是您真正想要的。如果您有一个设置了多个权限的 ACL,您可能只想删除一个权限,而留下其他权限。在这里,我们看到 Frank 仍然拥有授予他读/写访问权限的 ACL。现在假设我们想要删除写权限,同时仍然允许他读权限。为此,我们需要应用一个遮罩:

[donnie@localhost ~]$ setfacl -m m::r acl_demo.txt

[donnie@localhost ~]$ ls -l acl_demo.txt

-rw-r-----+ 1 donnie donnie 0 Nov  9 14:37 acl_demo.txt
[donnie@localhost ~]$ getfacl acl_demo.txt
# file: acl_demo.txt
# owner: donnie
# group: donnie
user::rw-
user:frank:rw-            #effective:r--
group::---
mask::r--
other::---

[donnie@localhost ~]$

m::r在 ACL 上设置只读掩码。运行getfacl显示 Frank 仍然有读/写 ACL,但是旁边的注释显示他的有效权限为只读。所以,弗兰克对文件的写权限现在没有了。而且,如果我们为其他用户设置了 ACL,这个掩码也会以同样的方式影响他们。

使用 tar-ACL 选项防止备份过程中 ACL 的丢失

如果您需要使用tar来创建文件或最后两个文件的备份:

[donnie@localhost ~]$ cd perm_demo_dir
[donnie@localhost perm_demo_dir]$ ls -l
total 0
-rw-rw-r--. 1 donnie accounting 0 Nov  5 20:17 file1.txt
-rw-rw-r--. 1 donnie accounting 0 Nov  5 20:17 file2.txt
-rw-rw-r--. 1 donnie accounting 0 Nov  5 20:17 file3.txt
-rw-rw-r--. 1 donnie accounting 0 Nov  5 20:17 file4.txt
-rw-rw----+ 1 donnie donnie     0 Nov  9 15:19 frank_file.txt
-rw-rw----+ 1 donnie donnie     0 Nov 12 12:29 new_file.txt
[donnie@localhost perm_demo_dir]$

现在,我不用--acls做备份:

[donnie@localhost perm_demo_dir]$ cd
[donnie@localhost ~]$ tar cJvf perm_demo_dir_backup.tar.xz perm_demo_dir/
perm_demo_dir/
perm_demo_dir/file1.txt
perm_demo_dir/file2.txt
perm_demo_dir/file3.txt
perm_demo_dir/file4.txt
perm_demo_dir/frank_file.txt
perm_demo_dir/new_file.txt
[donnie@localhost ~]$

看起来不错,对吧?啊,但是外表是会骗人的。观察当我删除目录,然后从备份中恢复它时会发生什么:

[donnie@localhost ~]$ rm -rf perm_demo_dir/

[donnie@localhost ~]$ tar xJvf perm_demo_dir_backup.tar.xz
perm_demo_dir/
. . .
[donnie@localhost ~]$ cd perm_demo_dir/
[donnie@localhost perm_demo_dir]$ ls -l
total 0
-rw-rw-r--. 1 donnie donnie 0 Nov 5 20:17 file1.txt
-rw-rw-r--. 1 donnie donnie 0 Nov 5 20:17 file2.txt
-rw-rw-r--. 1 donnie donnie 0 Nov 5 20:17 file3.txt
-rw-rw-r--. 1 donnie donnie 0 Nov 5 20:17 file4.txt
-rw-rw----. 1 donnie donnie 0 Nov 9 15:19 frank_file.txt
-rw-rw----. 1 donnie donnie 0 Nov 12 12:29 new_file.txt
[donnie@localhost perm_demo_dir]$

我甚至不需要使用getfacl来查看 ACL 是否从perm_demo_dir目录及其所有文件中消失,因为+标志现在已经不存在了。现在,让我们看看当我包含--acls选项时会发生什么。首先,我将向您展示为此目录及其唯一文件设置了 ACL:

[donnie@localhost ~]$ ls -ld new_perm_dir
drwxrwxr-x+ 2 donnie donnie 26 Nov 13 14:01 new_perm_dir

[donnie@localhost ~]$ ls -l new_perm_dir
total 0
-rw-------+ 1 donnie donnie 0 Nov 13 14:01 new_file.txt
[donnie@localhost ~]$

现在,我将.tar--acls一起使用:

[donnie@localhost ~]$ tar cJvf new_perm_dir_backup.tar.xz new_perm_dir/ --acls
new_perm_dir/
new_perm_dir/new_file.txt
[donnie@localhost ~]$

我现在删除new_perm_dir目录,并从备份中恢复。同样,我将使用--acls选项:

[donnie@localhost ~]$ rm -rf new_perm_dir/

[donnie@localhost ~]$ tar xJvf new_perm_dir_backup.tar.xz --acls
new_perm_dir/
new_perm_dir/new_file.txt

[donnie@localhost ~]$ ls -ld new_perm_dir
drwxrwxr-x+ 2 donnie donnie 26 Nov 13 14:01 new_perm_dir

[donnie@localhost ~]$ ls -l new_perm_dir
total 0
-rw-------+ 1 donnie donnie 0 Nov 13 14:01 new_file.txt
[donnie@localhost ~]$

+符号的出现表明 ACL 确实通过了备份和恢复程序。关于这一点,一个稍微棘手的部分是您必须使用--acls进行备份和恢复。如果您两次都忽略该选项,您将丢失 ACL。

创建用户组并向其添加成员

到目前为止,我一直在自己的主目录中做所有的演示,只是为了展示基本概念。但是最终的目标是向你展示如何使用这些知识来做一些更实际的事情,比如控制文件

假设我们想为营销部门的成员创建一个marketing小组,你猜对了:

[donnie@localhost ~]$ sudo groupadd marketing
[sudo] password for donnie:
[donnie@localhost ~]$

现在让我们添加一些成员。您可以通过三种不同的方式来做到这一点:

  • 在我们创建成员的用户帐户时添加成员。
  • 使用usermod添加已经有用户账号的成员。
  • 编辑/etc/group文件。

在我们创建成员的用户帐户时添加成员

首先,我们可以使用useradd-G选项,在创建成员的用户帐户时向组中添加成员。在红帽或 CentOS 上,命令如下所示:

[donnie@localhost ~]$ sudo useradd -G marketing cleopatra
[sudo] password for donnie:

[donnie@localhost ~]$ groups cleopatra
cleopatra : cleopatra marketing
[donnie@localhost ~]$

在 Debian/Ubuntu 上,该命令如下所示:

donnie@ubuntu3:~$ sudo useradd -m -d /home/cleopatra -s /bin/bash -G marketing cleopatra

donnie@ubuntu3:~$ groups cleopatra
cleopatra : cleopatra marketing
donnie@ubuntu3:~$

当然,我需要以正常的方式给克利奥帕特拉分配一个密码:

[donnie@localhost ~]$ sudo passwd cleopatra

使用 usermod 将现有用户添加到组中

好消息是,这在红帽/CentOS 或 Debian/Ubuntu 上都是一样的:

[donnie@localhost ~]$ sudo usermod -a -G marketing maggie
[sudo] password for donnie:

[donnie@localhost ~]$ groups maggie
maggie : maggie marketing
[donnie@localhost ~]$

在这种情况下,-a是不必要的,因为玛吉不是任何其他次级群体的成员。但是,如果她已经属于另一个组,-a必须防止覆盖任何现有的组信息,从而将她从以前的组中删除。

这种方法在 Ubuntu 系统上使用特别方便,在 Ubuntu 系统中需要使用adduser来创建加密的主目录。(正如我们在上一章中所看到的,adduser在您创建帐户时没有给您机会将用户添加到组中。)

通过编辑/etc/group 文件将用户添加到组中

最后这种方法是一种很好的作弊方式,可以加快将多个现有用户添加到一个组的过程。首先,只需在您喜欢的文本编辑器中打开/etc/group文件,并寻找定义您想要添加成员的组的行:

. . .
marketing:x:1005:cleopatra,maggie
. . .

所以,我已经把克利奥帕特拉和玛吉加入了这个小组。让我们编辑它,再添加几个成员:

. . .
marketing:x:1005:cleopatra,maggie,vicky,charlie
. . .

完成后,保存文件并退出编辑器。

对他们每个人的一个groups命令将显示我们的一点点欺骗工作正常:

[donnie@localhost etc]$ sudo vim group

[donnie@localhost etc]$ groups vicky
vicky : vicky marketing

[donnie@localhost etc]$ groups charlie
charlie : charlie marketing
[donnie@localhost etc]$

每当您需要同时向组中添加许多成员时,这种方法非常方便。

创建共享目录

我们场景中的下一步是创建一个共享目录,我们市场部的所有成员都可以使用。现在,这是另一个引起一些争议的领域。有些人喜欢把共享目录放在文件系统的根目录,而有些人喜欢把共享目录放在/home目录。有些人甚至有其他偏好。但实际上,这是个人偏好和/或公司政策的问题。除此之外,你把它们放在哪里并不重要。为了简单起见,我将在文件系统的根级别创建目录:

[donnie@localhost ~]$ cd /

[donnie@localhost /]$ sudo mkdir marketing
[sudo] password for donnie:

[donnie@localhost /]$ ls -ld marketing
drwxr-xr-x. 2 root root 6 Nov 13 15:32 marketing
[donnie@localhost /]$

新目录属于根用户。它的权限设置为755,允许每个人都有读取和执行权限,并且只允许根用户有写入权限。我们真正想要的是只允许市场部的成员访问这个目录。我们将首先更改所有权和组关联,然后设置适当的权限:

[donnie@localhost /]$ sudo chown nobody:marketing marketing

[donnie@localhost /]$ sudo chmod 770 marketing

[donnie@localhost /]$ ls -ld marketing
drwxrwx---. 2 nobody marketing 6 Nov 13 15:32 marketing
[donnie@localhost /]$

在这种情况下,我们没有任何一个特定的用户想要拥有这个目录,我们也不希望根用户拥有它。因此,将所有权分配给nobody伪用户帐户为我们提供了一种处理方法。然后,我将770权限值分配给目录,该目录允许所有marketing组成员进行读/写/执行访问,同时将其他人排除在外。现在,让我们的一个小组成员登录,看看她是否可以在这个目录中创建一个文件:

[donnie@localhost /]$ su - vicky
Password:

[vicky@localhost ~]$ cd /marketing

[vicky@localhost marketing]$ touch vicky_file.txt

[vicky@localhost marketing]$ ls -l
total 0
-rw-rw-r--. 1 vicky vicky 0 Nov 13 15:41 vicky_file.txt
[vicky@localhost marketing]$

好吧,它起作用了——除了一个小问题。这份文件理应属于维基。但是,这也与维基的个人团体有关。为了对这些共享文件进行最好的访问控制,我们需要它们与marketing组相关联。

在共享目录上设置 SGID 位和粘性位

我以前告诉过你,在文件上设置 SUID 或 SGID 权限有点安全风险,尤其是在可执行文件上。但是将 SGID 放在一个共享目录中既完全安全又非常有用。

目录上的 SGID 行为与文件上的 SGID 行为完全不同。在一个目录中,SGID 将使任何人创建的任何文件与该目录关联的同一个组相关联。因此,记住 SGID 权限值是2000,让我们将 SGID 设置在我们的marketing目录中:

[donnie@localhost /]$ sudo chmod 2770 marketing
[sudo] password for donnie:

[donnie@localhost /]$ ls -ld marketing
drwxrws---. 2 nobody marketing 28 Nov 13 15:41 marketing
[donnie@localhost /]$

该组可执行位置的s表示命令成功。现在让 Vicky 重新登录,创建另一个文件:

[donnie@localhost /]$ su - vicky
Password:
Last login: Mon Nov 13 15:41:19 EST 2017 on pts/0

[vicky@localhost ~]$ cd /marketing

[vicky@localhost marketing]$ touch vicky_file_2.txt

[vicky@localhost marketing]$ ls -l
total 0
-rw-rw-r--. 1 vicky marketing 0 Nov 13 15:57 vicky_file_2.txt
-rw-rw-r--. 1 vicky vicky     0 Nov 13 15:41 vicky_file.txt
[vicky@localhost marketing]$

Vicky 的第二档跟marketing组有关联,这正是我们想要的。只是为了好玩,让查理也这么做:

[donnie@localhost /]$ su - charlie
Password:

[charlie@localhost ~]$ cd /marketing

[charlie@localhost marketing]$ touch charlie_file.txt

[charlie@localhost marketing]$ ls -l
total 0
-rw-rw-r--. 1 charlie marketing 0 Nov 13 15:59 charlie_file.txt
-rw-rw-r--. 1 vicky   marketing 0 Nov 13 15:57 vicky_file_2.txt
-rw-rw-r--. 1 vicky   vicky     0 Nov 13 15:41 vicky_file.txt
[charlie@localhost marketing]$

同样,查理的文件与marketing组相关联。但是,出于一些没人理解的奇怪原因,查理真的不喜欢维基,决定删除她的文件,只是出于纯粹的恶意:

[charlie@localhost marketing]$ rm vicky*
rm: remove write-protected regular empty file ‘vicky_file.txt’? y

[charlie@localhost marketing]$ ls -l
total 0
-rw-rw-r--. 1 charlie marketing 0 Nov 13 15:59 charlie_file.txt
[charlie@localhost marketing]$

系统抱怨 Vicky 的原始文件是写保护的,因为它仍然与她的个人组相关联。但是系统仍然允许查理删除它,即使没有 sudo 权限。而且,由于查理对第二个文件有写访问权,由于它与marketing组的关联,系统允许他毫无疑问地删除它。

好吧。因此,维基抱怨这一点,并试图让查理被解雇。但是我们勇敢的管理员有一个更好的主意。他会设置粘性位,以防止这种情况再次发生。由于 SGID 位的值为2000,粘性位的值为1000,我们可以将两者相加得到一个值3000:

[donnie@localhost /]$ sudo chmod 3770 marketing
[sudo] password for donnie:

[donnie@localhost /]$ ls -ld marketing
drwxrws--T. 2 nobody marketing 30 Nov 13 16:03 marketing
[donnie@localhost /]$

其他可执行位置的T表示粘性位已经设置。由于T是大写的,我们知道还没有设置其他人的可执行权限。设置粘性位将防止组成员删除任何其他人的文件。让维姬告诉我们当她试图报复查理时会发生什么:

[donnie@localhost /]$ su - vicky
Password:
Last login: Mon Nov 13 15:57:41 EST 2017 on pts/0

[vicky@localhost ~]$ cd /marketing

[vicky@localhost marketing]$ ls -l
total 0
-rw-rw-r--. 1 charlie marketing 0 Nov 13 15:59 charlie_file.txt

[vicky@localhost marketing]$ rm charlie_file.txt
rm: cannot remove ‘charlie_file.txt’: Operation not permitted

[vicky@localhost marketing]$ rm -f charlie_file.txt
rm: cannot remove ‘charlie_file.txt’: Operation not permitted

[vicky@localhost marketing]$ ls -l
total 0
-rw-rw-r--. 1 charlie marketing 0 Nov 13 15:59 charlie_file.txt
[vicky@localhost marketing]$

即使使用-f选项,Vicky 仍然不能删除查理的文件。Vicky 在这个系统上没有sudo特权,所以她尝试一下也没用。

使用 ACL 访问共享目录中的文件

就目前的情况来看,marketing组的所有成员对所有其他组成员的文件都有读/写权限。将对文件的访问权限限制为特定的组成员是我们已经介绍过的相同的两步过程。

设置权限和创建 ACL

首先,Vicky 将正常权限设置为

[vicky@localhost marketing]$ echo "This file is only for my good friend, Cleopatra." > vicky_file.txt

[vicky@localhost marketing]$ chmod 600 vicky_file.txt

[vicky@localhost marketing]$ setfacl -m u:cleopatra:r vicky_file.txt

[vicky@localhost marketing]$ ls -l
total 4
-rw-rw-r--. 1 charlie marketing 0 Nov 13 15:59 charlie_file.txt
-rw-r-----+ 1 vicky marketing 49 Nov 13 16:24 vicky_file.txt

[vicky@localhost marketing]$ getfacl vicky_file.txt
# file: vicky_file.txt
# owner: vicky
# group: marketing
user::rw-
user:cleopatra:r--
group::---
mask::r--
other::---

[vicky@localhost marketing]$

这里没有你没见过的东西。Vicky 刚刚删除了该组和其他人的所有权限,并设置了一个 ACL,只允许埃及艳后读取该文件。让我们看看克利奥帕特拉是否真的能读懂它:

[donnie@localhost /]$ su - cleopatra
Password:

[cleopatra@localhost ~]$ cd /marketing

[cleopatra@localhost marketing]$ ls -l
total 4
-rw-rw-r--. 1 charlie marketing 0 Nov 13 15:59 charlie_file.txt
-rw-r-----+ 1 vicky marketing 49 Nov 13 16:24 vicky_file.txt

[cleopatra@localhost marketing]$ cat vicky_file.txt
This file is only for my good friend, Cleopatra.
[cleopatra@localhost marketing]$

目前为止,一切顺利。但是,克利奥帕特拉能给它写信吗?让我们来看看:

[cleopatra@localhost marketing]$ echo "You are my friend too, Vicky." >> vicky_file.txt
-bash: vicky_file.txt: Permission denied
[cleopatra@localhost marketing]$

好吧,克利奥帕特拉不能这么做,因为维基只允许她在 ACL 中拥有读取权限。

不过,现在那个偷偷摸摸想窥探其他用户文件的查理怎么办?让我们看看查理能否做到:

[donnie@localhost /]$ su - charlie
Password:
Last login: Mon Nov 13 15:58:56 EST 2017 on pts/0

[charlie@localhost ~]$ cd /marketing

[charlie@localhost marketing]$ cat vicky_file.txt
cat: vicky_file.txt: Permission denied
[charlie@localhost marketing]$

所以,是的,确实只有克利奥帕特拉可以访问维基的文件,即使那样也只是为了阅读。

动手实验–创建共享组目录

在本实验中,您只需将本章中所学的内容整合在一起,为一个组创建一个共享目录。您可以在任何一台虚拟机上执行此操作:

  1. 在任一虚拟机上,创建sales组:
sudo groupadd sales
  1. 创建用户mimimrgraymommy,在创建帐户时将他们添加到销售组。

在 CentOS 虚拟机上,执行以下操作:

sudo useradd -G sales mimi
sudo useradd -G sales mrgray
sudo useradd -G sales mommy

在 Ubuntu 虚拟机上,执行以下操作:

sudo useradd -m -d /home/mimi -s /bin/bash -G sales mimi
sudo useradd -m -d /home/mrgray -s /bin/bash -G sales mrgray
sudo useradd -m -d /home/mommy -s /bin/bash -G sales mommy
  1. 为每个用户分配一个密码。
  2. 在文件系统的根级别创建sales目录。设置适当的所有权和权限,包括 SGID 和粘性位:
sudo mkdir /sales
sudo chown nobody:sales /sales
sudo chmod 3770 /sales
ls -ld /sales
  1. 以咪咪的身份登录,让她创建一个文件:
su - mimi
cd /sales echo "This file belongs to Mimi." > mimi_file.txt
ls -l
  1. 让咪咪在她的文件上设置一个 ACL,只允许格雷先生阅读。然后,有咪咪退出登录:
chmod 600 mimi_file.txt
setfacl -m u:mrgray:r mimi_file.txt
getfacl mimi_file.txt
ls -l
exit
  1. 让格雷先生登录,看看他能对咪咪的文件做些什么。然后,让格雷先生创建自己的文件并注销:
su - mrgray
cd /sales
cat mimi_file.txt
echo "I want to add something to this file." >>
mimi_file.txt echo "Mr. Gray will now create his own file." >
mr_gray_file.txt ls -l
exit
  1. 妈妈现在会登录并试图通过窥探其他用户的文件并试图删除它们来制造混乱:
su - mommy
cat mimi_file.txt
cat mr_gray_file.txt
rm -f mimi_file.txt
rm -f mr_gray_file.txt
exit
  1. 实验室结束。

摘要

在本章中,我们看到了如何将数模转换器提升到众所周知的下一个水平。我们首先看到了如何创建和管理 ACL,以便对文件和目录提供更细粒度的访问控制。然后,我们看到了如何为特定目的创建用户组,以及如何向其中添加成员。然后,我们看到了如何使用 SGID 位、粘性位和 ACL 来管理共享组目录。

但有时,数模转换器可能不足以完成这项工作。对于这些时间,我们还有强制访问控制,我们将在下一章中介绍。到时候见。

问题

  1. 为共享目录中的文件创建 ACL 时,您必须首先做什么才能使 ACL 有效? A .删除文件中除用户以外的所有人的所有正常权限。 B .确保文件有644设置的权限值。 C .确保组中的每个人都具有文件的读/写权限。 D .确保为文件设置了 SUID 权限。

  2. 在共享组目录上设置 SGID 权限有什么好处? A .无。这是一个安全风险,永远不应该做。 B .它防止组成员删除彼此的文件。 C .它使得在目录中创建的每个文件都与同目录相关联的组相关联。 D .它赋予任何访问目录的人与目录用户相同的权限。

  3. 在设置了 SGID 和粘性位的情况下,以下哪个命令可以为marketing共享组目录设置适当的权限? a .sudo chmod 6770 marketing b .sudo chmod 3770 marketing c .sudo chmod 2770 marketing d .sudo chmod 1770 marketing

  4. 您会使用以下哪个setfacl选项从 ACL 中删除一个特定权限? a .-xB. -r c .-w d .m: :t . e .-m f .x: :

  5. 以下哪个陈述是正确的? 答:当使用.tar时,您必须使用--acls选项来创建和提取归档文件,以便保留归档文件上的 ACL。 B .使用.tar时,您只需要使用--acls选项来创建归档文件,以便保留归档文件上的 ACL。 C .使用.tar时,ACL 会自动保留在存档文件中。 D .使用.tar时,无法保留归档文件上的 ACL。

  6. 以下哪两种方法不是将用户莱昂内尔添加到sales组的有效方法? a .sudo useradd -g sales lionel b .sudo useradd -G sales lionel c .sudo usermod -g sales lionel d .sudo usermod -G sales lionel e .手工编辑/etc/group文件。

  7. 创建继承的 ACL 时会发生什么? 答:在继承 ACL 的目录中创建的每个文件都将与该目录相关联的组相关联。 B .在继承了该 ACL 的目录中创建的每个文件都将继承该 ACL。 C .在该目录中使用继承的 ACL 创建的每个文件都将具有与该目录相同的权限设置。 D .在该目录中创建的每个文件都将设置粘性位。

  8. 您将使用以下哪个命令向用户 Frank 授予文件的只读权限? a .chattr -m u:frank:r somefile.txtT5】b .aclmod -m u:frank:r somefile.txtT6】c .getfacl -m u:frank:r somefile.txtT7】d .setfacl -m u:frank:r somefile.txt

  9. 您刚刚在共享组目录中执行了ls -l命令。您如何从中判断是否为任何文件设置了 ACL? A .设置了 ACL 的文件在权限设置的开头会有+。 B .设置了 ACL 的文件在权限设置的开头会有-。 C .设置了 ACL 的文件在权限设置的末尾会有+。 D .设置了 ACL 的文件在权限设置的最后会有-。 e .ls -l命令将显示该文件的 ACL。

  10. 您会使用以下哪一项来查看somefile.txt文件上的 ACL? a .getfacl somefile.txt b .ls -l somefile.txt c .ls -a somefile.txt d .viewacl somefile.txt

进一步阅读