Chinaunix首页 | 论坛 | 博客
  • 博客访问: 561376
  • 博文数量: 375
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 15
  • 用 户 组: 普通用户
  • 注册时间: 2013-09-20 10:21
文章分类

全部博文(375)

文章存档

2015年(1)

2014年(374)

分类: LINUX

2014-08-18 13:38:08

ACL 基础知识

 

(已解决)# 问题 :什么是 ACL ?有何优点、缺点

[答案]

所谓ACL,就是Access Control List,一个文件/目录的访问控制列表,可以针对任意指定的用户/组分配RWX权限。现在主流的商业Unix系统都支持ACLFreeBSD也提供了对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 ~]# mount |grep boot

/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 usergroupother 条目)。如果需要其他特殊设置,再用其他 ACL 条目

2、    ACL 条目的类型如表1所示的那样。每个条目由如下几部分组成

     -1type :(OwnerGroupMaskother

     -2qualifier :例如 ,如果为空 (::)则表示所有人、组员、其他人

     -3permission :也就是 rwx 这样的权限bit

      注意,mask other 条目是没有 qualifier 字段的。因为指定这个没有意义,所以中间的 ‘::’ 可以缩写为 ‘:’ ,例如 m:rwx

3、可以看到有4



-1user

    -2group

    -3mask

    -4other

4、如果只有3 ACL 条目,而且这三个条目对应传统的 UNIX 权限模型,则称为 minimal ACLs(也称为 base ACLs

 如果多于3 ACL 条目,则称为 extended ACLs Extended ACLS 含有1 Mask 多个 named user/group ACL 条目

5named group named user 被统一放入到 group class 中表示,所以 group class 同时含有

     -1owning group 权限信息。所谓 owning group ,就是指文件的owner 所属的组

     -2named user ACL 条目。就是指除了 ownerowning group 之外的用户

    -3named 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、当一个应用程序改变了任何 ownergroupother 类的权限(例如 chmod 命令),则对应的 ACL 条目也会改变。 反之亦然

9group 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 条目,顺序是 ownernamed usersowning groupnamed groupother。只挑选一条而已

     -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如果 ownergroup 都不是,则使用 other 条目 。这和 owner 一样是不受 mask 条目影响的。

-e、如果最后选择的是 owner 或者 other ,且含有指定的权限,则访问被允许

    -f否则如果匹配的条目的是 named userowning groupnamed 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]#

===============================================================================================

阅读(1044) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~