Linux ACL 权限

在普通权限中,用户对文件只有三种身份,就是属主、属组和其他人;每种用户身份拥有读(read)、写(write)和执行(execute)三种权限。但是在实际工作中,这三种身份实在是不够用,我们举个例子来看看。

image.png

图 1 ACL权限简介

图 1 的根目录中有一个 /project 目录,这是班级的项目目录。班级中的每个学员都可以访问和修改这个目录,老师也需要对这个目录拥有访问和修改权限,其他班级的学员当然不能访问这个目录。需要怎么规划这个目录的权限呢?应该这样:老师使用 root 用户,作为这个目录的属主,权限为 rwx;班级所有的学员都加入 tgroup 组,使 tgroup 组作为 /project 目录的属组,权限是 rwx;其他人的权限设定为 0。这样这个目录的权限就可以符合我们的项目开发要求了。

有一天,班里来了一位试听的学员 st,她必须能够访问 /project 目录,所以必须对这个目录拥有 r 和 x 权限;但是她又没有学习过以前的课程,所以不能赋予她 w 权限,怕她改错了目录中的内容,所以学员 st 的权限就是 r-x。可是如何分配她的身份呢?变为属主?当然不行,要不 root 该放哪里?加入 tgroup 组?也不行,因为 tgroup 组的权限是 rwx,而我们要求学员 st 的权限是 r-x。如果把其他人的权限改为 r-x 呢?这样一来,其他班级的所有学员都可以访问 /project 目录了。

当出现这种情况时,普通权限中的三种身份就不够用了。ACL 权限就是为了解决这个问题的。在使用 ACL 权限给用户 st 陚予权限时,st 既不是 /project 目录的属主,也不是属组,仅仅赋予用户 st 针对此目录的 r-x 权限。这有些类似于 Windows 系统中分配权限的方式,单独指定用户并单独分配权限,这样就解决了用户身份不足的问题。

ACL是Access Control List(访问控制列表)的缩写,不过在Linux系统中,ACL用于设定用户针对文件的权限,而不是在交换路由器中用来控制数据访问的功能(类似于防火墙)。

开启ACL权限

在 CentOS 6.x 系统中 ACL 权限默认是开启的,不需要手工开启。不过,如果你的操作系统不是 CentOS 6.x,那该如何查看 ACL 权限是否开启了呢?可以这样查看:

[root@localhost ~]# mount
/dev/sda1 on /boot type ext4 (rw)
/dev/sda3 on I type ext4 (rw)
…省略部分输出…

使用mount命令可以看到系统中已经挂载的分区,但是并没有看到ACL权限的设置

[root@localhost ~]# dumpe2fs -h /dev/sda3

dumpe2fs是查询指定分区文件系统详细信息的命令

…省略部分输出…
Default mount options: user_xattr acl
…省略部分输出…

其中,dumpe2fs 命令可选的选项及其含义如下:

  • -h:仅显示超级块中的信息,而不显示磁盘块组的详细信息;

使用 mount 命令可以査看到系统中已经挂载的分区,而使用 dumpe2fs 命令可以査看到这个分区文件系统的详细信息。大家可以看到,我们的 ACL 权限是 /dev/sda3 分区的默认挂载选项,所以不需要手工挂载。

不过我的 Linux 系统如果没有默认挂载,则可以手工挂载吗?当然可以,执行如下命令:

[root@localhost ~]# mount -o remount, acl /

重新挂载根分区,并加入ACL权限

使用 mount 命令重新挂载,并加入 ACL 权限。不过使用此命令是临时生效的。要想永久生效,需要修改 /etc/fstab 文件,命令如下:

[root@localhost ~]#vi /etc/fstab
UUID=c2ca6f57-b15c-43ea-bca0-f239083d8bd2 /ext4 defaults, acl 1 1

加入ACL权限

[root@localhost ~]# mount -o remount /

重新挂载文件系统或重启系统,使修改生效

在你需要开启 ACL 权限的分区行上(也就是说 ACL 权限针对的是分区),手工在 defaults 后面加入",acl"即可永久在此分区中开启 ACL 权限。

ACL权限设置

1) ACL权限管理命令

我们知道了 ACL 权限的作用,也知道了如何开启 ACL 权限,接下来学习如何査看和设定 ACL 权限。命令如下:

[root@localhost ~]# getfacle 文件名

查看ACL权限

[root@localhost ~]# setfacl 选项 文件名

设定ACL权限

选项:

  • -m:设定 ACL 权限。如果是给予用户 ACL 权限,则使用"u:用户名:权限"格式赋予;如果是给予组 ACL 权限,则使用"g:组名:权限" 格式赋予;
  • -x:删除指定的 ACL 权限;
  • -b:删除所有的 ACL 权限;
  • -d:设定默认 ACL 权限。只对目录生效,指目录中新建立的文件拥有此默认权限;
  • -k:删除默认 ACL 权限;
  • -R:递归设定 ACL 权限。指设定的 ACL 权限会对目录下的所有子文件生效;

2) 给用户和用户组添加ACL权限

举个例子,就来看看图 1 中的权限怎么分配。我们要求 root 是 /project 目录的属主,权限是 rwx;tgroup 是此目录的属组,tgroup 组中拥有班级学员 zhangsan 和 lisi,权限是 rwx;其他人的权限是 0。这时,试听学员 st 来了,她的权限是 r-x。我们来看具体的分配命令。

[root@localhost ~]# useradd zhangsan
[root@localhost ~]# useradd lisi
[root@localhost ~]# useradd st
[root@localhost ~]# groupadd tgroup

添加需要试验的用户和用户组,省略设定密码的过程

[root@localhost ~]# mkdir /project #建立需要分配权限的目录
[root@localhost ~]# chown root:tgroup /project/

改变/project目录的属主和属组

[root@localhost ~]# chmod 770 /project/

指定/project目录的权限

[root@localhost ~]# ll -d /project/
drwxrwx--- 2 root tgroup 4096 1月19 04:21 /project/

查看一下权限,已经符合要求了

这时st学员来试听了,如何给她分配权限

[root@localhost ~]# setfacl -m u:st:rx /project/

给用户st赋予r-x权限,使用"u:用户名:权限" 格式

[root@localhost /]# cd /
[root@localhost /]# ll -d project/
drwxrwx---+ 3 root tgroup 4096 1月19 05:20 project/

使用ls-l査询时会发现,在权限位后面多了一个"+",表示此目录拥有ACL权限

[root@localhost /]# getfacl project

查看/prpject目录的ACL权限

file: project <-文件名

owner: root <-文件的属主

group: tgroup <-文件的属组

user::rwx <-用户名栏是空的,说明是属主的权限
user:st:r-x <-用户st的权限
group::rwx <-组名栏是空的,说明是属组的权限
mask::rwx <-mask权限
other::--- <-其他人的权限

大家可以看到,st 用户既不是 /prpject 目录的属主、属组,也不是其他人,我们单独给 st 用户分配了 r-x 权限。这样分配权限太方便了,完全不用先辛苦地规划用户身份了。
我想给用户组赋予 ACL 权限可以吗?当然可以,命令如下:

[root@localhost /]# groupadd tgroup2

添加测试组

[root@localhost /]# setfacl -m g:tgroup2:rwx project/

为组tgroup2纷配ACL权限,使用"g:组名:权限"格式

[root@localhost /]# ll -d project/
drwxrwx---+ 2 root tgroup 4096 1月19 04:21 project/

属组并没有更改

[root@localhost /]# getfacl project/

file: project/

owner: root

group: tgroup

user::rwx
user:st:r-x
group::rwx
group:tgroup2:rwx <-用户组tgroup2拥有了rwx权限
mask::rwx
other::--

3) 最大有效权限mask

mask 是用来指定最大有效权限的。mask 的默认权限是 rwx,如果我给 st 用户赋予了 r-x 的 ACL 权限,mj 需要和 mask 的 rwx 权限"相与"才能得到 st 的真正权限,也就是 r-x "相与"rwxtj 出的值是 r-x,所以 st 用户拥有 r-x 权限。

如果把 mask 的权限改为 r--,和 st 用户的权限相与,也就是 r--"相与"r-x 得出的值是 r--,st 用户的权限就会变为只读。大家可以这么理解:用户和用户组所设定的权限必须在 mask 权限设定的范围之内才能生效,mask权限就是最大有效权限。

不过我们一般不更改 mask 权限,只要给予 mask 最大权限 rwx,那么任何权限和 mask 权限相与,得出的值都是权限本身。也就是说,我们通过给用户和用户组直接赋予权限,就可以生效,这样做更直观。

补充:逻辑与运算的运算符是"and"。可以理解为生活中所说的"并且"。也就是相与的两个值都为真,结果才为真;有一个值为假,与的结果就为假。比如 A 相与 B,结果入表 2 所示。

<caption data-reader-unique-id="116" style="max-width: 100%;">表 2 逻辑与运算</caption>
| A | B | and |
| 真 | 真 | 真 |
| 真 | 假 | 假 |
| 假 | 真 | 假 |
| 假 | 假 | 假 |

那么两个权限相与和上面的结果类似,我们以读(r)权限为例,结果如表 3 所示。

<caption data-reader-unique-id="142" style="max-width: 100%;">表 3 读权限相与</caption>
| A | B | and |
| r | r | r |
| r | - | - |

- r -

所以,"rwx"相与"r-x",结果是"r-x";"r--"相与"r-x",结果是"r--"。

修改最大有效权限的命令如下:

[root@localhost /]# setfacl -m m:rx project/

设定mask权限为r-x,使用"m:权限"格式

[root@localhost /]# getfacl project/

file:project/

owner:root

group:tgroup

user::rwx
group::rwx #effective:r-x
mask::r-x

mask权限变为r-x

other::--

4) 默认ACL权限和递归ACL权限

我们已经给 /project 目录设定了 ACL 权限,那么,在这个目录中新建一些子文件和子目录,这些文件是否会继承父目录的 ACL 权限呢?我们试试吧。

[root@localhost /]# cd /project/
[root@localhost prq'ect]# touch abc
[root@localhost prq'ect]# mkdir d1

在/project目录中新建了abc文件和d1目录

[root@localhost project]#ll
总用量4
-rw-r--r-- 1 root root 01月19 05:20 abc
drwxr-xr-x 2 root root 4096 1月19 05:20 d1

这两个新建立的文件权限位后面并没有"+",表示它们没有继承ACL权限

子文件 abc 和子目录 d1 因为是后建立的,所以并没有继承父目录的 ACL 权限。当然,我们可以手工给这两个文件分配 ACL 权限,但是如果在目录中再新建文件,都要手工指定,则显得过于麻烦。这时就需要用到默认 ACL 权限。
默认 ACL 权限的作用是:如果给父目录设定了默认 ACL 权限,那么父目录中所有新建的子文件都会继承父目录的 ACL 权限。默认 ACL 权限只对目录生效。命令如下:

[root@localhost /]# setfacl -m d:u:st:rx /project/

使用"d:u:用户名:权限"格式设定默认ACL权限

[root@localhost project]# getfacl project/
# file: project/
# owner: root
# group: tgroup
user:: rwx
user:st:r-x
group::rwx
group:tgroup2:rwx
mask::rwx
other::--
default:user::rwx <-多出了default字段
default:user:st:r-x
default:group::rwx
default:mask::rwx
default:other::--
[root@localhost /]# cd project/
[root@localhost project]# touch bcd
[root@localhost project]# mkdir d2

新建子文件和子目录

[root@localhost project]# ll 总用量8
-rw-r--r-- 1 root root 01月19 05:20 abc
-rw-rw----+ 1 root root 01月19 05:33 bcd
drwxr-xr-x 2 root root 4096 1月19 05:20 d1
drwxrwx---+ 2 root root 4096 1月19 05:33 d2

新建的bcd和d2已经继承了父目录的ACL权限

大家发现了吗?原先的 abc 和 d1 还是没有 ACL 权限,因为默认 ACL 权限是针对新建立的文件生效的。
再说说递归 ACL 权限。递归是指父目录在设定 ACL 权限时,所有的子文件和子目录也会拥有相同的 ACL 权限。

[root@localhost project]# setfacl -m u:st:rx -R/project/
#-R递归
[root@localhost project]# ll
总用量8
-rw-r-xr--+ 1 root root 01月19 05:20 abc
-rw-rwx--+ 1 root root 01月19 05:33 bcd
drwxr-xr-x+ 2 root root 4096 1月19 05:20 d1
drwxrwx--+ 2 root root 4096 1月19 05:33 d2
#abc和d1也拥有了ACL权限

总结一下:默认 ACL 权限指的是针对父目录中新建立的文件和目录会继承父目录的 ACL 权限,格式是"setfacl-m d:u:用户名:权限 文件名";递归 ACL 权限指的是针对父目录中已经存在的所有子文件和子目录继承父目录的 ACL 权限,格式是"setfacl-m u:用户名: 权限 -R 文件名"。

5) 删除ACL权限

我们来看看怎么删除 ACL 权限,命令如下:

删除指定的ACL权限:

[root@localhost /]# setfacl -x u:st /project/
#删除指定用户和用户组的ACL权限
[root@localhost /]# getfacl project/
# file:project/
# owner: root
# group: tgroup
user::rwx
group::rwx
group:tgroup2:rwx
mask::rwx
other::--
#st用户的权限已被删除

删除所有ACL权限:

[root@localhost /]# setfacl -b project/
#会删除文件的所有ACL权限
[root@localhost /]# getfacl project/
#file: project/
#owner: root
# group: tgroup
user::rwx
group::rwx
other::--
#所有ACL权限已被删除

关注微信公众号「站长严长生」,在手机上阅读所有教程,随时随地都能学习。本公众号由C语言中文网站长运营,每日更新,坚持原创,敢说真话,凡事有态度。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,732评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,496评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,264评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,807评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,806评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,675评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,029评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,683评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,704评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,666评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,773评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,413评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,016评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,204评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,083评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,503评论 2 343

推荐阅读更多精彩内容