专栏名称: 马哥Linux运维
马哥linux致力于linux运维培训,连续多年排名第一,订阅者可免费获得学习机会和相关Linux独家实战资料!
目录
相关文章推荐
运维  ·  再见,CDN 巨头:Akamai 宣布 ... ·  2 天前  
51好读  ›  专栏  ›  马哥Linux运维

五分钟学会 Linux ACL 权限的全部内容

马哥Linux运维  · 公众号  · 运维  · 2018-10-20 22:00

正文


ACL 是什么


ACL的全称是 Access Control List (访问控制列表) ,一个针对文件/目录的访问控制列表。它在UGO权限管理的基础上为文件系统提供一个额外的、更灵活的权限管理机制。它被设计为UNIX文件权限管理的一个补充。ACL允许你给任何的用户或用户组设置任何文件/目录的访问权限。


本文的演示环境为 ubuntu 16.04。


ACL有什么用


既然是作为UGO权限管理的补充,ACL自然要有UGO办不到或者很难办到的本事,例如:


  1. 可以针对用户来设置权限

  2. 可以针对用户组来设置权限

  3. 子文件/目录继承父目录的权限


检查是否支持ACL


ACL需要Linux内核和文件系统的配合才能工作,当前我们能见到的大多数Linux发行版本默认都是支持的。但最好还是能够先检查一下:


sudo tune2fs - l / dev / sda1 | grep "Default mount options:"

Default mount options : user_xattr acl


我们能够看到默认情况下(Default mount options:)已经加入 acl 支持了。


如何设置ACL


我们可以使用setfacl和getfacl命令来设置或观察文件/目录的acl权限。


setfacl


参数不多,直接列出来了:



getfacl


getfacl 文件/目录名


下面我们通过一些示例来演示 ACL 权限的基本用法。


针对用户来设置权限


笔者系统中的当前用户是 nick,再创建两个用户 tester 和 tester1 用来进行测试:


$ sudo adduser tester

$ sudo adduser tester1


创建文件 aclfile,检查其默认的权限信息:



把用户切换为 tester,发现没有写文件的权限:



这是因为 other 没有写 aclfile 文件的权限。


下面我们为 tester 用户赋予读写 aclfile 文件的权限:


$ setfacl -m u:tester:rw aclfile


修改成功后再次以 tester 用户的身份向 aclfile 文件写入数据,这次已经可以正常写入了。查看 aclfile 文件的权限:


$ ll aclfile



貌似并没有发生什么变化,只是在描述权限的地方多出了一个 “+” 号。下面再看看 acl 权限:


$ getfacl aclfile



多出了一些信息,其中比较重要的是 user:tester:rw-,就是它让用户 tester 具有了读写 aclfile 的权限。


针对用户组来设置权限


和针对用户的设置几乎一样,只是把小写的 u 换成小写的 g 就行了。


子文件/目录继承父目录的权限


这是一个很棒的例子,它能让我们创建的子文件或者子文件夹继承父文件夹的权限设置!


$ mkdir mydir

$ ll - d mydir

$ setfacl - m d : u : tester : rwx mydir

$ getfacl mydir


注意参数 d 在这里起到了决定性的作用。下面是设置后的 mydir 目录的权限属性:



这次多出了一些以 default 开头的行,这些 default 权限信息只能在目录上设置,然后会被目录中创建的文件和目录继承。下面分别在 mydir 目录下创建文件 testfile 和目录 testdir,并查看它们的 acl 权限:


$ touch testfile

$ mkdir testdir

$ getfacl testfile

$ getfacl testdir



从上图可以看到文件 testfile 继承了父目录的 acl 权限,因此用户 tester 对它有读写权限。下面再看看 testdir 目录:



从图中可以看出,testdir 目录不仅继承了 tester 的访问权限,还继承了父目录上的 default 权限。也就是说我们通过这种方式设置在目录上的权限可以被子目录递归的继承下去。


更改 ACL 权限


-m 选项其实是在更改文件和目录的 ACL 权限


  • 当一个用户或组的 ACL 权限不存在时,-m 选项执行的是添加操作,

  • 如果一个用户或组的 ACL 权限已经存在时,-m 选项执行的是更新操作。


我们重新创建一个 aclfile 文件,通过下面的命令设置 tester 用户对它的访问权限:


$ setfacl -m u:tester:rwx aclfile



这时 -m 选项是在添加 ACL 权限。然后我们修改 tester 用户的权限,移除其对 aclfile 的执行权限:


$ setfacl -m u:tester:rw aclfile



这时 -m 选项是在更改现有的 ACL 权限。接下来再让我们试一下为不同的用户或组设置 ACL 权限:


$ setfacl -m g:tester1:rwx aclfile



这次是新添加了 group tester1 的权限,并且没有影响 tester 用户的权限。


–set 选项会先清除掉原有的 ACL 权限,然后添加新的权限


我们接着设置 aclfile 文件的 ACL 权限:


$ setfacl --set u::rw,u:tester2:rwx,g::r,o::- aclfile



需要注意的是一定要包含 UGO 权限的设置,不能象 -m 一样只包含 ACL 权限。o::- 是另一个需要注意的地方,其完整的写法是 other::-,就像 u::rw 的完整写法是 user::rw- 一样。通常我们可以把 “-” 省略,但是当权限位只包含 “-” 时,就至少要保留一个。如果写成了o::,就会报错。







请到「今天看啥」查看全文