分类: LINUX
2014-08-18 13:38:08
原文地址:[原创] POSIX ACL 学习笔记 - (上篇) 作者:ailms
ACL 基础知识
(已解决)# 问题 :什么是 ACL ?有何优点、缺点
[答案] :
所谓ACL,就是Access
Control List,一个文件/目录的访问控制列表,可以针对任意指定的用户/组分配RWX权限。现在主流的商业Unix系统都支持ACL。FreeBSD也提供了对ACL的支持。Linux在这个方面也不会落后,从2.6版内核开始支持ACL。
支持ACL需要内核和文件系统的支持。现在2.6内核配合EXT2/EXT3, JFS,
XFS, ReiserFS等文件系统都是可以支持ACL的
问题 :如何知道当前是否支持 ACL ?
[答案] :
[root@as7 t1]# setfacl -m
u:n7css:rw file1
setfacl: file1: Operation not supported
[root@as7 t1]#
这说明你挂载文件系统时没有使用 acl 选项。
[root@mail ~]# mount -o acl -o
remount /boot
[root@mail ~]#
[root@mail ~]#
/dev/hdb1 on /boot type ext3 (rw,acl)
[root@mail ~]#
建议放入 /etc/fstab
===============================================================================================
# 问题 :ACL 功能是由那个 rpm 提供的?
[答案] :
是由 acl RPM 包提供的。
n7css@as7: ~>rpm -qif $(which
setfacl)
Name : acl Relocations: (not
relocatable)
Version : 2.2.23 Vendor: (none)
Release : 5.3 Build Date: Wed 27
Apr 2005 07:42:30 PM CST
Install Date: Sun 16 Apr 2006 03:04:33 PM CST Build Host: dev3-241.dev.cn.tlan
Group : System
Environment/Base Source RPM:
acl-2.2.23-5.3.src.rpm
Size : 145896 License: GPL
Signature : (none)
URL :
Summary : Access control list
utilities.
Description :
This package contains the getfacl and setfacl utilities needed for
manipulating access control lists.
n7css@as7: ~>
n7css@as7: ~>rpm -ql acl
/usr/bin/chacl
/usr/bin/getfacl
/usr/bin/setfacl
/usr/share/doc/acl-2.2.23
/usr/share/doc/acl-2.2.23/CHANGES.gz
/usr/share/doc/acl-2.2.23/LICENSE
/usr/share/doc/acl-2.2.23/PORTING
/usr/share/doc/acl-2.2.23/README
/usr/share/locale/de/LC_MESSAGES/acl.mo
/usr/share/locale/pl/LC_MESSAGES/acl.mo
/usr/share/man/man1/chacl.1.gz
/usr/share/man/man1/getfacl.1.gz
/usr/share/man/man1/setfacl.1.gz
/usr/share/man/man5/acl.5.gz
n7css@as7: ~>
===============================================================================================
#问题 :ACL 基础知识
[答案] :
1、
一个 ACL 由多个条目组成,每个文件系统对象都至少有一个 ACL 设置。 上面的3类用户也都可以用一个 ACL 条目来表示。(也就是 getfacl
的 user、group、other 条目)。如果需要其他特殊设置,再用其他 ACL 条目
2、
ACL 条目的类型如表1所示的那样。每个条目由如下几部分组成 :
-)1、type :(Owner、Group、Mask、other)
-)2、qualifier :例如
-)3、permission :也就是 rwx 这样的权限bit
注意,mask
和 other 条目是没有 qualifier 字段的。因为指定这个没有意义,所以中间的 ‘::’ 可以缩写为 ‘:’ ,例如 m:rwx
3、可以看到有4类 :
-)1、user 类
-)2、group 类
-)3、mask 类
-)4、other 类
4、如果只有3个 ACL 条目,而且这三个条目对应传统的 UNIX 权限模型,则称为 minimal ACLs(也称为 base ACLs)
如果多于3个 ACL 条目,则称为 extended ACLs 。Extended ACLS
含有1个 Mask 和 多个 named user/group ACL 条目
5、named group 和 named user 被统一放入到 group class 中表示,所以 group class 同时含有 :
-)1、owning group 权限信息。所谓 owning group ,就是指文件的owner 所属的组
-)2、named user ACL 条目。就是指除了 owner、owning group 之外的用户
-)3、named group ACL 条目。同上,但指的是用户组
所以一旦使用了 ACL ,权限中的组权限部分就不再简单的表示该组用户的权限了,而是等于在上面3类条目中权限最大的那个值,也就是下面的 mask 条目的值
6、在 minimal ACLs 中,group 类的权限就等于 owning group
的权限。但在 Extended ACLs 中,group 类的权限可以包含其他用户/组的条目。
这就导致了一个问题,这些多出来的条目中可能含有不同于 owning group 的条目,这样 owning gorup
的权限和 group 类的权限可能存在差别
这个问题是通过 mask 条目解决的。在 Minimal ACLs 中,group 类权限映射到 owning group 权限。 而在 Extended ACLs 中,group 类的权限映射到 mask 条目权限,而 owning group 条目仍然定义的是 owning group 的权限,这两者不再是一致的。
7、从上面可以看到,owner 和 other 类型的用户不受 mask影响,权限怎么设就怎样,不会存在有效或者无效的问题
8、当一个应用程序改变了任何 owner、group、other 类的权限(例如 chmod 命令),则对应的 ACL 条目也会改变。 反之亦然
9、group
class 权限代表了在 group class 中任意一个权限所能得到的实际最高权限。 在 Minimal ACLs 中没有什么意义,但在 Extended ACLs 中,是通过 mask 权限实现的 :
-)1、如果某个权限(r)在某个 group class 条目(例如 user:bob:r-x) 出现,也同时在 mask 条目中出现(rw-),则该权限有效
-)2、如果某个权限(x)只在 group class 条目中(例如 user:bob:r-x)出现,但在 mask 条目中没有(rw-),则该权限(x)无效
-)3、如果某个权限(w)没有在 group class 中出现(例如 user:bob:r-x),但在 mask 条目中有(rw-),同样无效(w)
10、到目前位置,我们只介绍了一种 ACL 条目,就是关于访问控制的,称之为 access ACL 。还有第2种 ACL 条目,称为 default ACL 。它定义了一个文件系统对象在刚创建时是如何从它的上级目录继承 ACL 设置的。只有目录才有 Default ACL 一说,如果对文件使用 Default ACL 会报错。 你可以在后续过程再修改该对象的 ACL 设置
可以把 Default ACL 和 umask 进行比较
11、如果一个目录设置了 Default
ACL ,则在该目录下创建的子目录会继承它的上级目录的 ACL 设置,包括 access ACL 和 Default ACL 。
要注意,即使是继承也不是完全继承的,它会被每个创建文件系统对象的系统调用中的 mode 参数所修改。
例如 touch 默认的 mode 是 0666 ,mkdir 的mode默认是0777 ,我们只需要看其中的 group class 的值是多少,
一旦 deafult mask 中有些权限位不存在于 mode 参数的 group class 中,也会被删除。例如 default mask 是 rwx ,
而 mode 是 0666 ,其中的 group class 的值是 rw- ,则 touch 的文件的 mask 默认为 rw- 而已,
而 mkdir 的 mode 默认是 0777 ,group class 的值为 rwx ,则 mkdir 创建的目录的 mask 默认为 rwx
一旦目录使用了 deafult mask ,则 umask 不再有用
12、当一个进程访问某个文件时,按如下步骤进行检查 :
-)1、首先挑选出一个最合适的 ACL 条目,顺序是 owner、named users、owning group、named group、other。只挑选一条而已
-)2、根据该条目的设置检查进程是否有足够的访问权限
13、一个进程可能匹配多个条目,在这种情况下,如果所有的条目都设置允许访问,则随便选择一个条目 。如果任何一个条目都不允许进程对文件的指定类型的访问,则拒绝该访问
14、下面是访问检查算法的简单说明
-)1、如果进程的 UID 是文件的 owner ,则跳转到 e),否则继续 a)
-)a、如果进程的 UID 匹配某个 named users ,且允许访问,则跳转到 f),否则继续 b)
-)b、如果进程的 GID 匹配 owning group 且该条目允许访问,则跳转到 f),否则继续 c)
-)c、如果进程的 GID 匹配某个 named group 且该条目允许访问,则跳转到 f),否则继续 d)
-)d、进程的某个 GID 匹配 owning group 或者任意一个 named group 条目,但全都不允许访问,则访问被拒绝 。
这说明一旦 named user/group 不允许,即使 mask 允许也没有意义
-)2、如果 owner、group 都不是,则使用 other 条目 。这和 owner 一样是不受 mask 条目影响的。
-)e、如果最后选择的是 owner 或者 other ,且含有指定的权限,则访问被允许
-)f、否则如果匹配的条目的是 named user、owning group、named group 且ACL 条目和 mask 条目都含有指定的权限,则访问被允许
-)g、否则访问被拒绝
补充 : 即使某个 group class 条目含有想要的权限,也要再和 mask 匹配一次,如果两边都有才允许,但如果所有 group class 的条目都不含有指定的权限,则不需要再和 mask 条目匹配了。
补充 :可以看到整个过程是不会用到 default
ACL 的,因为 default ACL 并不控制访问,只有 access ACL 才能影响
===============================================================================================
问题 :deafut ACL 不影响访问,只有 ACL 才影响
[答案] :
[root@mail
tmp]# mkdir testdir
[root@mail
tmp]# chmod -c 700 testdir
mode of `testdir' changed to 0700
(rwx------)
[root@mail
tmp]# setfacl -m d:u:bob:rwx
testdir
[root@mail
tmp]# getfacl testdir
# file: testdir
# owner: root
# group: root
user::rwx
group::---
other::---
default:user::rwx
default:user:bob:rwx
default:group::---
default:mask::rwx
default:other::---
[root@mail
tmp]# id bob
uid=500(bob) gid=500(bob) groups=500(bob)
[root@mail
tmp]# su - bob
[bob@mail
~]$ cd /tmp/testdir/
-bash: cd: /tmp/testdir/:
Permission denied # 注释 ;虽然
default ACL 允许 bob 访问,但没有允许 bob 访问的 access ACL ,所以还是被拒绝
[bob@mail ~]$
===============================================================================================
问题 :同上,现在改为使用 access ACL
[答案] :
[root@mail
tmp]# setfacl -b testdir/
[root@mail
tmp]# setfacl -m u:bob:rwx testdir/
[root@mail
tmp]# getfacl testdir/
# file: testdir
# owner: root
# group: root
user::rwx
user:bob:rwx
group::---
mask::rwx
other::---
[root@mail
tmp]# su - bob
[bob@mail
~]$ cd /tmp/testdir
[bob@mail
testdir]$ touch a
[bob@mail
testdir]$ ll a
-rw-rw-r-- 1 bob bob 0 Dec 7 23:16 a # 注释 :可以看到bob 用户现在可以进入目录并创建文件了
[bob@mail testdir]$
===============================================================================================
#问题 :上面第11 点的例子(关于 deafult acl 的继承)
[答案] :
[root@mail
tmp]# setfacl -m d:g:bob:rwx RPMS/
[root@mail
tmp]# getfacl RPMS
# file: RPMS
# owner: bob
# group: bob
user::rwx
group::r-x
other::r-x
default:user::rwx
default:group::r-x
default:group:bob:rwx
default:mask::rwx
default:other::r-x
[root@mail
tmp]# ll -d RPMS/
drwxr-xr-x+ 3 bob bob 73728 Nov 20 11:40 RPMS/ # 注释 :group
class 并没有变化
[root@mail tmp]#
创建一个子目录
[root@mail
RPMS]# mkdir subdir
[root@mail
RPMS]# getfacl subdir
# file: subdir
# owner: root
# group: root
user::rwx
group::r-x
group:bob:rwx
mask::rwx
other::r-x
default:user::rwx
default:group::r-x
default:group:bob:rwx
default:mask::rwx
default:other::r-x
[root@mail RPMS]#
[root@mail
RPMS]# getfacl file1
# file: file1
# owner: root
# group: root
user::rw-
group::r-x #effective:r--
group:bob:rwx #effective:rw-
mask::rw- #
注释 :可以看到 mask 不同于上级目录的 default mask :rwx
other::r--
[root@mail RPMS]#
[root@mail
RPMS]# ll file1
-rw-rw-r--+ 1 root root 0 Nov 22 10:37
file1
[root@mail RPMS]#
===============================================================================================
#问题 :如果是 default mask 没有某个权限位,但 mode 有呢?
[答案] :
例如 default mask 设置为 -wx ,没有 r 位。然后 touch 和 mkdir
[root@mail tmp]# setfacl -d -m
m:-wx RPMS/
[root@mail tmp]# getfacl RPMS/
# file: RPMS
# owner: bob
# group: bob
user::rwx
group::r-x
other::r-x
default:user::rwx
default:group::r-x #effective:--x
default:mask::-wx
default:other::r-x
[root@mail tmp]# cd RPMS
[root@mail RPMS]# touch file
[root@mail RPMS]# getfacl file
# file: file
# owner: root
# group: root
user::rw-
group::r-x
#effective:---
mask::-w- #
注释 :-wx 和 rw- 与的结果就是 -w-
other::r--
[root@mail RPMS]#
[root@mail RPMS]# mkdir subdir
[root@mail RPMS]# getfacl subdir
# file: subdir
# owner: root
# group: root
user::rwx
group::r-x
#effective:--x
mask::-wx
other::r-x
default:user::rwx
default:group::r-x
#effective:--x
default:mask::-wx #
注释 :-wx 和 rwx 与的结果就是 -wx
default:other::r-x
[root@mail RPMS]#