如何使用setfacl和getfacl管理Linux ACL

时间:2020-03-05 15:28:39  来源:igfitidea点击:

Linux命令setfacl允许用户在文件和目录上设置广泛的访问控制列表。
通常,使用chmod命令,我们将能够为所有者/组/其他的权限设置权限。
但是,如果我们可能需要为其他用户提供文件权限,这也无法使用CHMod完成。

SetFacl将摆脱这样的麻烦。

例如,我们无法为同一目录或者文件上的不同用户设置不同的权限集。
因此,实现了访问控制列表(ACL)。
我们可以使用getfacl命令查看文件和目录上的当前ACL。

要在文件/目录上使用setfacl,驻留文件系统应启用ACL支持。
如果文件系统不支持ACL,则会获得"不支持操作"错误。
在这种情况下,我们需要将ACL支持添加到/etc/fstab中的文件系统,如下所示,然后重新安装文件系统。

检查内核是否具有ACL支持

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

root@theitroad:/home# 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_HFSPLUS_FS_POSIX_ACL=y
CONFIG_F2FS_FS_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

检查文件系统是否支持ACL

你可以尝试这个:

$cat /etc/fstab

在查看FSTAB的某些系统上,如果文件系统支持ACL,则不会向我们展示,而是仅显示"默认值"作为装入选项:

root@theitroad:/home# cat /etc/fstab
LABEL=cloudimg-rootfs	/	 ext4	defaults	0 0

在这种情况下,我们可以使用以下命令检查文件系统是否安装了ACL支持:

root@theitroad:/home# tune2fs -l /dev/sda1
tune2fs 1.42.9 (4-Feb-2014)
Filesystem volume name:   cloudimg-rootfs
Last mounted on:          /
Filesystem UUID:          2e294961-ce03-483e-a53e-ff3fc4514bd4
Filesystem magic number:  0xEF53
Filesystem revision #:    1 (dynamic)
Filesystem features:      has_journal ext_attr resize_inode dir_index filetype needs_recovery extent flex_bg sparse_super large_file huge_file uninit_bg dir_nlink extra_isize
Filesystem flags:         signed_directory_hash 
Default mount options:    user_xattr acl

如果文件系统未安装"ACL"选项,则可以重新安装它,以提供所需的选项:

# mount -o remount -o acl /dev/sda1

检查是否需要软件包

要使用Linux ACL,请确保安装了所需的软件包。
以下是需要使用yum或者apt-get安装所需的包。

对于基于Redhat的系统:

$sudo yum install nfs4-acl-tools acl libacl

基于Debian:

$sudo apt-get install nfs4-acl-tools acl

现在我们可以通过各种用法"setfacl"命令。
首先,我们应该创建一个名为"test_folder"的文件夹作为root用户。

root@theitroad:/home# mkdir test_folder
root@theitroad:/home# getfacl test_folder/
# file: test_folder/
# owner: root
# group: root
user::rwx
group::r-x
other::r-x

1.为个人用户提供ACL

假设,我们希望在目录"test_folder"目录上完全访问用户"test"(它可以是任何用户)。
这可以使用setfacl完成如下。

root@theitroad:/home# setfacl -m u:test:rwx test_folder/
root@theitroad:/home# getfacl test_folder/
# file: test_folder/
# owner: root
# group: root
user::rwx
user:test:rwx
group::r-x
mask::rwx
other::r-x

2.为组的所有用户提供ACL

如果我们想为文件夹"test_folder"文件夹"testg"的所有用户提供写访问权限,则可以通过以下方式执行以下操作。

root@theitroad:/home# setfacl -m g:testg:w test_folder/
  
root@theitroad:/home# getfacl test_folder/
# file: test_folder/
# owner: root
# group: root
user::rwx
user:test:rwx
group::r-x
group:testg:-w
mask::rwx
other::r-x

3.撤消用户/组的ACL

如果要撤消为用户测试和组testg提供的权限,则可以使用setfacl命令如下。

root@theitroad:/home# setfacl -x u:test,g:testg test_folder/
root@theitroad:/home# getfacl test_folder/
# file: test_folder/
# owner: root
# group: root
user::rwx
group::r-x
mask::rwx
other::r-x

4.将一个文件/目录的ACL复制到另一个文件/目录

假设,我们也希望在Test_Folder1上具有相同的ACL Test_Folder集,可以通过按如下方式复制ACL来设置它。

root@theitroad:/home# getfacl test_folder acl.txt
root@theitroad:/home# mkdir test_folder1
root@theitroad:/home# setfacl -M acl.txt test_folder1/
root@theitroad:/home# getfacl test_folder1/
# file: test_folder1/
# owner: root
# group: root
user::rwx
user:test:rwx
group::r-x
group:testg:-w
mask::rwx
other::r-x