Linux中ACL文件访问控制列表
在 Linux下,对一个文件(或者资源)可以进行操作的对象被分为三类: file owner(文件的拥有者),group(组,可以不是文件拥有者所在的组), other (其他)而对于每一类别又分别定义了读、写、执行(read, write and execute )权限以及特殊权限。但是这些权限只能搭配使用而已,如果想要对其其他用户组或者其他用户里的某一位用户设定一些不同的权限,就不行了。
LINUX上的ACL访问控制列表,主要的目的是在提供传统的owner,group,others的read,write,execute权限之外的局部权限设定。ACL可以针对单个用户,单个文件或目录来进行r,w,x的权限设定,特别适用于需要特殊权限的使用情况。简单地来说,ACL就是可以设置特定用户或用户组对于一个文件/目录的操作权限,可以实现灵活的权限管理,除了文件的所有者,所属组和其它人,可以对更多的用户设置权限。简单地来说ACL就是可以设置特定用户或者用户组对于一个文件/文件夹的操作权限。
由于ACL是传统的类unix操作系统权限的额外支持项目,因此需要使用ACL必须要有文件系统的支持才行。目前大多数的文件系统都支持ACL。(ACL访问控制列表需要内核支持,在Linux内核2.6以后默认加入了ACL功能)
ACL管理命令: getfacl, setfacl, chacl
acl是一个可以被acl_from_text程序分析出各用户权限的字符串。该字符串用逗号分隔成多个片段
每个片段的形式都如:tag:name:perm
tag可以是下面形式的一种:
"user" (or "u")表示这是一个用户的ACL条目。
"group" (or "g")表示这是一个用户组的ACL条目。
"other" (or "o")表示这是其它的ACL条目。即没有在ACL指定的用户和组的ACL条目。
"mask" (or "m")表示这是一个掩码的ACL条目。在指定其它非用户属主的ACL权限时,这个掩码条目必须被指定,否则执行chacl命令会出错。
name可以是用户名或组名。如果不指定,那么默认是给文件或目录的属主或用户组指定acl权限。当然name也可以是用户的uid或者组的gid。
perm是指该用户或组所具有的权限,它是由"rwx"组成的一个字符串,什么意思当然大家都明白了。如果要使该用户或组不具有某种权限,简单的以"-"代替指定的字母就可以了。例如"r-x"是只具有读,执行权限。
getfacl
使用getfacl可以获取文件访问控制列表
使用方法: getfacl [-aceEsRLPtpndvh] 文件 ...
-a, --access 仅显示文件访问控制列表
-d, --default 仅显示默认的访问控制列表
-c, --omit-header 不显示注释表头
-e, --all-effective 显示所有的有效权限
-E, --no-effective 显示无效权限
-s, --skip-base 跳过只有基条目(base entries)的文件
-R, --recursive 递归显示子目录
-L, --logical 逻辑遍历(跟随符号链接)
-P, --physical 物理遍历(不跟随符号链接)
-t, --tabular 使用制表符分隔的输出格式
-n, --numeric 显示数字的用户/组标识
-p, --absolute-names 不去除路径前的 '/' 符号
-v, --version 显示版本并退出
-h, --help 显示本帮助信息
获取文件ACL访问控制列表:
getfacl test.txt
# file: test.txt
# owner: root
# group: family
user::rw-
group::rw-
mask::rw-
other::---
前三行以#开头的定义了文件名,文件所有者和文件拥有组. 这些信息没有太大的作用,可以用 --omit-header来省略掉
user::rw- 定义了ACL_USER_OBJ, 说明file owner拥有读和写的权限
group::rw- 定义了ACL_GROUP_OBJ,说明文件的group拥有read和write 权限
mask::rw- 定义了ACL_MASK的权限为read and write
other::--- 定义了ACL_OTHER的没有任何权限操作此文件
ACL由一系列的访问控制权限组成,主要的有如下:
ACL_USER_OBJ: 相当于Linux里file_owner的权限
ACL_USER: 定义了额外的用户可以对此文件拥有的权限
ACL_GROUP_OBJ: 相当于Linux里group的权限
ACL_GROUP: 定义了额外的组可以对此文件拥有的权限
ACL_MASK: 定义了ACL_USER, ACL_GROUP_OBJ和ACL_GROUP的最大权限
ACL_OTHER: 相当于Linux里other的权限
setfacl
使用setfacl设定文件访问控制列表
用法: setfacl [-bkndRLP] { -m|-M|-x|-X ... } file ...
-m, --modify=acl 更改文件的访问控制列表
-M, --modify-file=file 从文件读取访问控制列表条目更改
-x, --remove=acl 根据文件中访问控制列表移除条目
-X, --remove-file=file 从文件读取访问控制列表条目并删除
-b, --remove-all 删除所有扩展访问控制列表条目
-k, --remove-default 移除默认访问控制列表
--set=acl 设定替换当前的文件访问控制列表
--set-file=file 从文件中读取访问控制列表条目设定
--mask 重新计算有效权限掩码
-n, --no-mask 不重新计算有效权限掩码
-d, --default 应用到默认访问控制列表的操作
-R, --recursive 递归操作子目录
-L, --logical 依照系统逻辑,跟随符号链接
-P, --physical 依照自然逻辑,不跟随符号链接
--restore=file 恢复访问控制列表,和“getfacl -R”作用相反
--test 测试模式,并不真正修改访问控制列表属性
-v, --version 显示版本并退出
-h, --help 显示本帮助信息
-:如果文件名是-,则setfacl将从标准输入读取文件名。
选项-m和-x后边跟以acl规则。多条acl规则以逗号(,)隔开。选项-M和-X用来从文件或标准输入读取acl规则。
选项--set和--set-file用来设置文件或目录的acl规则,先前的设定将被覆盖。
选项-m(--modify)和-M(--modify-file)选项修改文件或目录的acl规则。
选项-x(--remove)和-X(--remove-file)选项删除acl规则。
设置ACL访问控制列表:
setfacl -m u:zyq:rwx test.sh
user 对应ACL_USER_OBJ和ACL_USER简写为u
group 对应ACL_GROUP_OBJ和ACL_GROUP简写为g
mask 对应ACL_MASK
other 对应ACL_OTHER简写为o
第二个字段称之为qualifier.也就是上面例子中的zyq和jackuser组.它定义了特定用户和用户组
对于文件的权限.这里我们也可以发现只有user和group才有qualifier,其他的都为空
第三个字段就是我们熟悉的权限了. 它和Linux的权限一样定义,这里就不多讲了
当设置过ACL访问控制权限就会在在文件权限的最后多了一个+号。
chacl
chacl是用来更改文件或目录的访问控制列表的命令。
chacl命令的格式是: chacl acl filename1 filename2
chacl就是一个改变文件存取控制列表的一个命令。
-b 表明这里有两个acl需要修改,前一个acl是文件的acl,后一个是目录的默认acl。
-d 设定目录的默认acl,这个选项是比较有用的。如果指定了目录的默认acl,在这个目录下新建的文件或目录都会继承目录的acl。
-R 只删除文件的acl
-D 只删除目录的默认acl,是-d的反向操作。
-B 删除文件和目录默认的acl。是-b的反向操作。
-r 递归地修改文件和目录的acl权限。
-l 列出文件和目录的acl权限。
使用过ACL之后即使用了setfacl -x删除了所有文件的ACL属性,那个+号还是会出现在文件的末尾.如果不想让他显示则可以使用chacl -B
用cp来复制文件的时候我们现在可以加上-p选项.这样在拷贝文件的时候也将拷贝文件的ACL属性.对于不能拷贝的ACL属性将给出警告
mv命令将会默认地移动文件的ACL属性. 同样如果操作不允许的情况下会给出警告
MASK和effective
ACL_MASK是掌握ACL的另一个关键。ACL_MASK规定了ACL_USER, ACL_GROUP_OBJ和ACL_GROUP的最大权限.当我们设置一个文件的ACL_USER或者ACL_GROUP时,ACL_MASK同时也会被定义,一但文件设置ACL之后文件的用户组权限位就会被替换成ACL_Mask值。
Default ACL
Default ACL是指对于一个目录进行Default ACL设置,并且在此目录下建立的文件都将继承此目录的ACL,ACL定义了default选项, 当某一个用户拥有了default的read, write, excute/search 权限.但是却无法删除和创建文件。如果需要执行权限需要把目录的ACL_USER修改为那个用户后才能在那个目录中删除和创建文件。