Linux权限管理之ACL权限

前言

ACL权限 Access Control List
适用于当一个用户不满足所有者owner, 所属组group, 其他人other的情况。
比如一个家庭账本权限为-rwxrwx---, 所有者owner是我, 所属组group是直系亲属, 其他人other是陌生人。
现在三姑六婆想阅读这个家庭账本, 要求权限为r--, 不满足拥有者(我), 所属组(直系亲属), 其他人(陌生人), 这时候就是使用ACL权限的时候。

开启ACL权限

执行以下shell脚本, 查看是否已经开启了ACL权限。

1
2
3
4
5
6
7
8
9
#!/bin/bash
[[ $UID != "0" ]] && echo "you must be root" && exit 1;

filesystem=$(mount | grep " / " | cut -d " " -f 5)

if [[ ${filesystem} == "ext3" ]];then
/sbin/dumpe2fs -h /dev/sda2 | grep "acl"
[[ $? == "0" ]] && echo "enabled acl" || echo "disabled acl"
fi

一般默认开启, 如果没有开启, 进行以下配置即可

1
2
3
4
5
# 1. 临时配置, 重新挂载/根目录, 加入ACL权限
[ahao@localhost ~]$ mount -o remount,acl /
# 2. 永久配置, 写入/etc/fstab文件, 重启生效
[root@localhost ~]# vim /etc/fstab
LABEL=/ / ext3 defaults,acl 1 1

查看和设置文件ACL权限

设置ACL权限用setfacl -m [u|g]:[用户名|组名]:权限 文件名命令。
查看ACL权限用getfacl 文件名

选项 说明 使用
m 设置ACL权限 setfacl -m [u|g]:[用户名|组名]:权限 文件名
x 删除指定ACL权限 setfacl -x [u|g]:[用户名|组名] 文件名
b 删除全部ACL权限 setfacl -b 文件名
d 设定默认ACL权限(子文件继承目录ACL权限) setfacl -m d:[u|g]:[用户名|组名]:权限 文件名
k 删除默认ACL权限(子文件继承目录ACL权限) setfacl -m
R 递归设置ACL权限(容易给文件x权限) setfacl -m [u|g]:[用户名|组名]:权限 -R 目录名

这是一个例子。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# 1. 创建权限为drwxrwx---, 用户和用户组为root的dir目录
[root@localhost ~]# mkdir ~ahao/dir
[root@localhost ~]# chmod 770 ~ahao/dir
[root@localhost ~]# ll ~ahao
总用量 0
drwxrwx---. 2 root root 6 11月 4 22:32 dir

# 2. 操作1: ahao用户尝试进入dir目录失败, 权限不足
[ahao@localhost ~]$ cd dir
-bash: cd: dir: 权限不够

# 3. root用户设置ACL权限, 给ahao用户赋予rx权限
[root@localhost ~]# setfacl -m u:ahao:rx ~ahao/dir
[ahao@localhost ~]$ ll
总用量 0
drwxrwx---+ 2 root root 6 11月 4 22:32 dir

# 4. 操作2: ahao用户尝试进入dir目录成功, dir的+权限位代表ACL权限
[ahao@localhost ~]$ cd dir
[ahao@localhost dir]$ # 成功进入dir目录

# 5. 操作3: 查看ACL权限
[ahao@localhost dir]$ getfacl ~ahao/dir/
getfacl: Removing leading '/' from absolute path names
# file: home/ahao/dir/
# owner: root
# group: root
user::rwx
user:ahao:r-x # ACL权限
group::rwx
mask::rwx
other::---

mask掩码

上面的例子在使用getfacl dir之后, 可以看到有一项是mask
这个和默认权限umask差不多, 也是一个权限掩码, 表示所能赋予的权限最大值。
这里的maskACL权限进行&与运算, 得到的才是真正的ACL权限
用人话讲, 就是

你考一百分是因为实力只有一百分
我考一百分是因为总分只有一百分

mask限制了权限的最高值。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
# 1. 修改ACL权限mask为r-x
[root@localhost ~]# setfacl -m m:rx ~ahao/tmp/av
[root@localhost ~]# getfacl ~ahao/tmp/av
getfacl: Removing leading '/' from absolute path names
# file: home/ahao/tmp/av
# owner: root
# group: root
user::rwx
group::r-x
mask::r-x # 修改ACL权限mask为r-x
other::---

# 2. 为用户ahao添加ACL权限rwx
[root@localhost ~]# setfacl -m u:ahao:rwx ~ahao/tmp/av/
[root@localhost ~]# getfacl ~ahao/tmp/av
getfacl: Removing leading '/' from absolute path names
# file: home/ahao/tmp/av
# owner: root
# group: root
user::rwx
user:ahao:rwx
group::r-x
mask::rwx # 注意, 这里的mask掩码会改变, 因为赋予的ACL权限大于mask
other::---

# 3. 修改ACL权限mask为r-x
[root@localhost ~]# setfacl -m m:rx ~ahao/tmp/av
[root@localhost ~]# getfacl ~ahao/tmp/av
getfacl: Removing leading '/' from absolute path names
# file: home/ahao/tmp/av
# owner: root
# group: root
user::rwx
user:ahao:rwx #effective:r-x # 这里会提示真实的ACL权限为r-x
group::r-x
mask::r-x # 这里mask不会再改变
other::---
  1. mask 会限制 ACL 权限的最大值。
  2. 赋予ACL 权限大于 mask 的时候, 会将 mask 撑大