网站搜索

在 Linux 中使用 ACL(访问控制列表)保护文件/目录的安全


作为系统管理员,我们的首要任务是保护数据免遭未经授权的访问。我们都知道使用一些有用的 Linux 命令设置的权限,例如 chmodchownchgrp... 等。但是,这些默认权限集合有一些限制,有时可能无法满足我们的需要。例如,我们不能为不同的用户对同一个目录或文件设置不同的权限集。因此,实施了访问控制列表ACL)。

假设您有三个用户:“howtoing1”、“howtoing2”和“howtoing3”。每个具有共同组的人都说“acl”。用户“howtoing1”希望只有“howtoing2”用户可以读取访问”拥有的文件howtoing1',其他人不应该有任何访问权限。

ACL访问控制列表)允许我们执行相同的操作。这些 ACL 允许我们向用户以及不在用户组列表中的任何用户的任何组授予权限。

注意:根据 Redhat 产品文档,它为 ext3 文件系统和 NFS 导出文件系统提供 ACL 支持。

如何检查 Linux 系统中的 ACL 支持

在继续之前,您应该在当前内核和已安装的文件系统上支持 ACL。

1. 检查内核是否支持 ACL

运行以下命令检查文件系统的 ACL 支持和 POSIX_ACL=Y 选项(如果有 N 而不是 Y,则表示内核不支持ACL,需要重新编译)。

[root@linux ~]# grep -i acl /boot/config*

CONFIG_EXT4_FS_POSIX_ACL=y
CONFIG_REISERFS_FS_POSIX_ACL=y
CONFIG_JFS_POSIX_ACL=y
CONFIG_XFS_POSIX_ACL=y
CONFIG_BTRFS_FS_POSIX_ACL=y
CONFIG_FS_POSIX_ACL=y
CONFIG_GENERIC_ACL=y
CONFIG_TMPFS_POSIX_ACL=y
CONFIG_NFS_V3_ACL=y
CONFIG_NFSD_V2_ACL=y
CONFIG_NFSD_V3_ACL=y
CONFIG_NFS_ACL_SUPPORT=m
CONFIG_CIFS_ACL=y
CONFIG_9P_FS_POSIX_ACL=y

2. 检查所需的包

在开始使用 ACL 之前,请确保您已安装所需的软件包。以下是需要使用 yumapt-get 安装的必需软件包。

[root@linux ~]# yum install nfs4-acl-tools acl libacl		[on RedHat based systems]
[tecmint@linux ~]$ sudo apt-get install nfs4-acl-tools acl	[on Debian based systems]

3. 检查已安装文件系统的 ACL 支持

现在,检查挂载的文件系统是否使用ACL选项挂载。我们可以使用'mount'命令来检查,如下所示。

[root@linux ~]# mount  | grep -i root

/dev/mapper/fedora-root on / type ext4 (rw,relatime,data=ordered)

但在我们的例子中,默认情况下它不显示 acl。因此,接下来我们可以选择使用 acl 选项再次重新挂载已挂载的分区。但是,在继续之前,我们还有另一个选项来确保分区是否使用 acl 选项安装,因为对于最近的系统,它可能与默认安装选项集成。

[root@linux ~]# tune2fs -l /dev/mapper/fedora-root | grep acl

Default mount options:    user_xattr acl

在上面的输出中,您可以看到默认挂载选项已经支持 acl。另一种选择是重新安装分区,如下所示。

[root@linux ~]# mount -o remount,acl /

接下来,将以下条目添加到“/etc/fstab”文件中以使其永久化。

/dev/mapper/fedora-root /	ext4    defaults,acl 1 1

再次重新安装分区。

[root@linux ~]# mount -o remount  /

4.对于NFS服务器

在NFS服务器上,如果NSF服务器导出的文件系统支持ACL,并且ACL可以被NFS客户端读取,则ACL被客户端系统使用。

要禁用 NFS 共享上的 ACL,您必须在 NFS 服务器上的“/etc/exportfs”文件中添加选项“no_acl”。要在 NSF 客户端再次禁用它,请在安装时使用“no_acl”选项。

如何在 Linux 系统中实现 ACL 支持

有两种类型的ACL

  1. 访问 ACL:访问 ACL 用于授予对任何文件或目录的权限。
  2. 默认 ACL:默认 ACL 仅用于在特定目录上授予/设置访问控制列表。

访问ACL和默认ACL的区别:

  1. 默认 ACL 只能在目录级别使用。
  2. 在该目录中创建的任何子目录或文件都将从其父目录继承 ACL。另一方面,文件继承默认 ACL 作为其访问 ACL。
  3. 我们使用“-d”来设置默认 ACL,默认 ACL 是可选的。
设置默认 ACL 之前

要确定特定文件或目录的默认 ACL,请使用“getfacl”命令。在下面的示例中,getfacl 用于获取文件夹“Music”的默认 ACL。

[root@linux ~]# getfacl Music/

file: Music/
owner: root
group: root
user::rwx
group::r-x
other::r-x
default:user::rwx
default:group::r-x
default:other::rw-
设置默认 ACL 后

要设置特定文件或目录的默认 ACL,请使用“setfacl”命令。在下面的示例中,setfacl 命令将在文件夹“音乐”上设置新的 ACL(读取执行)强>。

[root@linux ~]# setfacl -m d:o:rx Music/
[root@linux ~]# getfacl Music/
file: Music/
owner: root
group: root
user::rwx
group::r-x
other::r-x
default:user::rwx
default:group::r-x
default:other::r-x

如何设置新的 ACL

使用“setfacl”命令对任何文件或目录进行设置或修改。例如,向用户“howtoing1”授予读取写入权限。

setfacl -m u:tecmint1:rw /tecmint1/example

如何查看 ACL

使用“getfacl”命令查看任何文件或目录的 ACL。例如,要查看“/howtoing1/example”上的 ACL,请使用以下命令。

getfacl /tecmint1/example

file: tecmint1/example/
owner: tecmint1
group: tecmint1
user::rwx
user:tecmint1:rwx
user:tecmint2:r--
group::rwx
mask::rwx
other::---

如何删除 ACL

为了从任何文件/目录中删除 ACL,我们使用 x b 选项,如下所示。

setfacl -x ACL file/directory  	# remove only specified ACL from file/directory.

setfacl -b  file/directory   		#removing all ACL from file/direcoty

让我们在以下场景中实现 ACL。

两个用户(howtoing1howtoing2),都有名为“acl”的公共辅助组。我们将创建一个由“howtoing1”拥有的目录,并向用户“howtoing2<”提供对该目录的读取执行权限/强>'。

第 1 步:创建两个用户并删除两个用户的密码

[root@linux ~]# for user in tecmint1 tecmint2

> do
> useradd $user
> passwd -d $user
> done
Removing password for user tecmint1.
passwd: Success
Removing password for user tecmint2.
passwd: Success

第 2 步:创建一个组并将用户添加到辅助组。

[root@linux ~]# groupadd acl
[root@linux ~]# usermod -G acl tecmint1
[root@linux ~]# usermod -G acl tecmint2

第 3 步: 创建目录 /howtoing 并将所有权更改为 howtoing1

[root@linux ~]# mkdir /tecmint1
[root@linux ~]# chown tecmint1 /tecmint1/
[root@linux ~]# ls -ld /tecmint1/

drwxr-xr-x 2 tecmint1 root 4096 Apr 17 14:46 /tecmint1/
[root@linux ~]# getfacl /tecmint1

getfacl: Removing leading '/' from absolute path names
file: tecmint1
owner: tecmint1
group: root
user::rwx
group::r-x
other::r-x

第4步:使用howtoing1登录并在/howtoing文件夹中创建一个目录。

[tecmint@linux ~]$ su - tecmint1

Last login: Thu Apr 17 14:49:16 IST 2014 on pts/4
[tecmint1@linux ~]$ cd /tecmint1/
[tecmint1@linux tecmint1]$ mkdir example
[tecmint1@linux tecmint1]$ ll

total 4
drwxrwxr-x 2 tecmint1 tecmint1 4096 Apr 17 14:50 example
[tecmint1@linux tecmint1]$ whoami 
tecmint1

第5步:现在使用'setfacl'设置ACL,以便'howtoing1'将拥有所有rwx权限, “howtoing2”对“example”文件夹仅具有读取权限,其他文件夹则没有任何权限。

setfacl -m u:tecmint1:rwx example/
setfacl -m u:tecmint2:r-- example/
setfacl -m  other:--- example/
getfacl example/

file: example
owner: tecmint1
group: tecmint1
user::rwx
user:tecmint1:rwx
user:tecmint2:r--
group::r-x
mask::rwx
other::---

第 6 步: 现在使用其他用户(即另一个终端上的“howtoing2”)登录,并将目录更改为“/howtoing1”。现在尝试使用“ls”命令查看内容,然后尝试更改目录并查看差异,如下所示。

[tecmint@linux ~]$ su - tecmint2

Last login: Thu Apr 17 15:03:31 IST 2014 on pts/5
[tecmint2@linux ~]$ cd /tecmint1/
[tecmint2@linux tecmint1]$ ls -lR example/
example/:
total 0
[tecmint2@linux tecmint1]$ cd example/

-bash: cd: example/: Permission denied
[tecmint2@linux tecmint1]$ getfacl example/

file: example
owner: tecmint1
group: tecmint1
user::rwx
user:tecmint1:rwx
user:tecmint2:r--
group::rwx
mask::rwx
other::---

第 7 步: 现在向“example”文件夹上的“howtoing2”授予“执行”权限,然后使用 'cd'命令查看效果。现在“howtoing2”拥有查看和更改目录的权限,但没有写入任何内容的权限。

[tecmint1@linux tecmint1]$ setfacl -m u:tecmint2:r-x example/
[tecmint1@linux tecmint1]$ getfacl example/

file: example
owner: tecmint1
group: tecmint1
user::rwx
user:tecmint1:rwx
user:tecmint2:r-x
group::rwx
mask::rwx
other::---
[tecmint@linux ~]$ su - tecmint2

Last login: Thu Apr 17 15:09:49 IST 2014 on pts/5
[tecmint2@linux ~]$ cd /tecmint1/
[tecmint2@linux tecmint1]$ cd example/
[tecmint2@linux example]$ getfacl .
[tecmint2@linux example]$ mkdir test

mkdir: cannot create directory ‘test’: Permission denied
[tecmint2@linux example]$ touch test

touch: cannot touch ‘test’: Permission denied

注意:实施 ACL 后,您将在“ls –l”输出中看到一个额外的“+”符号,如下所示。

[root@linux tecmint1]# ll

total 4
drwxrwx---+ 2 tecmint1 tecmint1 4096 Apr 17 17:01 example

参考链接

ACL 的文档