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

假设有三个用户,分别是‘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 之前,请确保已安装了所需软件包。 以下是在使用 yum 或 apt-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:
- 访问ACLs: 访问ACLs用于授予任何文件或目录的权限。
- 默认ACLs: 默认ACLs用于仅在特定目录上授予/设置访问控制列表。
访问ACL和默认ACL之间的区别:
- 默认ACL只能用于目录级别。
- 在该目录中创建的任何子目录或文件将继承其父目录的ACL。另一方面,文件将继承默认ACL作为其访问ACL。
- 我们使用“-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。
两个用户(tecmint1和tecmint2),两者都有一个名为“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
参考链接
Source:
https://www.tecmint.com/secure-files-using-acls-in-linux/