ACL 是 Access Control List 的缩写, 主要的目的是提供传统的 owner 、 group 、 other 的 read 、 write 、 execute 许可权之外的具体许可权设定.
ACL 可以针对单一使用者、单一档案或目录来进行 r 、 w 、 x 的许可权设定, 对于需要特殊许可权的使用状况非常有帮助.
那么 ACL 主要可以针对那些方面来控制许可权呢? 它主要可以针对几个专案:
* 使用者 (user): 可以针对使用者来设定许可权;
* 使用者组 (group): 针对使用者组来设定其许可权;
* 预设属性 (mask): 还可以在该目录下在新建新档案/目录是设定新资料的预设许可权.
 
<1>如何启动 ACL
由于 ACL 是传统 UNIX-like 操作系统许可权的额外支援专案, 因此要使用 ACL 必须要有档案系统的支援才行. 目前绝大数的档案系统都有支援 ACL 的功能.
那我们如何检视你的档案系统是否支援 ACL 呢? 我们可以这样看:
[root@sqj2015 ~]# mount      //直接检视挂载引数的功能
/dev/vda1 on / type ext4 (rw)
…………
##这里我们没有看到 ACL
 
[root@sqj2015 ~]# dumpe2fs -h /dev/vda1 | grep ‘mount options’
dumpe2fs 1.41.12 (17-May-2010)
Default mount options:    user_xattr acl
## 由 mount 单纯去查询不见得可以看到实际的选项, 由于目前新的 distribution 经常会主动加人某些预设功能.
 
若你的系统预设不会帮你加上 acl 的支援呢? 那么你可以这样操作:
[root@sqj2015 ~]# mount -o remount,acl /
[root@sqj2015 ~]# mount
/dev/vda1 on / type ext4 (rw,acl)
##这样就加入了! 但是如果你想要每次开机都生效, 则需要这样:
[root@sqj2015 ~]# vi /etc/fstab
/dev/vda1           /               ext4    defaults,acl    1 1
 
<2>ACL 设定技巧
在档案系统启动 ACL 支援后, 接下来该如何设定与检视 ACL 呢? 很简单, 利用以下 2 个命令就可以了:
getfacl: 检视某个档案/目录的 ACL 设定专案;
setfacl: 设定某个目录/档案的 ACL 规定;
 
setfacl 语法
setfacl [引数] 目标档名
引数:
-m : 设定后续的 acl 引数给档案使用, 不可与-x 合用;
-x : 删除后续的 acl 引数, 不可与-m 合用;
-b : 删除所有 acl 设定引数;
-k : 删除预设 acl 引数;
-R : 递回设定 acl, 亦即包括子目录都会被设定起来;
-d : 设定预设 acl 引数, 只对目录有效, 在该目录新建的资料会引用此预设值.
 
接下来, 就来看看 setfacl 的设定方式:
**针对特定使用者的方式:
##设定规定: “u:[使用者账号列表]:[rwx]” 如下, 设定 sqj 许可权为 rw:
[root@sqj2015 ~]# touch acl_test
[root@sqj2015 ~]# ll acl_test
-rw-r–r–. 1 root root 0 Mar 21 13:44 acl_test
[root@sqj2015 ~]# setfacl -m u:sqj:rw acl_test
[root@sqj2015 ~]# ll acl_test
-rw-rw-r–+ 1 root root 0 Mar 21 13:44 acl_test
##是否看到了不同, 在许可权部分多了个+.
 
[root@sqj2015 ~]# setfacl -m u::rwx acl_test
[root@sqj2015 ~]# ll acl_test
-rwxrw-r–+ 1 root root 0 Mar 21 13:44 acl_test
##若无使用者列表, 则代表设定该档案所有者, 所以上面显示 root 的许可权变成了 rwx 了.
 
但我们具体怎么检视设定的 ACL 呢? 如下:
[root@sqj2015 ~]# getfacl acl_test
# file: acl_test
# owner: root
# group: root
user::rwx
user:sqj:rw-
group::r–
mask::rw-
other::r–
 
**针对特定使用者组的方式:
##设定规定: “g:[使用者组列表]:[rwx]”, 例如, 针对 sqj 组许可权 rx:
[root@sqj2015 ~]# setfacl -m g:sqj:rw acl_test
[root@sqj2015 ~]# getfacl acl_test
# file: acl_test
# owner: root
# group: root
user::rwx
user:sqj:rw-
group::r–
group:sqj:rw-
mask::rw-
other::r–
 
**针对有效许可权 mask 的设定方式:
##mask 它的意思是使用者或组所设定的许可权必须存在与 mask 的许可权设定范围内才能生效, 此即有效许可权.
##设定规定: “m:[rwx]”, 例如针对刚才的档案规定为仅有 r 许可权:
[root@sqj2015 ~]# setfacl -m m:r acl_test
[root@sqj2015 ~]# getfacl acl_test
# file: acl_test
# owner: root
# group: root
user::rwx
user:sqj:rw-                    #effective:r–
group::r–
group:sqj:rw-                   #effective:r–
mask::r–
other::r–
##sqj 使用者、 sqj 组与 mask 的集合仅有 r 存在, 因此 sqj 仅具有 r 的许可权而已, 并不存在 w 的许可权, 这就是 mask 的功能.
 
**针对预设许可权的设定方式:
##设定规定:”d:[ug]: 使用者列表:[rwx]”
[root@sqj2015 ~]# mkdir acl_test1
[root@sqj2015 ~]# setfacl -m d:u:sqj:rw acl_test1/
[root@sqj2015 ~]# getfacl acl_test1
# file: acl_test1
# owner: root
# group: root
user::rwx
group::r-x
other::r-x
default:user::rwx
default:user:sqj:rw-
default:group::r-x
default:mask::rwx
default:other::r-x
 
[root@sqj2015 ~]# cd acl_test1
[root@sqj2015 acl_test1]# touch test
[root@sqj2015 acl_test1]# ll test
-rw-rw-r–+ 1 root root 0 Mar 21 14:16 test
[root@sqj2015 acl_test1]# getfacl test
# file: test
# owner: root
# group: root
user::rw-
user:sqj:rw-
group::r-x                      #effective:r–
mask::rw-
other::r–
##通过这个” 针对目录来设定预设 ACL 许可权” 的选项, 我们可以让这些属性继承到子目录下面.