zoukankan      html  css  js  c++  java
  • Linux ACL

    http://www.itokit.com/2011/1019/72376.html

    Linux权限非常的一重要,正常情况下一个文件或目录有三种角色,分别为:目录或文件拥有者(User)、所属群组(Group)、其他用户(Other),每个角色对应:读、写、可执行(rwx)。这也是我们最常见的权限,#ls -l 所看到第一列内容。第一位是文件类型,如 d 是目录、-是普通文件、l 是链接文件、c 是字符文件、b 是块文件等。 剩下9位即是文件对应三种角色的权限。如下图:

    还会有其它一些特殊权限,如SUID、SGID、 Sticky bit,还有一些需要通过命令lsattr来查看和chattr来设置的隐藏权限。

    然而这些权限并没有办法单纯的针对某一用户或群组来设定特定的权限需求。这时候ACL可以帮助我们解决这个问题。
    1.什么是ACL?

    ACLAccess Control List)即访问控制列表。主要是针对单一用户,单一文件或目录进行rwx权限的细部设定。可以针对用户(User)、群组(Group)、默认属性掩码(umask)进行设置。

    2.设置ACL前的准备工作
    ACL是Linux系统权限额外支持的一项功能,需要文件系统的支持,例如:ReiserFS , EXT2 , EXT3 , EXT4 , JFS , XFS等都支持ACL功能。如果你的文件系统支持ACL,接下来查看你的ACL功能是否启用。在RHEL6中查看文件系统是否启用ACL。
    (1)使用#mount命令查看ACL

    可以看到sda7的ACL已经启用。
    (2)启用ACL
    如果你想永久在某个partition上启用ACL功能,可以修改 /etc/fstab 。 在rhel6的fstab文件中是用UUID来挂载,所以可以先来确定sda7的UUID号,如下图:

    事实上由mount这条命令,你可以知道sda7是挂载在 /data目录。所以在fstab文件中找到挂载在该目录下partition就是一定是sda7了。当然也可以用更加可靠的做法,就是确定这个partition的UUID值。用blkid这条命令查到UUID,再和fstab中比对。
    在sda7上启用ACL功能,只需在defaults后加上acl,如下图:

    修改完成,保存退出后。重新用mount 命令挂载这个分区。命令如下:

    #mount -o remount /dev/sda7

    之后再用mount 查看所有已挂载设备,应该能够看 (rw,acl) 字样。
    3.ACL相关设置命令
    有以下三条命令:
    getfacl:取得文件或目录的ACL设置信息。 
    setfac:设置文件或目录的ACL设置信息。
    chacl:同setfacl,也是用来设定ACL设置信息。用法类似于chmod。不常用。
    这里主要介绍getfacl和setfacl命令。
    下图是三条命令的man page:

    命令常用参数:
    基中getfacl与setfacl的参数选项基本相同。
    (1)getfacl [-aceEsRLPtpndvh] file...

    -a , --access:显示文件或目录的访问控制列表。

    -d , --default:显示文件或目录的默认(缺省)的访问控制列表。

    -c , --omit-header:不显示默认的访问控制列表。

    -R , --recursive:操作递归到子目录。

    -t , --tabular:使用列表输格式出ACL设置信息。

    -n , --numeric:显示ACL信息中的用户和组的UID和GID。

    -p , --absolute-names

    -v , --version:显示命令的版信息                                                

    -h , --help:显示命令帮助信息。

     
    (2)setfacl  [-bkndRLP]  { -m|-M|-x|-X ... }  file ...

    -m, --modify=acl:修改文件或目录的扩展ACL设置信息。

    -M, --modify-file=file:从一个文件读入ACL设置信息并以此为模版修改当前文件或目录的扩展ACL设置信息。

    -x, --remove=acl:从文件或目录删除一个扩展的ACL设置信息。

    -X, --remove-file=file:从一个文件读入ACL设置信息并以此为模版删除当前文件或目录的ACL设置信息。

    -b, --remove-all:删除所有的扩展的ACL设置信息。

    -k, --remove-default:删除缺省的acl设置信息。

    --set=acl:设置当前文件的ACL设置信息信息。
    --set-file=file:从文件读入ACL设置信息来设置当前文件或目录的ACL设置信息。
    --mask:重新计算有效权限,即使ACL mask被明确指定。

    -n, --no-mask:不要重新计算有效权限。setfacl默认会重新计算ACL mask,除非mask被明确的制定。

    -d, --default:设置默认的ACL设置信息(只对目录有效)。

    -R, --recursive:操作递归到所有子目录和文件。

    -L, --logical:跟踪符号链接,默认情况下只跟踪符号链接文件,跳过符号链接目录。

    -P, --physical:跳过所有符号链接,包括符号链接文件。

    --restore=file:从文件恢复备份的acl设置信息(这些文件可由getfacl -R产生<---针对目录)。通过这种机制可以恢复整个目录树的acl设置信息。此参数不能和除--test以外的任何参数一同执行。
    --test:测试模式,不会改变ACL设置信息。

    -v, --version:显示程序的版信息。

    -h, --help:显示帮助信息。

     
    ACL设置信息
    setfacl命令可以识别以下的设置信息格式。

    setfacl [d[efault]:] [u[ser]:]uid [:perms]:指定用户的权限,文件所有者的权限(如果uid没有指定)。

    setfacl [d[efault]:] g[roup]:gid [:perms]:指定群组的权限,文件所有群组的权限(如果gid未指定)

    setfacl [d[efault]:] m[ask][:] [:perms]:有效权限掩码
    setfacl [d[efault]:] o[ther] [:perms]
    :其他的权限

     
    3.实例
    由于我的sda7这个partition经过上面的动作,已经启用了ACL功能,挂载在 /data目录下。下面所有的动作都是在这个目录下完成。
    (1)默认的ACL设置信息
    用root在 /data 目录下创建一个acl_test目录。

    有没有发现在缺省设置里没有mask这一项,这是因为这个目录还没有设置扩展有ACL设置信息。
    注意:

    使设置信息能正常执行,需要满足以下条件:
     ★ 三个基本设置不能被删除。
     ★ 任何一条包含指定的用户名或群组名的设置信息必须包含有效的权限组合(即rwx的权限组合)。
     ★ 缺省设置信息必须存在。

    由基本设置信息,我们可以知道文件名为 acl_test/ 的拥有者是root用户,所属群组是root组。
    由缺省设置信息可知这个目录的权限是755,即只有root用户可读可写,root组和其他用户只有读的权限。
    如果我想让 scan这个用户也具有可读可写,怎么办?
    (2)针对目录的ACL设置
    让scan这个用户对acl_test/ 这个目录可读可写。
    了解下设置规范:
    setfacl u:[用户列表]:[rwx]   针对用户的权限规范。
    setfacl g:[群组列表]:[rwx]   针对群组的权限规范。
    至于其它人的设置没有意义。
    针对scan用户的ACL设置如下图:

    可以看到多了一条扩展的ACL设置信息。

    注意:多了一个mask:rwx。这是一个权限掩码。用来控制你所设置的扩展ACL权限。你所设置的权限必须存于mask规定的范围内才会生效。也就是所谓的“有效权限(effective permission)”。你可以用getfacl -e命令查看,如下图:

    注意:在这里说一下目录的x权限,这个权限必须要有,否则你即使有写的权限,也没有办法进入这个目录。这个权限决定了你是否可以进目录。非常重要!
    注意:设置了ACL的目录或文件,在属性的最后一位会出现一个“+”号,如下图:

    上面我们知道acl_test/ 这个目录只root用户可读可写,在设置了针对scan用户的ACL信息后,现在我们切换到scan用户看看可不可以进行写操作。如下图:

    成功创建一个目录和一个文件。
    (3)针对文件的ACL设置
    如果是针对一个文件呢?下面我们用root用户在acl_test/目录下创建一个 acl_vim文件。这时候scan用户应该没有写入的权限。如下图:

    切换到scan用户试试看。如下图:

    没有写入权限。写入的动作被禁止。
    下面我们要让scan用户对这个文件有写入的权限,所以我们来针对scan用户设置acl_vim文件的acl信息,如下图:

    我们通过ACL设置信息,让scan这个用户具有对acl_vim文件读和写的权限。现在我们来切换到scan用户验证一下,如下图:

    验证成功。也可以发现在文件属性的权限最后一位也有一个“+”号。
    (4)针对有效权限mask的设定
    设定规范:
    setfacl m:[rwx]
    setfacl m::[rwx]
    设定acl_test/ 目录的有效权限为mask:r。如下图:

    我们可以看到scan用户的有效权限变为r。包括group。
    那么这时候scan用户对acl_test/ 这个目录还有没有写入权限。下面验证一下,如下图:

    由于scan用户在这个目录上没有x权限,所以连这个目录都不能进入,尽管我们已经赋予scan用户rwx的ACL设置信息。最终权限由mask控制,你所设置的权限必须在mask内,否则相对mask多出来的权限也是无效的。
    下面把mask改为原来的rwx。如下图:

    这个时候scan用户就可以对这个目录写入了。上面的写入操作都可以实现了。

    注意:如果setfacl命令不指定操作用户,那么就是对默认属主用户权限的操作(例如acl_test/目录,owner:root,group:root),这时候的setfacl命令功能上和传统的chmod相同。例如setfacl u::rwx,g::rwx,o::rwx acl_test/ 等价于chmod 777 acl_test/ 。就是把缺省设置信息全部设置为rwx的权限了。

    (5)针对预设权限的设定
    我在设置了acl_test/ 目录的ACL后,在这个目录下再创建目录和文件时,并没有继承上层目录acl_test/ 的ACL设置信息。如下图:

    之前我们在acl_test/ 目录下创建了scan/ 目录和scan_test文件用于验证acl_test/ 这个目录scan用户的ACL设置信息。所以可以看到它们的用户和组都为scan。而acl_vim是在上面步骤中用于验证文件上的ACL设置信息的设定。
    可以看到目录scan/ 和文件scan_test 并没有继承上层acl_test/ 目录的ACL设置信息。
    设置规范:
    setfacl -d -m [ug]:列表:[rwx] 目录 (注意:-d参数必须放在最前面。)

    setfacl -d --set [ug]:列表:[rwx] 目录 (注意:-d参数必须放在最前面。)

    setfacl -m d:[ug]:列表:[rwx] 目录

    让acl_test/ 这个目录下的所有文件和目录继承acl_test/ 目录的ACL设置信息。如下图:

    下面我们切换到scan用户验证一下在acl_test/目录下创建目录和文件能不能继承acl_test/这个目录的ACL设置信息。如下图:

    可以看到目录scan_1/和文件scan_test_1已经继承了上层acl_test/目录的ACL设置信息。在权限的最后一位都有个“+”号。
    注意:当然文件和目录的继承又会有一些差异。因为文件不像目录,目录的下层可再创建文件和目录,所以目录在继承上层目录的ACL设置信息时,会保证在它下层的目录和文件仍可以继承它的ACL设置信息。所以它要完全继承上层目录的ACL设置信息。而文件不需要继承这些设置信息。所以对于文件来说仅会继承scan用户这条ACL设置信息即可,而LINUX系统中的文件默认是不允许有x权限的。所以尽管scan用户有rwx的权限,但是mask为rw,所以有scan用户对该文件的有效权限仅有rw的权限。
    (6)setfacl其它一些操作

    setfacl  -x [ug]:用户或级列表 文件或目录:删除特定用户或组在相关文件或目录上的ACL设置。

    setfacl -b 文件或目录 :删除文件或目录上所有的ACL设置。
    注意:加上 -R 参数可以对目录递归处理。

    注意:cp和mv命令对于ACL的支持,mv命令保持ACL设置信息,cp命令在使用-p,-a参数时保留ACL设置信息。但是如果从一个支持ACL的文件系统向一个不支持ACL的文件系统移动或带ACL属性的拷贝,则会得到类似下面这样的错误提示,cp: preserving permissions for `filename: Operation not supported

    删除acl_test目录下acl_vim文件的ACL设置信息,如下图:

    删除acl_test/目录下scan_1/目录的ACL设置信息,如下图:

     
    备份和恢复ACL设置信息
    备份和恢复scan_test_1文件的ACL设置信息,如下图:

    在恢复的时候,不需要跟对应的文件名。可以看到恢复后的ACL信息和之前的一样。
    到这里,ACL可以告一段落了。其中还有其它一些操作。多试验一下,就能很好的掌握。
    写了很长时间,很累啊.

    http://www.cnblogs.com/ZhangShuo/articles/1836971.html

    一、 为什么要使用ACL
    先让我们来简单地复习一下Linux的文件权限。


    在 linux下,对一个文件(或者资源)可以进行操作的对象被分为三类: file owner(文件

    的拥有者),group(组,注意不一定是文件拥有者所在的组), other (其他)而对于每一类

    别又分别定义了read, write and execute/search 权限 (这里不讨论SUID, SGID以及

    Sticky bit的设置)

    通过ls -l命令就我们就可以列出一个文件的权限

    代码:

    [leonard@localhost ~]$ ls -l
    -rw-rw---- 1 leonard admin 0 Jul 3 20:12 test.txt





    在这里说明了对于test.txt这个文件leonard用户(由于是file owner)拥有read & write
    权限. 所有属于admin 组的用户(group)拥有read & write 权限. 其他任何用户(other)
    对于文件没有任何的权限

    如果我们现在希望john这个用户也可以对test.txt文件进行读写操作. 我自己大概会想到
    以下几种办法 (这里假设john不属于admin group)

    1. 给文件的other类别增加读和写的权限. 这样由于john会被归为other类别,那么
    他也将拥有读写的权限。
    2. 将john加入到admin group. 那么john会被归为group类别,那么他将拥有读写的权限。
    3. 设置sudo, 使john能够以leonard的身份对test.txt进行操作,从而获得读写权限。

    第一种做法的问题在于所有用户都将对test.txt拥有读写操作,显然这种做法不可取。
    第二种做法的问题在于john被赋予了过多的权限.所有属于admin组的文件,john都可以拥
    有其等同的权限了。
    第三种做法虽然可以达到只限定john用户一人拥有对test.txt文件的读写权限.但是需要
    对sudoers文件进行严格的格式控制. 而且当文件数量和用户很多的时候,这种方法就相当
    地不灵活了。
    看来好像都没有一个很好的解决方案. 其实问题就出在Linux 文件权限里面,对于other的
    定义过于广泛,以至于很难把权限限定于一个不属于file owner和group的用户身上. 那么
    Access Control List (ACL)就是用来帮助我们解决这个问题的。

    简单地来说ACL就是可以设置特定用户或者用户组对于一个文件/文件夹的操作权限. 需要
    掌握的命令也只有三个: getfacl, setfacl, chacl

    在接下去讨论之前大家可以先安装上ACL的RPM包
    代码:


    # rpm -ivh libacl-2.2.39-1.1 acl-2.2.39-1.1.i386.rpm

    如果配置好了yum可以直接安装这两个包

    # yum -y install libacl acl

    另外还需要磁盘分区的支持
    永久启用acl。我这里以自己的分区/data为例
    # vi /etc/fstab
    LABEL=/data         /data        ext3    defaults,acl      1 2

    在启用了acl参数之后重新加载/data分区
    # mount -o remount /data
    # cat /etc/mtab | grep /data
    /dev/sda5 /data ext3 rw,acl 0 0
    出现上面的信息代表分区的acl功能已经正常加载





    二、ACL的名词定义

    先来看看在ACL里面每一个名词的定义.这些名词我大多从man page上摘下来虽然有些枯燥,
    但是对于理解下面的内容还是很有帮助的

    ACL 是由一系列的Access Entry所组成的. 每一条Access Entry定义了特定的类别可以对
    文件拥有的操作权限. Access Entry有三个组成部分: Entry tag type, qualifier 
    (optional), 权限

    我们先来看一下最重要的Entry tag type, 它有以下几个类型

    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的权限

    让我们来据个例子说明一下. 下面我们就用getfacl命令来查看一个定义好了的ACL文件

    代码:

    [root@zyq-server data]# getfacl test.txt
    # file: test.txt
    # owner: root
    # group: family
    user::rw-
    user:zyq:rw-
    group::rw-
    group:jackuser:rw-
    mask::rw-
    other::---





    前面三个以#开头的定义了文件名,文件所有者和文件拥有组. 这些信息没有太大的作用,我
    们可以用 --omit-header来省略掉
    user::rw- 定义了ACL_USER_OBJ, 说明file owner拥有读和写的权限
    user:zyq:rw- 定义了ACL_USER,这样用户zyq就拥有了对文件的读写权限,实现了我们一开始要达到的目的
    group::rw- 定义了ACL_GROUP_OBJ,说明文件的group拥有read和write 权限
    group: jackuser:rw- 定义了ACL_GROUP,使得jackuser组拥有了对文件的read 和write权限
    mask::rw- 定义了ACL_MASK的权限为read and write
    other::--- 定义了ACL_OTHER的没有任何权限操作此文件

    从这里我们就可以看出ACL提供了我们可以定义特定用户和用户组的功能. 那么接下来我们就来
    看一下如何设置一个文件的ACL


    三、 如何设置ACL文件

    首先我们还是要讲一下设置ACL文件的格式. 从上面的例子中我们可以看到每一个Access Entry
    都是由三个被:号分隔开的字段所组成. 第一个就是Entry tag type

    user 对应了ACL_USER_OBJ和ACL_USER
    group 对应了ACL_GROUP_OBJ和ACL_GROUP
    mask 对应了ACL_MASK
    other 对应了ACL_OTHER

    第二个字段称之为qualifier.也就是上面例子中的zyq和jackuser组.它定义了特定用户和用户组
    对于文件的权限.这里我们也可以发现只有user和group才有qualifier,其他的都为空

    第三个字段就是我们熟悉的权限了. 它和Linux的权限一样定义,这里就不多讲了

    下面我们就来看一下怎么设置test.txt这个文件的ACL让它来达到我们上面的要求

    一开始文件没有ACL的额外属性

    代码:

    [root@zyq-server data]# ll test.txt                   
    -rw-r--r-- 1 root root 0 12-27 22:55 test.txt
    [root@zyq-server data]# getfacl test.txt                   
    # file: test.txt
    # owner: root
    # group: root
    user::rw-
    group::r--
    other::r--

    [root@zyq-server data]# getfacl -c test.txt     
    user::rw-
    group::r--
    other::r--





    我们先让用户zyq拥有对test.txt文件的读写权限

    代码:

    [root@zyq-server data]# setfacl -m u:zyq:rw test.txt
    [root@zyq-server data]# getfacl -c test.txt         
    user::rw-
    user:zyq:rw-
    group::r--
    mask::rw-
    other::r--





    这时我们就可以看到zyq用户在ACL里面已经拥有了对文件的读写权限. 这个时候如果我们
    查看一下linux的权限我们还会发现一个不一样的地方

    代码:



    [root@zyq-server data]# ll test.txt
    -rw-rw-r--+ 1 root root 0 12-27 22:55 test.txt





    在文件权限的最后多了一个+号. 当任何一个文件拥有了ACL_USER或者ACL_GROUP的值以后我
    们就可以称它为ACL文件.这个+号就是用来提示我们的
    我们还可以发现当一个文件拥有了ACL_USER或者ACL_GROUP的值时ACL_MASK同时也会被定义

    接下来我们来设置jackuser组拥有read 权限

    代码:

    [root@zyq-server data]# ll test.txt
    -rw-rw-r--+ 1 root root 0 12-27 22:55 test.txt
    [root@zyq-server data]#
    [root@zyq-server data]# setfacl -m g:jackuser:r test.txt
    [root@zyq-server data]# getfacl -c test.txt
    user::rw-
    user:zyq:rw-
    group::r--
    group:jackuser:r--
    mask::rw-
    other::r--

    [root@zyq-server data]# ll test.txt
    -rw-rw-r--+ 1 root root 0 12-27 22:55 test.txt





    到这里就完成了我们上面讲到的要求.是不是很简单呢


    四、ACL_MASK 和 Effective 权限

    这里需要重点讲一下ACL_MASK, 因为这是掌握ACL的另一个关键

    在Linux 文件权限里面大家都知道比如对于rw-rw-r--来说, 第二组中的那个rw-是指文件
    组的权限. 但是在ACL里面这种情况只是在ACL_MASK不存在的情况下成立. 如果文件有ACL_MASK
    值,那么当中那个rw-代表的就是mask值而不再是group 权限了

    让我们来看下面这个例子

    代码:



    [root@zyq-server data]# ll test.sh
    -rwxrw-r-- 1 root family 0 12-27 23:04 test.sh





    这里说明test.sh文件只有file owner: root拥有read, write, execute/search 权限. Family
    组只有读和写的权限。现在我们想让用户zyq也对test.sh具有和root一样的权限。

    代码:

    [root@zyq-server data]# setfacl  -m u:zyq:rwx test.sh
    [root@zyq-server data]# getfacl -c test.sh
    user::rwx
    user:zyq:rwx
    group::rw-
    mask::rwx
    other::r--





    这里我们看到zyq已经拥有了rwx的权限. mask值也被设定为rwx.那是因为它规定了ACL_USER, 
    ACL_GROUP和ACL_GROUP_OBJ的最大值
    现在我们再来看test.sh的Linux 权限, 它已经变成了

    代码:



    [root@zyq-server data]# ll test.sh
    -rwxrwxr--+ 1 root family 0 12-27 23:04 test.sh





    那么如果现在family组的用户想要执行test.sh的程序会发生什么情况呢? 它会被权限 deny.原
    因在于实际上family组的用户只有读和写的权限.这里当中显示的rwx是ACL_MASK的值而不是group
    的权限

    所以从这里我们就可以知道,如果一个文件后面有+标记,我们都需要用getfacl来确认它的权
    限,以免发生混淆

    下面我们再来继续看一个例子
    假如现在我们设置test.sh的mask为read only,那么family组的用户还会有write 权限吗?

    代码:

    [root@zyq-server data]# setfacl -m mask::r test.sh
    [root@zyq-server data]# getfacl -c test.sh
    user::rwx
    user:zyq:rwx                    #effective:r--
    group::rw-                      #effective:r--
    mask::r--
    other::r--





    这时候我们可以看到ACL_USER和ACL_GROUP_OBJ旁边多了个#effective:r--, 这是什么意思呢?
    让 我们再来回顾一下ACL_MASK的定义. 它规定了ACL_USER, ACL_GROUP_OBJ和ACL_GROUP的最大
    权限.那么在我们这个例子中他们的最大权限也就是read only.虽然我们这里给ACL_USER和ACL_GROUP_OBJ
    设置了其他权限,但是他们真正有效果的只有read权限.

    这时我们再来查看test.sh的Linux 文件权限时它的group 权限也会显示其mask的值(i.e. r--)

    代码:

    [root@zyq-server data]# ll test.sh
    -rwxr--r--+ 1 root family 0 12-27 23:04 test.sh





    五、 Default ACL

    上面我们所有讲的都是Access ACL, 也就是对文件而言. 下面我简单讲一下Default ACL. Default ACL
    是指对于一个目录进行Default ACL设置,并且在此目录下建立的文件都将继承此目录的ACL

    同样我们来做一个试验说明
    比如现在leonard用户建立了一个dir目录

    代码:

    [root@zyq-server data]$ mkdir mydir





    我希望所有在此目录下建立的文件都可以被smbuser用户所访问. 那么我们就应该对mydir目录设置Default ACL


    我 先利用root用户在/data/创建一个mydir的文件夹,然后将这个文件夹的default user权限设置为smbuser可以rw- 以root身份在mydir目录下创建一个test.txt的文件。其他的不做限制,然后切换到smbuser。发现smbuser用户可以修改 test.txt文件中的内容但是无法在mydir目录中创建和删除文件/文件夹

    代码:

    [root@zyq-server data]# id
    uid=0(root) gid=0(root) groups=0(root)
    [root@zyq-server data]# ll mydir/
    总计 0
    [root@zyq-server data]# getfacl mydir/
    # file: mydir/
    # owner: root
    # group: root
    user::rwx
    group::r-x
    other::r-x

    [root@zyq-server data]# setfacl -m d:smbuser:rw mydir/
    [root@zyq-server data]# getfacl mydir/
    # file: mydir/
    # owner: root
    # group: root
    user::rwx
    group::r-x
    other::r-x
    default:user::rwx
    default:user:smbuser:rw-
    default:group::r-x
    default:mask::rwx
    default:other::r-x

    [root@zyq-server data]# cd mydir/
    [root@zyq-server mydir]# touch test.txt
    [root@zyq-server mydir]# su - smbuser
    [smbuser@zyq-server ~]$ cd /data/mydir/
    [smbuser@zyq-server mydir]$ touch a
    touch: 无法创建 “a”: 权限不够
    [smbuser@zyq-server mydir]$ rm test.txt
    rm: 无法删除 “test.txt”: 权限不够
    [smbuser@zyq-server mydir]$ echo hello world>>test.txt
    [smbuser@zyq-server mydir]$ cat test.txt
    hello world






    这 里我们可以看到ACL定义了default选项, smbuser用户拥有了default的read, write, excute/search 权限.但是却无法删除和创建文件。经过试验,发现还必须将mydir目录的ACL_USER修改为smbuser后,切换到smbuser用户才能够在 mydir目录中创建和删除文件/文件夹

    [root@zyq-server data]# setfacl  -m u:smbuser:rwx mydir/
    [root@zyq-server data]# getfacl -c mydir/
    user::rwx
    user:smbuser:rwx
    group::r-x
    mask::rwx
    other::r-x
    default:user::rwx
    default:user:smbuser:rw-
    default:group::r-x
    default:mask::rwx
    default:other::r-x

    [root@zyq-server data]# su - smbuser
    [smbuser@zyq-server ~]$ cd /data/mydir/
    [smbuser@zyq-server mydir]$ touch a
    [smbuser@zyq-server mydir]$ ll
    总计 4
    -rw-rw-r--+ 1 smbuser family  0 12-27 23:43 a
    -rw-rw-r--+ 1 root    root   19 12-27 23:33 test.txt
    [smbuser@zyq-server mydir]$ rm * -rf
    [smbuser@zyq-server mydir]$






    下面的试验我们看到在mydir下建立的文件或文件夹都自动的加上了default的权限

    [root@zyq-server mydir]# su - smbuser
    [smbuser@zyq-server ~]$ cd /data/mydir/
    [smbuser@zyq-server mydir]$ ll
    总计 0
    -rw-rw-r--+ 1 root root 0 12-27 23:48 a
    -rw-rw-r--+ 1 root root 0 12-27 23:48 test.tt
    [smbuser@zyq-server mydir]$ rm * -rf
    [smbuser@zyq-server mydir]$ touch test.txt
    [smbuser@zyq-server mydir]$ ll
    总计 0
    -rw-rw-r--+ 1 smbuser family 0 12-27 23:48 test.txt
    [smbuser@zyq-server mydir]$ getfacl -c test.txt
    user::rw-
    user:smbuser:rw-
    group::r-x                      #effective:r--
    mask::rw-
    other::r--

    [smbuser@zyq-server mydir]$ mkdir smbuserdir
    [smbuser@zyq-server mydir]$ getfacl -c smbuserdir/
    user::rwx
    user:smbuser:rw-
    group::r-x
    mask::rwx
    other::r-x
    default:user::rwx
    default:user:smbuser:rw-
    default:group::r-x
    default:mask::rwx
    default:other::r-x

    [smbuser@zyq-server mydir]$ ll
    总计 4
    drwxrwxr-x+ 2 smbuser family 4096 12-27 23:49 smbuserdir
    -rw-rw-r--+ 1 smbuser family    0 12-27 23:48 test.txt








    六、 ACL 相关命令

    前 面的例子中我们都注意到了getfacl命令是用来读取文件的ACL, setfacl是用来设定文件的Acess ACL. 这里还有一个chacl是用来改变文件和目录的Access ACL and Default ACL. 它的具体参数大家可以去看man page. 我只想提及一下chacl -B. 它可以彻底删除文件或者目录的ACL属性(包括Default ACL). 比如你即使用了setfacl -x删除了所有文件的ACL属性,那个+号还是会出现在文件的末尾.所以正确的删除方法应该是用chacl -B


    用cp来复制文件的时候我们现在可以加上-p选项.这样在拷贝文件的时候也将拷贝文件的ACL属性.对于不能拷贝的ACL属性将给出警告

    mv命令将会默认地移动文件的ACL属性. 同样如果操作不允许的情况下会给出警告


    七. 需要注意的几点

    如果你的文件系统不支持ACL的话,你也许需要重新mount你的file system
    mount -o remount, acl [mount point]

    如果用chmod命令改变Linux 文件权限的时候相应的ACL值也会改变.反之改变ACL的值,相应的文件权限也会改变

    八. 参考资料

    1. man acl 个人感觉man page已经讲的比较详细,只是上面名词比较多看起来会比较繁琐
    2. http://www.suse.de/~agruen/acl/linux-acls/online/ 如果你英语不错的话可以看一下这篇关于POSIX ACL的介绍,上面有许多不错的例子

    http://www.ibm.com/developerworks/cn/linux/l-acl/

    Linux ACL 体验

    在安全管理日益重要的今天,传统的 Unix 文件系统的 UGO 权限管理方式已经无法满足日常系统管理工作的需要。而 ACL 机制逐渐成为主流的权限管理方式。本文主要介绍了在基于 Linux2.6 内核的发行版 Fedora Core 上进行的一些 ACL 基本功能的实验。

    高 延斌 (gaoyanb@cn.ibm.com), 软件工程师,WPLC部门,IBM中国软件开发中心

    2006 年 6 月 22 日

    • +内容

    ACL 简介

    用户权限管理始终是 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。

     

    准备工作

    支持ACL需要内核和文件系统的支持。现在2.6内核配合EXT2/EXT3, JFS, XFS, ReiserFS等文件系统都是可以支持ACL的。用自己工作用的物理分区体验ACL,总是不明智的行为。万一误操作导致分区的损坏,造成数据的丢失,损失就大了。作一个loop设备是个安全的替代方法。这样不需要一个单独的分区,也不需要很大的硬盘空间,大约有个几百KB就足够进行我们的体验了。OK,下面我使用Fedora Core 5和Ext3文件开始对Linux的ACL的体验。

    首先创建一个512KB的空白文件:

    [root@FC3-vm opt]#  dd if=/dev/zero of=/opt/testptn count=512
    512+0 records in
    512+0 records out

    和一个loop设备联系在一起:

    [root@FC3-vm opt]#  losetup /dev/loop0 /opt/testptn

    创建一个EXT2的文件系统:

    [root@FC3-vm opt]#  mke2fs /dev/loop0
    mke2fs 1.35 (28-Feb-2004)
    max_blocks 262144, rsv_groups = 32, rsv_gdb = 0
    Filesystem label=
    OS type: Linux
    Block size=1024 (log=0)
    Fragment size=1024 (log=0)
    32 inodes, 256 blocks
    12 blocks (4.69%) reserved for the super user
    First data block=1
    1 block group
    8192 blocks per group, 8192 fragments per group
    32 inodes per group
    
    Writing inode tables: done
    Writing superblocks and filesystem accounting information: done
    
    This filesystem will be automatically checked every 30 mounts or
    180 days, whichever comes first. Use tune2fs -c or -i to override.

    挂载新建的文件系统(注意mount选项里的acl标志,我们靠它来通知内核我们需要在这个文件系统中使用ACL):

    [root@FC3-vm opt]#  mount -o rw,acl /dev/loop0 /mnt
    [root@FC3-vm opt]#  cd /mnt
    [root@FC3-vm mnt]#  ls
    lost+found

    现在我已经得到了一个小型的文件系统。而且是支持ACL的。并且即使彻底损坏也不会影响硬盘上其他有价值的数据。可以开始我们的ACL体验之旅了。

     

    体验1 - ACL的基本操作:添加和修改

    我首先新建一个文件作为实施ACL的对象:

    [root@FC3-vm mnt]#  touch file1
    [root@FC3-vm mnt]#  ls -l file1
    -rw-r--r-- 1 root root     7 Dec 11 00:28 file1

    然后看一下这个文件缺省的ACL,这时这个文件除了通常的UGO的权限之外,并没有ACL:

    [root@FC3-vm mnt]#  getfacl file1
    # file: file1
    # owner: root
    # group: root
    user::rw-
    group::r--
    other::r-

    *注意:即使是不支持ACL的情况下,getfacl仍然能返回一个这样的结果。不过setfacl是不能工作的。

    下面添加几个用户和组,一会我将使用ACL赋予他们不同的权限:

    [root@FC3-vm mnt]#  groupadd testg1
    [root@FC3-vm mnt]#  useradd testu1
    [root@FC3-vm mnt]#  useradd testu2
    [root@FC3-vm mnt]#  usermod -G testg1 testu1

    现在我们看看testu1能做什么:

    [root@FC3-vm mnt]# su testu1
    [testu1@FC3-vm mnt]$ echo "testu1" >> file1
    bash: file1: Permission denied

    失败了。因为file1并不允许除了root以外的用户写。我们现在就通过修改file1的ACL赋予testu1足够的权限:

    [root@FC3-vm mnt]# setfacl -m u:testu1:rw file1
    [root@FC3-vm mnt]# su testu1
    [testu1@FC3-vm mnt]$ echo "testu1" >> file1
    [testu1@FC3-vm mnt]$ cat file1
    testu1

    修改成功了,用户testu1可以对file1做读写操作了。我们来看一下file1的ACL:

    [testu1@FC3-vm mnt]$ getfacl file1
    # file: file1
    # owner: root
    # group: root
    user::rw-
    user:testu1:rw-
    group::r--
    mask::rw-
    other::r-

    我们ls看一下:

    [root@FC3-vm mnt]# ls -l file1
    -rw-rw-r--+ 1 root root     7 Dec 11 00:28 file1

    可以看到那个"+"了么?就在通常我们看到的权限位的旁边。这个说明file1设置了ACL, 接下来我们修改一下testu1的权限,同时给testg1这个组以读的权限:

    [root@FC3-vm mnt]# setfacl -m u:testu1:rwx,g:testg1:r file1
    [root@FC3-vm mnt]# getfacl file1
    # file: file1
    # owner: root
    # group: root
    user::rw-
    user:testu1:rwx
    group::r--
    group:testg1:r--
    mask::rwx
    other::r-

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

    [root@FC3-vm mnt]# setfacl -m mask::r file1
    [root@FC3-vm mnt]# getfacl file1
    # file: file1
    # owner: root
    # group: root
    user::rw-
    user:testu1:rwx                 #effective:r--
    group::r--
    group:testg1:r--
    mask::r--
    other::r--
    
    [root@FC3-vm mnt]# ls -l file1
    -rw-r--r--+ 1 root root 7 Dec 11 00:28 file1

    在testu1对应的ACL项的后边出现了effective的字样,这是实际testu1得到的权限。Mask只对其他用户和组的权限有影响,对owner和other的权限是没有任何影响的。 执行ls的结果也显示UGO的设置也有了对应的变化。因为在使用了ACL的情况下,group的权限显示的就是当前的mask。通常我们把mask设置成rwx,以不阻止任何的单个ACL项。

    *需要注意的是,每次修改或添加某个用户或组的ACL项的时候,mask都会随之修改以使最新的修改能够真正生效。所以如果需要一个比较严格的mask的话,可能需要每次都重新设置一下mask。

     

    体验2 - ACL的其他功能:删除和覆盖

    我们来看一下其他的ACL操作。首先如何删除已有的ACL项呢?

    [root@FC3-vm mnt]# setfacl -x g:testg1 file1
    [root@FC3-vm mnt]# getfacl file1
    # file: file1
    # owner: root
    # group: root
    user::rw-
    user:testu1:rwx
    group::r--
    mask::rwx
    other::r--

    我们看到testg1的权限已经被去掉了。如果需要去掉所有的ACL可以用-b选项。所有的ACL项都会被去掉。

    [root@FC3-vm mnt]# setfacl -b file1
    [root@FC3-vm mnt]# getfacl file1
    # file: file1
    # owner: root
    # group: root
    user::rw-
    group::r--
    other::r--

    我们可以用--set 设置一些新的ACL项,并把原有的ACL项全部都覆盖掉。和-m不同,-m选项只是修改已有的配置或是新增加一些。--set选项会把原有的ACL项都删除,用新的替代,需要注意的是一定要包含UGO的设置,不能象-m一样只是添加ACL就可以了。比如下边这一段:

    [root@FC3-vm mnt]# setfacl --set u::rw,u:testu1:rw,g::r,o::- file1
    [root@FC3-vm mnt]# getfacl file1
    # file: file1
    # owner: root
    # group: root
    user::rw-
    user:testu1:rw-
    group::r--
    mask::rw-
    other::---

    o::-是另一个需要注意的地方。其实完整的写法是other::---,正如u::rw的完整写法是user::rw-。通常我们可以把"-"省略,但是当权限位只包含"-"时,必须至少保留一个。如果写成了o::,就会出现错误。

    如果希望对目录下的所有子目录都设置同样的ACL,可以使用-R参数:

    [root@FC3-vm mnt]# setfacl --set u::rw,u:testu1:rw,g::r,o::- dir1

    如果希望能从一个文件来读入ACL,并修改当前的文件的ACL,可以用-M参数:

    [root@FC3-vm mnt]# cat test.acl
    user:testu1:rw-
    user:testu2:rw-
    group:testg1:r--
    group:testg2:r--
    mask::rw-
    other::---
     

    体验3 - 目录的默认ACL

    如果我们希望在一个目录中新建的文件和目录都使用同一个预定的ACL,那么我们可以使用默认(Default) ACL。在对一个目录设置了默认的ACL以后,每个在目录中创建的文件都会自动继承目录的默认ACL作为自己的ACL。用setfacl的-d选项就可以做到这一点:

    [root@FC3-vm mnt]# setfacl -d --set g:testg1:rwx dir1
    [root@FC3-vm mnt]# getfacl dir1
    # file: dir1
    # owner: root
    # group: root
    user::rwx
    group::r-x
    other::r-x
    default:user::rwx
    default:group::r-x
    default:group:testg1:rwx
    default:mask::rwx
    default:other::r-x

    可以看到默认ACL已经被设置了。建立一个文件试试:

    [root@FC3-vm mnt]# touch dir1/file1
    [root@FC3-vm mnt]# getfacl dir1/file1
    # file: dir1/file1
    # owner: root
    # group: root
    user::rw-
    group::r-x                      #effective:r--
    group:testg1:rwx                #effective:rw-
    mask::rw-
    other::r--

    file1自动继承了dir1对testg1设置的ACL。只是由于mask的存在使得testg1只能获得rw-权限。

     

    体验4 - 备份和恢复ACL

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

    [root@FC3-vm mnt]# getfacl -R dir1 > dir1.acl
    [root@FC3-vm mnt]# ls -l dir1.acl
    total 16
    -rw-r--r--  1 root root   310 Dec 12 21:10 dir1.acl

    我们用-b选项删除所有的ACL数据,来模拟从备份中回复的文件和目录:

    [root@FC3-vm mnt]# setfacl -R -b dir1
    [root@FC3-vm mnt]# getfacl -R dir1
    # file: dir1
    # owner: root
    # group: root
    user::rwx
    group::r-x
    other::r-x
    
    # file: dir1/file1
    # owner: root
    # group: root
    user::rw-
    group::r--
    other::r--

    现在我们从dir1.acl中恢复被删除的ACL信息:

    [root@FC3-vm mnt]# setfacl --restore dir1.acl
    [root@FC3-vm mnt]# getfacl -R dir1
    # file: dir1
    # owner: root
    # group: root
    user::rwx
    group::r-x
    other::r-x
    default:user::rwx
    default:group::r-x
    default:group:testg1:rwx
    default:mask::rwx
    default:other::r-x
    
    # file: dir1/file1
    # owner: root
    # group: root
    user::rw-
    group::r-x                      #effective:r--
    group:testg1:rwx                #effective:rw-
    mask::rw-
    other::r--
     

    结语

    ACL 的引入使得大规模的复杂权限管理可以很容易的在 Linux 上实现。对于 /home 这样存放大量用户文件的分区,可以做到更有效的管理。但是我们也看到在备份工具等方面的欠缺,好在 FC2 中已经开始包含了 star 这样的支持 ACL 的备份工具,虽然还是 alpha 版。

    在单个文件的 ACL 条目的数量上,不同的文件系统有不同的限制。Ext2 和 Ext3 只能支持每个文件 25 个 ACL 条目。ReiserFS 和 JFS 可以支持超过 8,000 个条目。这个方面 Ext* 文件系统还需要加强。

    无论多么复杂的系统中,文件系统的权限管理都是最基础的内容。而 Linux 对 ACL的支持,无疑是一把管理海量用户系统的利器,对 Linux 在大规模的企业级应用中更方便的发挥更大的作用添了一把火。

  • 相关阅读:
    Leap Ftp 3.0注册码
    Access数据库导入到MSSQLServer数据库中的三种办法。
    flash上传插件uploadify详解_图片批量上传_更新数据库
    Winform(c#)手机号码归属地查询的实现
    百度再度出现故障,目前很多地区无法正常访问!
    windows 2000/2003 自动重启/定时重启
    js初步学习
    考研之三战讨论
    C++中的map学习
    BUPT 63T 高才生 找最佳基站
  • 原文地址:https://www.cnblogs.com/baiyw/p/3503838.html
Copyright © 2011-2022 走看看