转自: http://linuxguest.blog.51cto.com/195664/124107

1. 为什么要使用ACL
先让我们来简单地复习一下Linux的file permission.
在linux下,对一个文件(或者资源)可以进行操作的对象被分为三类: file owner(文件的拥有者), group(组,注意不一定是文件拥有者所在的组), other (其他)
而对于每一类别又分别定义了read, write and execute/search permission (这里不讨论SUID, SGID以及Sticky bit的设置)
通过ls -l命令就我们就可以列出一个文件的permission
代码:
# ls -l [leonard@localhost ~]$ ls -l -rw-rw---- 1 leonard admin 0 Jul 3 20:12 test.txt

在这里说明了对于test.txt这个文件leonard用户(由于是file owner)拥有read & write permission. 所有属于admin group的用户(group)拥有read & write permission. 其他任何用户(other)对于文件没有任何的permission
如果我们现在希望john这个用户也可以对test.txt文件进行读写操作. 我自己大概会想到以下几种办法 (这里假设john不属于admin group)
1. 给文件的other类别增加read and write permission. 这样由于john会被归为other类别,那么他也将拥有读写的权限
2. 将john加入到admin group. 那么john会被归为group类别,那么他将拥有读写的权限
3. 设置sudo, 使john能够以leonard的身份对test.txt进行操作,从而获得读写权限
第一种做法的问题在于所有用户都将对test.txt拥有读写操作,显然这种做法不可取
第二种做法的问题在于john被赋予了过多的权限.所有属于admin组的文件,john都可以拥有其等同的权限了
第三种做法虽然可以达到只限定john用户一人拥有对test.txt文件的读写权限.但是需要对sudoers文件进行严格的格式控制. 而且当文件数量和用户很多的时候,这种方法就相当地不灵活了
看来好像都没有一个很好的解决方案. 其实问题就出在Linux file permission里面,对于other的定义过于广泛,以至于很难把permission限定于一个不属于file owner和group的用户身上. 那么Access Control List (ACL)就是用来帮助我们解决这个问题的.
简单地来说ACL就是可以设置特定用户或者用户组对于一个文件的操作权限. 需要掌握的命令也只有三个: getfacl, setfacl, chacl
在接下去讨论之前大家可以先安装上ACL的RPM包
代码:
# rpm -ivh libacl-2.2.39-1.1 acl-2.2.39-1.1.i386.rpm

2. ACL的名词定义
先来看看在ACL里面每一个名词的定义.这些名词我大多从man page上摘下来虽然有些枯燥,但是对于理解下面的内容还是很有帮助的
ACL 是由一系列的Access Entry所组成的. 每一条Access Entry定义了特定的类别可以对文件拥有的操作权限. Access Entry有三个组成部分: Entry tag type, qualifier (optional), permission
我们先来看一下最重要的Entry tag type, 它有以下几个类型
ACL_USER_OBJ: 相当于Linux里file_owner的permission
ACL_USER: 定义了额外的用户可以对此文件拥有的permission
ACL_GROUP_OBJ: 相当于Linux里group的permission
ACL_GROUP: 定义了额外的组可以对此文件拥有的permission
ACL_MASK: 定义了ACL_USER, ACL_GROUP_OBJ和ACL_GROUP的最大权限 (这个我下面还会专门讨论)
ACL_OTHER: 相当于Linux里other的permission
让我们来据个例子说明一下. 下面我们就用getfacl命令来查看一个定义好了的ACL文件
代码:
[leonard@localhost ~]$ getfacl ./test.txt # file: test.txt # owner: leonard # group: admin user::rw- user:john:rw- group::rw- group:dev:r-- mask::rw- other::r--

前面三个以#开头的定义了文件名,file owner和group. 这些信息没有太大的作用,接下来我们可以用 --omit-header来省略掉
user::rw- 定义了ACL_USER_OBJ, 说明file owner拥有read and write permission
user:john:rw- 定义了ACL_USER,这样用户john就拥有了对文件的读写权限,实现了我们一开始要达到的目的
group::rw- 定义了ACL_GROUP_OBJ,说明文件的group拥有read and write permission
group:dev:r-- 定义了ACL_GROUP,使得dev组拥有了对文件的read permission
mask::rw- 定义了ACL_MASK的权限为read and write
other::r-- 定义了ACL_OTHER的权限为read
从这里我们就可以看出ACL提供了我们可以定义特定用户和用户组的功能. 那么接下来我们就来看一下如何设置一个文件的ACL

3. 如何设置ACL文件
首先我们还是要讲一下设置ACL文件的格式. 从上面的例子中我们可以看到每一个Access Entry都是由三个被:号分隔开的字段所组成. 第一个就是Entry tag type
user 对应了ACL_USER_OBJ和ACL_USER
group 对应了ACL_GROUP_OBJ和ACL_GROUP
mask 对应了ACL_MASK
other 对应了ACL_OTHER
第二个字段称之为qualifier.也就是上面例子中的john和dev组.它定义了特定用户和拥护组对于文件的权限.这里我们也可以发现只有user和group才有qualifier,其他的都为空
第三个字段就是我们熟悉的permission了. 它和Linux的permission一样定义,这里就不多讲了
下面我们就来看一下怎么设置test.txt这个文件的ACL让它来达到我们上面的要求
一开始文件没有ACL的额外属性
代码:
[leonard@localhost ~]$ ls -l -rw-rw-r-- 1 leonard admin 0 Jul 3 22:06 test.txt

[leonard@localhost ~]$ getfacl --omit-header ./test.txt

user::rw-

group::rw-

other::r--

我们先让用户john拥有对test.txt文件的读写权限
代码:
[leonard@localhost ~]$ setfacl -m user:john:rw- ./test.txt

[leonard@localhost ~]$ getfacl --omit-header ./test.txt

user::rw-

user:john:rw-

group::rw-

mask::rw-

other::r--

这时我们就可以看到john用户在ACL里面已经拥有了对文件的读写权限. 这个时候如果我们查看一下linux的permission我们还会发现一个不一样的地方
代码:
[leonard@localhost ~]$ ls -l ./test.txt -rw-rw-r--+ 1 leonard admin 0 Jul 3 22:06 ./test.txt

在文件permission的最后多了一个+号. 当任何一个文件拥有了ACL_USER或者ACL_GROUP的值以后我们就可以称它为ACL文件.这个+号就是用来提示我们的
我们还可以发现当一个文件拥有了ACL_USER或者ACL_GROUP的值时ACL_MASK同时也会被定义
接下来我们来设置dev组拥有read permission
代码:
[leonard@localhost ~]$ setfacl -m group:dev:r-- ./test.txt

[leonard@localhost ~]$ getfacl --omit-header ./test.txt

user::rw-

user:john:rw-

group::rw-

group:dev:r--

mask::rw-

other::r--

到这里就完成了我们上面讲到的要求.是不是很简单呢

4. ACL_MASK 和 Effective permission
这里需要重点讲一下ACL_MASK, 因为这是掌握ACL的另一个关键
在Linux file permission里面大家都知道比如对于rw-rw-r--来说, 当中的那个rw-是指文件组的permission. 但是在ACL里面这种情况只是在ACL_MASK不存在的情况下成立. 如果文件有ACL_MASK值,那么当中那个rw-代表的就是mask值而不再是group permission了
让我们来看下面这个例子
代码:
[leonard@localhost ~]$ ls -l -rwxrw-r-- 1 leonard admin 0 Jul 3 23:10 test.sh

这里说明test.sh文件只有file owner: leonard拥有read, write, execute/search permission. admin组只有read and write permission
现在我们想让用户john也对test.sh具有和leonard一样的permission
代码:
[leonard@localhost ~]$ setfacl -m user:john:rwx ./test.sh

[leonard@localhost ~]$ getfacl --omit-header ./test.sh

user::rwx

user:john:rwx

group::rw-

mask::rwx

other::r--

这里我们看到john已经拥有了rwx的permission. mask值也被设定为rwx.那是因为它规定了ACL_USER, ACL_GROUP和ACL_GROUP_OBJ的最大值
现在我们再来看test.sh的Linux permission, 它已经变成了
代码:
[leonard@localhost ~]$ ls -l -rwxrwxr--+ 1 leonard admin 0 Jul 3 23:10 test.sh

那么如果现在admin组的用户想要执行test.sh的程序会发生什么情况呢? 它会被permission deny.原因在于实际上admin组的用户只有read and write permission.这里当中显示的rwx是ACL_MASK的值而不是group的permission
所以从这里我们就可以知道,如果一个文件后面有+标记,我们都需要用getfacl来确认它的permission,以免发生混淆
下面我们再来继续看一个例子
假如现在我们设置test.sh的mask为read only,那么admin组的用户还会有write permission吗?
代码:
[leonard@localhost ~]$ setfacl -m mask::r-- ./test.sh

[leonard@localhost ~]$ getfacl --omit-header ./test.sh

user::rwx

user:john:rwx #effective:r--

group::rw- #effective:r--

mask::r--

other::r--

这时候我们可以看到ACL_USER和ACL_GROUP_OBJ旁边多了个#effective:r--, 这是什么意思呢?
让我们再来回顾一下ACL_MASK的定义. 它规定了ACL_USER, ACL_GROUP_OBJ和ACL_GROUP的最大权限.那么在我们这个例子中他们的最大权限也就是read only.虽然我们这里给ACL_USER和ACL_GROUP_OBJ设置了其他权限,但是他们真正有效果的只有read权限.
这时我们再来查看test.sh的Linux file permission时它的group permission也会显示其mask的值(i.e. r--)
代码:
[leonard@localhost ~]$ ls -l -rwxr--r--+ 1 leonard admin 0 Jul 3 23:10 test.sh

5. Default ACL
上面我们所有讲的都是Access ACL, 也就是对文件而言. 下面我简单讲一下Default ACL. Default ACL是指对于一个目录进行Default ACL设置,并且在此目录下建立的文件都将继承此目录的ACL
同样我们来做一个试验说明
比如现在leonard用户建立了一个dir目录
代码:
[leonard@localhost ~]$ mkdir dir

他希望所有在此目录下建立的文件都可以被john用户所访问. 那么我们就应该对dir目录设置Default ACL
代码:
[leonard@localhost ~]$ setfacl -d -m user:john:rw ./dir

[leonard@localhost ~]$ getfacl --omit-header ./dir

user::rwx

group::rwx

other::r-x

default:user::rwx

default:user:john:rwx

default:group::rwx

default:mask::rwx

default:other::r-x

这里我们可以看到ACL定义了default选项, john用户拥有了default的read, write, excute/search permission.所有没有定义的default都将从file permission里copy过来
现在leonard用户在dir下建立一个test.txt文件
代码:
[leonard@localhost ~]$ touch ./dir/test.txt

[leonard@localhost ~]$ ls -l ./dir/test.txt -rw-rw-r--+ 1 leonard leonard 0 Jul 3 23:46 ./dir/test.txt

[leonard@localhost ~]$ getfacl --omit-header ./dir/test.txt

user::rw-

user:john:rw-

group::rwx #effective:rw-

mask::rw-

other::r--

这里我们看到在dir下建立的文件john用户自动就有了read and write permission

6. ACL 相关命令
前面的例子中我们都注意到了getfacl命令是用来读取文件的ACL, setfacl是用来设定文件的Acess ACL. 这里还有一个chacl是用来改变文件和目录的Access ACL and Default ACL. 它的具体参数大家可以去看man page. 我只想提及一下chacl -B. 它可以彻底删除文件或者目录的ACL属性(包括Default ACL). 比如你即使用了setfacl -x删除了所有文件的ACL属性,那个+号还是会出现在文件的末尾.所以正确的删除方法应该是用chacl -B

用cp来复制文件的时候我们现在可以加上-p选项.这样在拷贝文件的时候也将拷贝文件的ACL属性.对于不能拷贝的ACL属性将给出警告
mv命令将会默认地移动文件的ACL属性. 同样如果操作不允许的情况下会给出警告

7. 需要注意的几点
如果你的文件系统不支持ACL的话,你也许需要重新mount你的file system
mount -o remount, acl [mount point]
如果用chmod命令改变Linux file permission的时候相应的ACL值也会改变.反之改变ACL的值,相应的file permission也会改变

Linux ACL管理详解的更多相关文章

  1. Linux进程管理详解

    何谓进程?进程,就是正在执行的一个程序或命令,每一个进程都是一个运行实体,有自己的地址空间,并占用一定的系统资源.简而言之,进程就是运行中的程序.在Linux中,诸如ls等命令都是进程,只不过某些命令 ...

  2. Linux学习之ACL权限详解(十)

    Linux系统ACL权限详解 目录 ACL权限简介与开启 查看与设定ACL权限 最大有效权限与删除ACL权限 默认ACL权限和递归ACL权限 ACL权限简介与开启权限 ACL权限简介 用户权限管理始终 ...

  3. [转帖]linux screen 命令详解,xshell关掉窗口或者断开连接,查看断开前执行的命令

    linux screen 命令详解,xshell关掉窗口或者断开连接,查看断开前执行的命令 https://binwaer.com/post/12.html yun install -y screen ...

  4. Linux /dev目录详解和Linux系统各个目录的作用

    Linux /dev目录详解(转http://blog.csdn.net/maopig/article/details/7195048) 在linux下,/dev目录是很重要的,各种设备都在下面.下面 ...

  5. 【转发】linux yum命令详解

    linux yum命令详解 yum(全 称为 Yellow dog Updater, Modified)是一个在Fedora和RedHat以及SUSE中的Shell前端软件包管理器.基於RPM包管理, ...

  6. linux yum 命令 详解

    linux yum命令详解 yum(全称为 Yellow dog Updater, Modified)是一个在Fedora和RedHat以及SUSE中的Shell前端软件包管理器.基於RPM包管理,能 ...

  7. linux lsof命令详解

    linux lsof命令详解 简介 lsof(list open files)是一个列出当前系统打开文件的工具.在linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访 ...

  8. Linux启动流程详解【转载】

    在BIOS阶段,计算机的行为基本上被写死了,可以做的事情并不多:一般就是通电.BIOS.主引导记录.操作系统这四步.所以我们一般认为加载内核是linux启动流程的第一步. 第一步.加载内核 操作系统接 ...

  9. linux yum+wget详解

    在做自动化测试的时候,有个test需要执行命令:wget http://www.aliyun.com,但是返回的结果是未找到命令wget,于是百度了相关资料,发现没有安装wget,于是利用yum in ...

随机推荐

  1. Something about "if"

    分支:If引导了一个分支,语法结构有{if:if, else if,else:if,else:等}if可以单独使用,不一定非要加else,但是为了语句的严谨或者程序的稳定,请尽量使用else(注意if ...

  2. 移动终端app测试点总结

    以下所有测试最后必须在真机上完整的执行1.安装.卸载测试 在真机上的以及通过91等第三方的安装与卸载 安装在手机上还是sd卡上 2.启动app测试3.升级测试 数字签名.升级覆盖安装.下载后手动覆盖安 ...

  3. flume file channel 异常解决

    1. 错误提示 -- ::, (SinkRunner-PollingRunner-DefaultSinkProcessor) [ERROR - org.apache.flume.SinkRunner$ ...

  4. iOS __strong __weak @Strongify @Weakify

    @Strongify,@Weakify主要是在block中使用. 因为block一般都在对象内部声明.. 如果在block内部使用了当前对象的属性,就会造成循环引用(block拥有当前对象的地址,而当 ...

  5. JSON字符串和对象之间的转换

    JSON(JavaScript Object Notation) 是JavaScript编程语言的一个子集.正因JSON是JavaScript的一个子集,所以它可清晰的运用于此语言中. eval函数 ...

  6. 修改WordPress中上传附件2M大小限制的方法/php+iis上传附件默认大小修改方法

    在服务器上架设好WordPress后,使用过程中发现,上传附件大小有2M的限制 话说服务器就是本机,可以直接把文件拖到附件存储文件夹下,然后在需要附件的地方引用链接 可是这种落后的方法终究不是办法,还 ...

  7. Drawing Arc Using ArcSegment in XAML

    We can use the Arc XAML element to draw arcs in XAML. Besides drawing arcs using the Arc element, we ...

  8. ural 1338. Automobiles

    1338. Automobiles Time limit: 3.0 secondMemory limit: 64 MB Everyone knows what traffic congestion i ...

  9. Node.js 手册查询-5-Ejs 方法

    express 中使用 //设置模板目录 app.set('views', path.join(__dirname, 'views')); //设置模板引擎 app.set('view engine' ...

  10. [译]使用Continuous painting mode来分析页面的绘制状态

    Chrome Canary(Chrome “金丝雀版本”)目前已经支持Continuous painting mode,用于分析页面性能.这篇文章将会介绍怎么才能页面在绘制过程中找到问题和怎么利用这个 ...