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

作为一名系统管理员,我们的首要任务是保护和确保数据不受未授权访问。我们都知道,我们可以使用一些有用的Linux命令,如chmodchownchgrp等来设置权限。然而,这些默认权限设置有一些限制,有时可能无法满足我们的需求。例如,我们不能为同一目录或文件的不同用户设置不同的权限集。因此,访问控制列表ACLs)被引入。

Linux Access Control Lists

假设有三个用户,分别是‘tecmint1’、‘tecmint2’和‘tecmint3’。他们都有一个共同的组,称为‘acl’。用户‘tecmint1’希望只有‘tecmint2’用户可以读取访问tecmint1’拥有的文件,其他任何人都不应该有任何访问权限。

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 服务器上,如果由 NFS 服务器导出的文件系统支持 ACL,并且 ACL 可以由 NFS 客户端读取,则 ACL 将由客户端系统使用。

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

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

有两种类型的ACLs:

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

访问ACL和默认ACL之间的区别:

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

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

[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-
设置默认ACLs后

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

[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”命令来设置或修改任何文件或目录的ACL。例如,给用户“tecmint1”赋予读取写入权限。

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

如何查看ACL

使用“getfacl”命令来查看任何文件或目录的ACL。例如,要查看“/tecmint1/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。

两个用户(tecmint1tecmint2),两者都有一个名为“acl”的共同辅助组。我们将创建一个由“tecmint1”拥有的目录,并将在该目录上为用户“tecmint2”提供读取执行权限。

步骤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:创建一个目录/tecmint并更改所有权为tecmint1

[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:使用tecmint1登录并在/tecmint文件夹中创建一个目录。

[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,这样“tecmint1”将拥有所有rwx权限,“tecmint2”将只对“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:现在使用其他用户“tecmint2”登录另一个终端,然后切换到“/tecmint1”目录。尝试使用“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”文件夹上授予“tecmint2执行权限,然后使用‘cd’命令查看效果。现在“tecmint2”有权限查看和改变目录,但没有写入的权限。

[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 文档

Source:
https://www.tecmint.com/secure-files-using-acls-in-linux/