ACL是什么呢?
ACL(Access Control List),访问控制列表。
用一个例子来说明它有什么用:
假设我有一个项目文件夹,我和我的开发团队Kr对该目录均具备 rwx
的权限,因为我该文件夹下有源码等,所以不能对外开放,对其他用户的权限为0,即我的文件夹目录为 drwxrwx---
;
但是有一天,我的一个很好的朋友poty想要看一下我的项目,然而我不好意思拒绝,这个时候通常有三种选择:
- 让其成为所有者(这个你们想想也不可能嘛)
- 让其成为项目组成员(因为她并没有参与项目,不好让她加进来的,万一不小心删掉了部分代码怎么办)
- 给其它人赋以 r-w 的权限(但是other用户太多了,万一我代码没发布就被竞争对手给copy了呢?)
这个时候,以上三种方法都不靠谱。。。
然后,ACL的作用就来了,它可以针对单一用户、单一文件或目录来进行r、w、x的权限设置,对于需要特殊权限的使用状况非常有帮助。
所以这个时候我们就可以给poty开个小灶,单独为她赋予一些权限。
ACL文件权限设置
ACL最常用的有一下两个命令:
getfacl: 获取文件或目录的ACL设置信息
Usage: getfacl [-aceEsRLPtpndvh] file ...
-a, --access 显示文件或目录的访问控制列表
-d, --default 显示文件或目录默认的访问控制列表
-c, --omit-header 不显示默认的访问控制列表
-R, --recursive 递归到子目录
setfacl: 设置文件或目录的ACL设置信息
-m, --modify=acl:修改文件或目录的扩展ACL设置信息
-x, --remove=acl:从文件或目录删除一个扩展的ACL设置信息
-b, --remove-all:删除所有的扩展的ACL设置信息
-k, --remove-default:删除缺省的acl设置信息
-n, --no-mask:不要重新计算有效权限。setfacl默认会重新计算ACL mask,除非mask被明确的制定
-d, --default:设置默认的ACL设置信息(只对目录有效)
-R, --recursive:操作递归到所有子目录和 文件
接下来进行实际操作演示:
首先先创建一个 project 目录:
root@kali:~# mkdir -m 770 project
root@kali:~# ls -ll
total 44
drwxr-xr-x 9 root root 4096 Aug 23 13:18 gems
drwxrwx--- 2 root root 4096 Sep 26 09:29 project
这个文件属于用户root,属于用户组root,other是没有权限的
接下来创建一个用户
root@kali:~# useradd Kr
root@kali:~# passwd Kr
//查看Kr和我当前用户属于哪个用户组
root@kali:~# groups Kr
Kr : Kr
root@kali:~# groups root
root : root
不是同一个用户组,相当于就是说现在 Kr 这个用木对于 project 这个目录是没有任何权限的。
root@kali:~# su Kr
$ ls
gems project redis 下载 公共 图片 文档 桌面 模板 视频 音乐
$ cd project/
sh: 2: cd: can't cd to project/
可以看到,不能打开 project 这个文件夹
然后开始设置ACL权限了
设置前的权限:
root@kali:~# getfacl project/
# file: project/
# owner: root
# group: root
user::rwx
group::rwx
other::---
然后给Kr设置ACL权限:
root@kali:~# setfacl -m u:Kr:rx project/
root@kali:~# ls -ll
total 44
drwxr-xr-x 9 root root 4096 Aug 23 13:18 gems
drwxrwx---+ 2 root root 4096 Sep 26 09:29 project
project权限后面有一个 + ,+ 就代表ACL权限
设置后的权限:
root@kali:~# getfacl project/
# file: project/
# owner: root
# group: root
user::rwx
user:Kr:r-x
group::rwx
mask::rwx
other::---
可以看到多增加了几行
user:Kr:r-x
mask::rwx
- user:Sherry:r-x: 表示Sherry具备的ACL权限为 r-x
- mask::rwx: 表示ACL的最大权限,用你分配给用户的权限与mask相与(类似于子网掩码)
再次切换到Kr用户
root@kali:~# su Kr
$ ls
gems project redis 下载 公共 图片 文档 桌面 模板 视频 音乐
$ cd project
$ ls
$
可以进入 project 目录了。
删除ACL权限:
setfacl -b <dir>
root@kali:~# setfacl -b project/
root@kali:~# ls -ll
total 44
drwxr-xr-x 9 root root 4096 Aug 23 13:18 gems
drwxrwx--- 2 root root 4096 Sep 26 09:29 project
删除增加的用户:
root@kali:~# userdel -r Kr