Linux的权限概念是非常重要的。但是传统的权限仅有三种(owner、group、others)身份搭配三种权限(r、w、x)而已,并没有办法单纯针对某一个用户或某一个用户组来设置特定的权限需求。
ACL是Access Control List 的英文缩写,中文译为访问控制列表,主要目的是提供传统的属主,所属群组、其他人的读、写、执行权限之外的详细权限设置。ACL可以针对单一用户、单一文件或目录进行(r、w、x)的权限设置,对于需要特殊权限的使用状况非常有帮助。
那ACL主要可以针对哪些方面来控制权限?它主要可以针对几个选项:
用户:可以针对用户来设置权限
用户组:针对用户组为对象来设置权限
默认属性:还可以针对在该目录下建立新文件/目录时,规范新数据的默认权限
也就是说,如果你有一个目录,需要给一堆人使用,每个人或每个用户组所需要的权限并不相同时,在过去,传统的Linux三种身份的三种权限是无法达到的,因为基本上传统的Linux权限只能针对一个用户、一个用户组及非此用户组的其他人设置权限而已,无法针对单一用户来设计权限,而ACL就是为了要解决这个问题。
近年来Linux系统对权限设置的热切需求,目前ACL几乎已经默认加入了所有常见的Linux文件系统的挂载参数(ext2、ext3、ext4、xfs),所以你无需进行任何操作,ACL就可以被你使用。不过,你不确定系统是否针对支持ACL的话,那么就来检查以下内核挂载时显示的信息吧
[root@myuser2 ~]# dmesg |grep -i acl
[ 4.720002] systemd[1]: systemd 219 running in system mode. (+PAM +AUDIT +SELINUX +IMA -APPARMOR +SMACK +SYSVINIT +UTMP +LIBCRYPTSETUP +GCRYPT +GNUTLS +ACL +XZ +LZ4 -SECCOMP +BLKID +ELFUTILS +KMOD +IDN)
[ 6.519023] SGI XFS with ACLs, security attributes, no debug enabled
看,至少XFS是支持ACL的功能
既然知道了文件系统支持ACL后,接下来应该如何设置与查看ACL呢?很简单利用以下两个命令就好了
setfacl是一个用于设置文件或目录访问控制列表(ACL)的工具。通过setfacl命令,可以为特定用户或组添加或删除权限,或者清除ACL条目
setfacl命令语法:
setfacl [选项] 目标文件名
选项 | 解释 |
---|---|
-m | 添加ACL条目 |
-x | 删除ACL条目 |
-X | 删除与指定规则匹配的ACL条目 |
-b | 删除所有ACL条目 |
-k | 删除默认ACL条目 |
-n | 不解析用户名 |
-d | 为目录设置默认ACL条目 |
-R | 递归设置ACL |
设置规范:【u : [使用者的账号] : [rwx] 】
授予用户zhw读取、写入和执行文件 acl_test.txt 的权限:
setfacl -m u:zhw:rwx /mnt/acl_test.txt
授予group1组读取和执行文件 acl_test.txt 的权限:
setfacl -m g:group1:rx /mnt/acl_test.txt
授予特定目录acl_test下所有文件和子目录中的用户zhw读取、写入和执行的权限(递归设置):
setfacl -R -m u:zhw:rwx /mnt/acl_test
撤销用户zhw对文件acl_test.txt的所有权限:
setfacl -x u:zhw acl_test.txt
删除所有ACL条目:
setfacl -b 目标文件名
为目录设置默认ACL条目:
setfacl -d -m u:用户账号:rwx 目标文件名
getfacl是一个用于获取文件或目录访问控制列表(ACL)的工具。通过getfacl命令,可以查看文件或目录的ACL信息。下面是getfacl命令的语法及使用案例详解:
getfacl命令语法
getfacl [选项] 目标文件名
选项 | 解释 |
---|---|
-R | 递归获取ACL信息 |
-r | 递归获取ACL信息,并以相对路径形式输出 |
获取文件的ACL信息:
getfacl /mnt/acl_test.txt
# [root@root mnt]# getfacl acl_test.txt
# file: acl_test.txt <== 说明文件名
# owner: root <== 说明此文件的拥有者
# group: root <== 此文件的所属用户组
user::rw- <== 没写使用者,代表文件的拥有者权限
user:zhw:r-x <== 针对zhw用户权限的设置 为 rx
group::r-- <== 针对文件用户组的设置 为 r
mask::r-x <== 此文件的默认有效权限: rx
other::r-- <== 其他人拥有的权限
获取目录的ACL信息:
getfacl /mnt/acl_test
递归获取目录下所有文件和子目录的ACL信息:
getfacl -R /mnt/acl_test
递归获取目录下所有文件和子目录的ACL信息,并以相对路径形式输出:
getfacl -r /mnt/acl_test
总结:getfacl和setfacl命令可以在Linux系统中实现更为细粒度的权限控制和管理,但需要注意权限管理的安全性,谨慎使用