ACL权限设置

简介

ACL的功能是应对复杂用户环境的权限问题。

系统是否支持ACL是与文件系统有关的,在CentOS7之前的系统版本中用户自己手动创建的分区默认是不支持ACL的,而在装系统的时候已存在的分区是支持的。

用法

setfacl -m u:user:rwx file|directory

[root@centos7 app]# ll a
-rw-r--r--. 1 root root 0 May 30 11:59 a

如上所示,现在有一个文件a属主和属组都是root,other只有r权限,如果现在需要让用户tom对a有rw权限但是除了tom在other中的其他人都只有r权限应该怎么做呢?这个时候就需要ACL了。

[root@centos7 app]# setfacl -m u:tom:rw a  //给tom赋予rw权限
[root@centos7 app]# ll a
-rw-rwxr--+ 1 root root 0 May 30 11:59 a //文件权限后面多了个“+”
[root@centos7 app]# getfacl a //使用getfacl命令查看文件的ACL权限
# file: a
# owner: root
# group: root
user::rw-
user:tom:rw  //由此可见tom已经有了rwx权限
group::r--
mask::rw
other::r--

[root@centos7 app]# 

执行setfacl命令后使用getfacl命令可以看到tom已经拥有rw权限了,那么tom真的已经有rw权限了吗?

[root@centos7 app]# su tom //切换用户tom
[tom@centos7 app]$ echo nihao > a //向文件a中写入“nihao”
[tom@centos7 app]$ cat a //未报错,查看a文件内容
nihao //写入成功,此时说明tom对文件有w权限而之前是没有的
[tom@centos7 app]$ exit
exit
[root@centos7 app]# su alice //切换用户alice
[alice@centos7 app]$ echo nimenhao > a //尝试向文件a中写入字符
bash: a: Permission denied //提示无权限
[alice@centos7 app]$ 

上述实验证实了针对tom的权限修改成功了。tom可以对a文件进行写入操作,而在other中的其他人就不行。


setfacl -m g:groupname:rwx file|directory

既然setfacl可以对特定用户设置权限,那么可不可以对特定组设置权限呢?答案是肯定的。

[root@centos7 app]# touch b //创建文件b
[root@centos7 app]# ll b //查看文件权限
-rw-r--r--. 1 root root 0 May 30 14:00 b
[root@centos7 app]# id tom //查看tom的主组
uid=1002(tom) gid=1003(G3) groups=1003(G3)
[root@centos7 app]# id alice //查看alice的主组
uid=1001(alice) gid=1002(G2) groups=1002(G2)
[root@centos7 app]# su tom //切换至tom
[tom@centos7 app]$ echo nihao > b
bash: b: Permission denied //tom尝试写入失败
[tom@centos7 app]$ exit
exit
[root@centos7 app]# su alice //切换至alice
[alice@centos7 app]$ echo nihao > b
bash: b: Permission denied //alice尝试写入失败
[alice@centos7 app]$ 

由上述命令可知,tom的主组是G3,alice的主组是G2,此时两个用户都没有对文件b的w权限,尝试写入均失败。

[alice@centos7 app]$ exit //切换用户至root
exit
[root@centos7 app]# setfacl -m g:G3:rw b //赋予G3组对b的rw权限
[root@centos7 app]# ll b
-rw-rw-r--+ 1 root root 0 May 30 14:00 b
[root@centos7 app]# getfacl b //查看文件b的权限
# file: b
# owner: root
# group: root
user::rw-
group::r--
group:G3:rw-    //可见G3组已经拥有rw权限
mask::rw-
other::r--

[root@centos7 app]# su tom //切换至G3组成员tom
[tom@centos7 app]$ echo nihao > b //尝试将“nihao”写入文件b
[tom@centos7 app]$ cat b //未报错,查看文件
nihao //写入成功
[tom@centos7 app]$ exit
exit
[root@centos7 app]# su alice //切换至G2组成员alice
[alice@centos7 app]$ echo nimenhao > b //尝试写入
bash: b: Permission denied //写入失败
[alice@centos7 app]$ 

上述实验我将tom所在的G3赋予rw权限,那么G3的组员tom便拥有了对文件b的写入和更改内容权限,于是便尝试写入,结果如预想的那样成功写入,然后我再尝试用非G3组成员的alice尝试写入字符到b中,结果也如预想中的那样失败,所以针对于某一个组设置特殊权限实验成功。


setfacl -m d:u:user:rwx directory

虽然setfacl命令也可以对文件夹使用,但是在实际操作过程中我们发现虽然某用户或者某组对一个文件夹有rwx权限,但是root账号在该文件夹下创建的新文件对于之前的用户或者组来说没有w权限。

[root@centos7 ~]# ll -d /app //查看文件夹/app的权限设置
drwxr-xr--. 2 root root 24 May 30 14:00 /app
[root@centos7 ~]# setfacl -m u:tom:rwx /app //赋予tom对/app的rwx权限
[root@centos7 ~]# getfacl /app  //查看文件夹/app的权限
getfacl: Removing leading '/' from absolute path names
# file: app
# owner: root
# group: root
user::rwx
user:tom:rwx
group::r-x
mask::rwx
other::r--

[root@centos7 ~]# touch /app/aa //在/app下创建新文件aa
[root@centos7 ~]# getfacl /app/aa  //查看aa的权限
getfacl: Removing leading '/' from absolute path names
# file: app/aa
# owner: root
# group: root
user::rw-
group::r--
other::r--

[root@centos7 ~]#  //tom没有对新文件aa有rw权限

上述实验可以看出虽然tom对文件夹/app有rwx权限,但是在/app下建立的新文件,tom只有r权限,要实现在文件夹下的新文件继承文件夹的权限信息的话可以在u或者g前加个d并用冒号隔开。

[root@centos7 ~]# rm -rf /app/* //删除文件夹中的所有内容
[root@centos7 ~]# setfacl -m d:u:tom:rwx /app //在u前加d后执行命令
[root@centos7 ~]# touch /app/bb  //在/app下创建新文件bb
[root@centos7 ~]# getfacl /app/bb //查看新文件bb的权限信息
getfacl: Removing leading '/' from absolute path names
# file: app/bb
# owner: root
# group: root
user::rw-
user:tom:rwx            #effective:rw-
group::r-x          #effective:r--
mask::rw-
other::r--

[root@centos7 ~]#  //tom有rwx权限

如上面的实验,只要在命令中u前面加上d用冒号隔开那么执行命令后在该文件夹下创建的新文件的权限就会继承文件夹的权限,但是对于文件夹中已经存在的文件无效。​