Linux基础入门之facl

  • A+
所属分类:Linux  Linux基础

一、摘要

用户权限管理始终是Unix系统管理中最重要的环节。大家对 Linux/Unix 的 UGO 权限管理方式一定不陌生,还有最常用的 chmod 命令。为了实现一些比较复杂的权限管理,往往不得不创建很多的组,并加以详细的记录和区分(很多时候就是管理员的噩梦)。

可以针对某一个用户对某一文件指定一个权限,恐怕管理员都期待的功能。比如对某一个特定的文件,用户A可以读取,用户B所在的组可以修改,惟独用户B不可以……。于是就有了IEEE POSIX 1003.1e这个ACL的标准。所谓ACL,就是Access Control List(访问控制列表),一个文件/目录的访问控制列表,可以针对任意指定的用户/组分配RWX权限。

现在主流的商业Unix系统都支持ACL。FreeBSD也提供了对ACL的支持。Linux在这个方面也不会落后,从2.6版内核开始支持ACL

为什么说是facl?f=FILE,这篇文章主要说的是Linux系统文件的acl(文件访问控制列表)。


facl:File Access Control List

如果有个用户是openstack,如何让openstack用户自己的一个默认创建的文件而docker用户有读写执行,这该怎么做?(注意:这里的openstack用户和docker用户是完全不相干的两个,两个用户都不是管理员身份,也都不是属于同一个组,而且文件是默认创建的644权限)

下面我们来试验下正常路径能否行得通?

[root@www.dwhd.org /tmp/facl]# useradd openstack
[root@www.dwhd.org /tmp/facl]# useradd docker
[root@www.dwhd.org /tmp/facl]# su - openstack
[openstack@www.dwhd.org ~]$ cd /tmp/facl/
[openstack@www.dwhd.org /tmp/facl]$ touch openstact_facl_test
[openstack@www.dwhd.org /tmp/facl]$ ls -l openstact_facl_test
-rw-rw-r-- 1 openstack openstack 0 5月  26 20:18 openstact_facl_test
[openstack@www.dwhd.org /tmp/facl]$ exit
logout
[root@www.dwhd.org /tmp/facl]# su - docker
[docker@www.dwhd.org ~]$ cd /tmp/facl/
[docker@www.dwhd.org /tmp/facl]$ echo -e "this a test facl\n`date`" >> /tmp/facl/openstact_facl_test
-bash: /tmp/facl/openstact_facl_test: 权限不够
[docker@www.dwhd.org /tmp/facl]$ 

Linux基础入门之facl

经过上面的实验有人可能说了 我们可以用openstack用户或者管理员来执行chmod o+w让文件other用户都有写权限啊,这样做是完全可以达到效果了,但是是否想过其他用户是不是都有了写权限?安全性问题在解决?

经过上文的实验我们可以通过facl机制,实现普通用户可以单独像某用户或某组授予对某文件的访问权限,而不通过修改文件的OUG来实现的

在我们的Linux中其文件都有扩展属性,可以通过目录lsattr来查看

在我们的Linux中其文件都的扩展熟悉修改,可以通过目录chattr来做到

扩展属性常用几个标记解释

a 不能删除不能修改只能追加内容
c 压缩的格式
d 标记为尚未备份(清除备份标记)
e 扩展格式
i 可以真正组织管理员对文件的写权限
j 设置数据日志
s 安全删除
t 不在尾部执行合并
u 不可删除
A 不更新访问时间戳(系统调优时常用到的,让频繁访问的文件不更新时间戳)
D 目录同步更新(说明这个目录写的文件我都是立即从内存写到磁盘的)
S 文件同步更新
T 设置目录为顶级目录结构(chroot用到的)

 

[docker@www.dwhd.org /tmp/facl]$ lsattr /tmp/facl/openstact_facl_test
-------------e- /tmp/facl/openstact_facl_test
[docker@www.dwhd.org /tmp/facl]$ 

Linux基础入门之facl
Linux基础入门之facl

 在Linux上如何查看acl支持的文件系统

[docker@www.dwhd.org /tmp/facl]$ grep -i acl /boot/config*
CONFIG_EXT2_FS_POSIX_ACL=y
CONFIG_EXT3_FS_POSIX_ACL=y
CONFIG_EXT4_FS_POSIX_ACL=y
CONFIG_REISERFS_FS_POSIX_ACL=y
CONFIG_JFS_POSIX_ACL=y
CONFIG_FS_POSIX_ACL=y
CONFIG_XFS_POSIX_ACL=y
CONFIG_BTRFS_FS_POSIX_ACL=y
CONFIG_GENERIC_ACL=y
CONFIG_TMPFS_POSIX_ACL=y
CONFIG_JFFS2_FS_POSIX_ACL=y
CONFIG_NFS_V3_ACL=y
CONFIG_NFSD_V2_ACL=y
CONFIG_NFSD_V3_ACL=y
CONFIG_NFS_ACL_SUPPORT=m
CONFIG_CIFS_ACL=y
[docker@www.dwhd.org /tmp/facl]$ 

Linux基础入门之facl
下面是检查当前系统分区是否支持acl

[root@www.dwhd.org /tmp/facl]# tune2fs -l `df -hP | awk '$6=="/" && $1~/\/dev\/[a-z]+/ {print $1}'` | awk '/acl/{print}'
Default mount options:    user_xattr acl
[root@www.dwhd.org /tmp/facl]# 

Linux基础入门之facl
如果上面检测没有acl那么你可以按照下面的操作来实现分区支持acl

[root@www.dwhd.org /tmp/facl]# mount -o remount,acl /
[root@www.dwhd.org /tmp/facl]# tune2fs -l `df -hP | awk '$6=="/" && $1~/\/dev\/[a-z]+/ {print $1}'` | awk '/acl/{print}'
Default mount options:    user_xattr acl
[root@www.dwhd.org /tmp/facl]# 

Linux基础入门之facl

再来扩展属性的实验(真正阻止管理员写某个文件可以对文件设置扩展属性 i 位

[root@www.dwhd.org /tmp/facl]# touch facl.root                      #root用户创建了一个facl.root文件
[root@www.dwhd.org /tmp/facl]# chmod a-w facl.root                  #给文件facl.root减去所有用户的写权限
[root@www.dwhd.org /tmp/facl]# ls -l facl.root                      #查看facl.root文件的权限
-r--r--r-- 1 root root 0 5月  26 21:14 facl.root
[root@www.dwhd.org /tmp/facl]# echo "test `date +%F`" > facl.root   #在文件没有任何写权限的前题下对文件进行写操作
[root@www.dwhd.org /tmp/facl]# cat facl.root                        #查看facl.root文件被写入的内容
test 2015-05-26
[root@www.dwhd.org /tmp/facl]# chattr +i facl.root                  #给文件facl.root添加i扩展属性
[root@www.dwhd.org /tmp/facl]# echo "test `date +%F`" > facl.root   #再次对文件facl.root做写操作
bash: facl.root: 权限不够                                           #啊哈 居然对root用户提示权限不够了 哈哈哈
[root@www.dwhd.org /tmp/facl]# lsattr facl.root                     #查看facl.root文件的扩展熟悉多了个i了哦
----i--------e- facl.root
[root@www.dwhd.org /tmp/facl]# 

Linux基础入门之facl

facl:也是通过设置文件的扩展熟悉来让普通用户有了其他权限的功能,不过这里的扩展属性和上面说的文件的扩展属性不是一个东西

让普通用户透过文件的扩展熟悉,为其添加额外的用户访问机制而无需改变期属主属组也不用更改other的权限

getfacl

getfacl FILE...

setfacl -m (u|g):(U|G):MODE FILE... 添加授权 (前题是文件属主是自己)

-m u:USERNAME:MOD FILE...

-m g:GROUPNAME:MODE FILE...

setfacl -x (u|g):(USER|GROUP) FILE...取消授权

-x u:USERNAME FILE...

-x g:GROUPNAME FILE...

-R:递归 (仅对目录中已有的文件就做修改

--set:覆盖

同一个文件可以对多个用户或用户组做facl设定

栗子:

[root@www.dwhd.org /tmp/facl]# su - openstack                                     #切换到openstack用户
[openstack@www.dwhd.org ~]$ cd /tmp/facl/
[openstack@www.dwhd.org /tmp/facl]$ setfacl -m u:docker:rw openstact_facl_test    #给openstact_facl_test文件添加docker用户有读写的扩展权限
[openstack@www.dwhd.org /tmp/facl]$ getfacl openstact_facl_test                   #查看openstact_facl_test文件的扩展权限
# file: openstact_facl_test
# owner: openstack
# group: openstack
user::rw-
user:docker:rw-                                                                   #可以看出docker有了读写权限
group::rw-
mask::rw-
other::r--

[openstack@www.dwhd.org /tmp/facl]$ ls -l openstact_facl_test                     #用ls -l查看文件权限 UGO的权限都没变
-rw-rw-r--+ 1 openstack openstack 0 5月  26 20:18 openstact_facl_test
[openstack@www.dwhd.org /tmp/facl]$ exit                                          #回到root用户
logout
[root@www.dwhd.org /tmp/facl]# su - docker                                        #切换到docker用户
[docker@www.dwhd.org ~]$ cd /tmp/facl/
[docker@www.dwhd.org /tmp/facl]$ echo "`date "+%F %H%M%S"`" >> openstact_facl_test #给文件openstact_facl_test写入内容
[docker@www.dwhd.org /tmp/facl]$ cat openstact_facl_test                           #内容写入成功

2015-05-26 215455
[docker@www.dwhd.org /tmp/facl]$ 

Linux基础入门之facl

假设一个文件testfacl的扩展属性用户docker有读写权限,docker用户的扩展组还有个slackware,而slackware组在testfacl扩展熟悉里面没有任何权限。那么docker对testfacl是否有读写权限呢?如果没有是为什么呢?如果有又是为什么?

对于上面问题来个实际操作看看就知道。。

[root@www.dwhd.org /tmp/facl]# usermod -a -G slackware docker          给docker用户添加扩展组slackware
[root@www.dwhd.org /tmp/facl]# id docker
uid=504(docker) gid=505(docker) 组=505(docker),502(slackware)
[root@www.dwhd.org /tmp/facl]# su - redhat                              #切换到redhat用
[redhat@www.dwhd.org ~]$ cd /tmp/facl/                                  #进入/tmp/facl目录
[redhat@www.dwhd.org /tmp/facl]$ touch testfacl                         #创建了testfacl文件
[redhat@www.dwhd.org /tmp/facl]$ ls -l testfacl
-rw-rw-r-- 1 redhat redhat 0 5月  26 22:15 testfacl
[redhat@www.dwhd.org /tmp/facl]$ chmod a-w testfacl                     #取下了testfacl UGO的写权限
[redhat@www.dwhd.org /tmp/facl]$ ls -l testfacl
-r--r--r-- 1 redhat redhat 0 5月  26 22:15 testfacl
[redhat@www.dwhd.org /tmp/facl]$ setfacl -m g:slackware:--- testfacl    #给testfacl扩展属性规定slackware没有任何权限
[redhat@www.dwhd.org /tmp/facl]$ setfacl -m u:docker:rw testfacl        #给testfacl扩展属性用户添加读写权限
[redhat@www.dwhd.org /tmp/facl]$ getfacl testfacl
# file: testfacl
# owner: redhat
# group: redhat
user::r--
user:docker:rw-
group::r--
group:slackware:---
mask::rw-
other::r--

[redhat@www.dwhd.org /tmp/facl]$ exit
logout
[root@www.dwhd.org /tmp/facl]# su - docker                              #切换到docker
[docker@www.dwhd.org ~]$ cd /tmp/facl/
[docker@www.dwhd.org /tmp/facl]$ echo "from docker 1" > testfacl        #对文件testfacl文件进行写操作
[docker@www.dwhd.org /tmp/facl]$ cat testfacl                           #写成功
from docker 1
[docker@www.dwhd.org /tmp/facl]$ 

Linux基础入门之facl

启用facl之后的权限应用模型:

属主:

用户级别的facl:

属组:

组级别的facl:

other

再来看看下面的示例:

[root@www.dwhd.org /tmp/facl]# touch testfacl
[root@www.dwhd.org /tmp/facl]# chmod g-w testfacl
[root@www.dwhd.org /tmp/facl]# ls -l testfacl
-rw-r--r-- 1 root root 0 5月  26 23:15 testfacl
[root@www.dwhd.org /tmp/facl]# getfacl testfacl
# file: testfacl
# owner: root
# group: root
user::rw-
group::r--
other::r--

[root@www.dwhd.org /tmp/facl]# setfacl -m u:docker:rwx,g:slackware:r-- testfacl
[root@www.dwhd.org /tmp/facl]# getfacl testfacl
# file: testfacl
# owner: root
# group: root
user::rw-
user:docker:rwx
group::r--
group:slackware:r--
mask::rwx
other::r--

[root@www.dwhd.org /tmp/facl]# ls -l testfacl
-rw-rwxr--+ 1 root root 0 5月  26 23:15 testfacl
[root@www.dwhd.org /tmp/facl]#

Linux基础入门之facl
可以看到设置后的权限,docker已经有了读写执行的权限,而slackware这个组也获得了读取文件内容的权限。也许有人已经注意到了两个问题:首先,testfacl的组权限从r--变成了rwx。其次,umask是什么?为什么也变化了呢?我们先从mask说起。如果说acl的优先级高于UGO,那么mask就是一个名副其实的最后一道防线。它决定了一个用户/组能够得到的最大的权限。这样我们在不破坏已有ACL的定义的基础上,可以临时提高或是降低安全级别:

[root@www.dwhd.org /tmp/facl]# setfacl -m mask::r testfacl
[root@www.dwhd.org /tmp/facl]# getfacl testfacl
# file: testfacl
# owner: root
# group: root
user::rw-
user:docker:rwx                 #effective:r--
group::r--
group:slackware:r--
mask::r--
other::r--

[root@www.dwhd.org /tmp/facl]# 

Linux基础入门之facl
在docker对应的ACL项的后边出现了effective的字样,这是实际docker得到的权限。Mask只对其他用户和组的权限有影响,对owner和other的权限是没有任何影响的。 执行ls的结果也显示UGO的设置也有了对应的变化。因为在使用了ACL的情况下,group的权限显示的就是当前的mask。通常我们把mask设置成rwx,以不阻止任何的单个ACL项。
*需要注意的是,每次修改或添加某个用户或组的ACL项的时候,mask都会随之修改以使最新的修改能够真正生效。所以如果需要一个比较严格的mask的话,可能需要每次都重新设置一下mask。
下面来测试删除acl权限

[root@www.dwhd.org /tmp/facl]# getfacl testfacl
# file: testfacl
# owner: root
# group: root
user::rw-
user:docker:rwx                 #effective:r--
group::r--
group:slackware:r--
mask::r--
other::r--

[root@www.dwhd.org /tmp/facl]# setfacl -x u:docker testfacl
[root@www.dwhd.org /tmp/facl]# getfacl testfacl
# file: testfacl
# owner: root
# group: root
user::rw-
group::r--
group:slackware:r--
mask::r--
other::r--

[root@www.dwhd.org /tmp/facl]# setfacl -x g:slackware testfacl
[root@www.dwhd.org /tmp/facl]# getfacl testfacl
# file: testfacl
# owner: root
# group: root
user::rw-
group::r--
mask::r--
other::r--

[root@www.dwhd.org /tmp/facl]# 

Linux基础入门之facl
下面来测试acl权限覆盖

[root@www.dwhd.org /tmp/facl]# setfacl -m u:docker:rwx,g:slackware:r-- testfacl
[root@www.dwhd.org /tmp/facl]# getfacl testfacl
# file: testfacl
# owner: root
# group: root
user::rw-
user:docker:rwx
group::r--
group:slackware:r--
mask::rwx
other::r--

[root@www.dwhd.org /tmp/facl]# setfacl --set u::rw,u:docker:rw,g::r,o::- testfacl
[root@www.dwhd.org /tmp/facl]# getfacl testfacl
# file: testfacl
# owner: root
# group: root
user::rw-
user:docker:rw-
group::r--
mask::rw-
other::---

[root@www.dwhd.org /tmp/facl]# 

Linux基础入门之facl

我们可以用--set 设置一些新的ACL项,并把原有的ACL项全部都覆盖掉。和-m不同,-m选项只是修改已有的配置或是新增加一些。--set选项会把原有的ACL项都删除,用新的替代,需要注意的是一定要包含UGO的设置,不能象-m一样只是添加ACL就可以了。
o::-是另一个需要注意的地方。其实完整的写法是other::---,正如u::rw的完整写法是user::rw-。通常我们可以把"-"省略,但是当权限位只包含"-"时,必须至少保留一个。如果写成了o::,就会出现错误。

最后来说说FACL权限的备份和恢复

主要的文件操作命令cp和mv都支持ACL,只是cp命令需要加上-p 参数。但是tar等常见的备份工具是不会保留目录和文件的ACL信息的。 如果希望备份和恢复带有ACL的文件和目录,那么可以先把ACL备份到一个文件里。以后用--restore选项来回复这个文件中保存的ACL信息:

[root@www.dwhd.org ~]# getfacl -R /home > /tmp/facl/home_acl_backup
getfacl: Removing leading '/' from absolute path names
[root@www.dwhd.org ~]# pwd
/root
[root@www.dwhd.org ~]# cd /
[root@www.dwhd.org /]# getfacl -R home > /tmp/facl/home_acl_backup
[root@www.dwhd.org /]#

Linux基础入门之facl
这里需要注意个问题 在备份目录acl权限的时候 我们需要在被备份目录的上层目录做,命令中只能有目录名不能有/,(不知道是不是我错。。。)
我们用-b选项删除所有的ACL数据,来模拟从备份中回复的文件和目录:

[root@www.dwhd.org /]# setfacl -R -b home
[root@www.dwhd.org /]# getfacl home/
# file: home/
# owner: root
# group: root
user::rwx
group::r-x
other::r-x

[root@www.dwhd.org /]# 

现在我们从/tmp/facl/home_acl_backup中恢复被删除的ACL信息:

[root@www.dwhd.org /]# setfacl --restore /tmp/facl/home_acl_backup
[root@www.dwhd.org /]# getfacl home/
# file: home/
# owner: root
# group: root
user::rwx
group::r-x
other::r-x

[root@www.dwhd.org /]# 

Linux基础入门之facl

lookback

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: