为什么80%的码农都做不了架构师?>>>
某些系统账号希望对某一些文件有管理权限,有三种方法:
1 加入属主所在的同一个组中,这等于扩大了访问其他文件的权限了。
2 加入other中,这样权限放开的更大了。
3 给文件的sudo权限。
4 采用acl策略。
前三种方法都有自己的缺点,最终考虑使用acl。
所谓ACL,就是Access Control List,一个文件/目录的访问控制列表,可以针对任意指定的用户/组分配RWX权限。此功能
需要内核的支持,在linux 2.6以后默认加入内核中。
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的权限
安装acl
apt-get install acl
重新挂载分区
mount -o remount,rw,acl /dev/sda3
分区在不支持acl的情况下getfacl可以工作,但是setfacl不能够工作的。
下图所示默认的acl规则
#注释表明了文件的默认用户和所属组
user::rw- 定义了ACL_USER_OBJ, 说明root拥有读和写的权限
group::--- 定义了ACL_GROUP_OBJ,说明任何人都没有权限
other::--- 定义了ACL_OTHER,说明任何人都没有权限
在设置acl规则前我们先了解一下设置acl常用的选项:
-b,--remove-all
删除所有扩展的acl规则,基本的acl规则(所有者,群组,其他)将被保留。
-k,--remove-default
删除缺省的acl规则。如果没有缺省规则,将不提示。
-n,--no-mask
不要重新计算有效权限。setfacl默认会重新计算ACL mask,除非mask被明确的制定。
--mask
重新计算有效权限,即使ACL mask被明确指定。
-d,--default
设定默认的acl规则。
--restore=file
从文件恢复备份的acl规则(这些文件可由getfacl -R产生)。通过这种机制可以恢复整个目录树的acl规则。此参数不能 和除--test以外的任何参数一同执行。
--test
测试模式,不会改变任何文件的acl规则,操作后的acl规格将被列出。
-R,--recursive
递归的对所有文件及目录进行操作。
-P,--physical
跳过所有符号链接,包括符号链接文件。
-m -x -M -X
-m -x 是在设置acl所需要定义的选项,-m 表示设置acl ,-x 表示删除acl规则
-M -X 则可以在文件中读入acl规则,使相应的规则生效
用cp来复制文件的时候我们现在可以加上-p选项.这样在拷贝文件的时候也将拷贝文件的ACL属性.对于不能拷贝的ACL属
性将给出警告
mv命令将会默认地移动文件的ACL属性. 同样如果操作不允许的情况下会给出警告
开始设置规则:
用test用户访问perl.pl文件,显示如下:
设置acl规则
这时候我们会看到在权限位后面多了一个+号,这个符号提示我们此文件使用了acl,而且你还会看到在ls -l 的输出中
perl.pl的组权限变成read了,在acl的mask不存在的情况下,权限位的第二组才表示组的权限,如果acl中存在mask,则第二
组权限位代表mask值,mask规定了ACL_USER, ACL_GROUP和ACL_GROUP_OBJ的最大值,在设置的权限相冲突的情况下以
设置的mask为主。
可以看到test用户可以访问perl.pl文件了。
删除设置的acl
可以看到acl规则已经删除,怎么在权限位的后面还有一个加号呢,要完全删除需要使用-b参数
还可以设置默认的acl规则,如希望在某个目录下的新建文件都使用同一个acl规则,则可以对某个目录设置默认acl规则
使其新建文件都采用默认acl规则
在目录中建好文件后发现出现了#effective,ACL_MASK的定义. 它规定了ACL_USER(其他用户), ACL_GROUP_OBJ(组权限)和ACL_GROUP(其他组的权限)的最大权限,所以test组真正的权限是rw,怎么改变mask值呢?
也可以从文件中恢复文件原有的acl规则,如下:先保存规则到一个文件中
开始删除规则
开始恢复规则
以上只是简单的一些用法,更多用法参考man