潇's profile老肖的地盘PhotosBlogListsMore Tools Help

Blog


    July 17

    Linux ACL

    1.甚么是ACL

        ACL就是Access Control List,一个文件/目录的访问控制列表,可以针对任意指定的用户/组分配RWX权限。Linux在2.6版内核开始支持ACL。

    2.ACL条目

        一个ACL包括了一个ACL条目的集合,一个ACL条目为一个用户或者一个组对某个对象的访问权限,包括读、写、执行。一个ACL条目包括了一个条目标签类型,一个可选的条目标签的准入者以及一个权限(permission)的集合。

        条目标签类型如下:

               ACL_USER_OBJ    ACL_USER_OBJ 条目标签表示文件所有者的访问权限。

               ACL_USER           ACL_USER条目标签表示该条目下准入者的访问权限。

               ACL_GROUP_OBJ  ACL_GROUP_OBJ条目标签表示文件所在组的访问权限。

               ACL_GROUP         ACL_GROUP条目标签表示该条目下准入者(特定的组组)的访问权限。

               ACL_MASK           ACL_MASK条目标签表示能给ACL_USER,ACL_GROUP,ACL_GROUP分配的最大权限。

               ACL_OTHER         ACL_OTHER条目标签表示不能满足其它条目中的准入者的访问权限。

    3.合法的ACL

        一个ACL必须符合以下规则才能叫做合法的ACL。

            一个ACL必须包含一条且仅有一条ACL_USER_OBJ,ACL_GROUP_OBJ,ACL_OTHER标签类型。

            一个ACL可以包含0个或者多个ACL_USER以及ACL_GROUP,如果有这样的条目,那么ACL中必须包含一个且仅有一个ACL_MASK标签类型。否则  ACL_MASK可以不出现

            所有ACL_USER准入者中出现的user ID必须唯一,同样,在ACL_GROUP中出现的group ID必须唯一。

    4.ACL与文件权限的联系

            在昨天6点钟之前,肖囧同学只知道文件的权限用chmod管理,这对个人用户来说足够,然而对一些系统管理员来说,只用文件权限来管理访问安全性足够可以让他/她/它无语到极点,为了实现一些比较复杂的权限管理,往往不得不创建很多的组,并加以详细的记录和区分。所以ACL的出现让管理员看到了曙光,然而ACL不能够和已有的权限系统冲突,所以和文件权限就有如下联系:

            1.ACL所规定的权限是文件权限的超集。

            2.文件权限中的用户对应ACL中的ACL_USER_OBJ条目

            3.如果木有ACL_MASK条目,则文件权限中的组权限对应ACL_GROUP_OBJ条目。反之,文件中的组权限对应ACL_MASK条目。

            4.文件权限中的其他权限对应ACL_OTHER_OBJ条目,

            5.文件权限中的任何改动将映射到ACL上,反之亦然。

    5.对象的创建以及缺省ACL

        当使用create() mkdir() mknod() mkfifo() open()等函数创建对象时,这些对象的ACL初始化。如果某一目录关联一个缺省的ACL,那末这些函数的mode参数以及该目录的缺省ACL决定了该对象的ACL。

            1.新对象将继承该目录的缺省ACL。

            2.修改文件权限相关的ACL条目,使得ACL中不存在mode参数中未指定的访问权限。

        如果该目录没有缺省的ACL,那么mode参数以及文件创建的mask(这个东西我有讲过的,文件创建的掩码,不记得请上我公司网站查询)决定该对象的ACL

            1.新建对象的ACL包括ACL_USER_OBJ,ACL_GROUP_OBJ以及ACL_OTHER,这些条目的权限又文件创建掩码决定。

            2.与mode参数中指定的权限进行同步。

    6.通过ACL访问的检查算法

         每当一个进程要访问指定的对象时,ACL会进行如下检查:

            1.If进程的有效uid与对象所有者一致,则。

                if ACL_USER_OBJ中有相应的权限,那么允许访问。

                else 拒绝访问。

            2.else if如果进程的有效uid与某条ACL_USER条目中的准入者uid一致

                if 满足ACL_USER条目以及ACL_MASK中有相应的权限,那么允许访问。

                else 拒绝访问。

            3.else if如果有效的gid与某条ACL_GROUP的准入者gid一致,则

                if ACL中有ACL_MASK条目。则

                      if ACL_MASK或者ACL_GROUP_OBJ或者ACL_GROUP含有指定的访问权限,则允许访问。

                      else 拒绝访问。

                else

                      if ACL_GROUP_OBJ条目中有相应的权限,则允许访问。

                      else 拒绝访问

                else 拒绝访问

            4.else if ACL_OTHER条目中有相应的权限,则运行访问。

            5.else拒绝访问。

    7.查看ACL

        查看一个对象的ACL,可以使用getfacl命令,比如getfacl ./somedir,其结果如下

              1.# file: somedir/
              2:  # owner: lisa
              3:  # group: staff
              4:  user::rwx                                      所有者的权限,所谓的ACL_USER_OBJ条目
              5:  user:joe:rwx               #effective:r-x    其它用户的权限,ACL_USER条目,由于被MASK掉了,所以有效的只有MASK和该条目并集的权限
              6:  group::rwx                 #effective:r-x    ACL_GROUP_OBJ条目
              7:  group:cool:r-x                                    ACL_GROUP条目
              8:  mask:r-x                                            ACL_MAKS条目
              9:  other:r-x                                            ACL_OTHER条目
              10:  default:user::rwx
              11:  default:user:joe:rwx       #effective:r-x
              12:  default:group::r-x
              13:  default:mask:r-x
              14:  default:other:---

    8.设置ACL

         设置一个对象的ACL,要通过setfacl命令。不过我目前没有试验成功,需要ROOT权限,残念啊……请各位用man setfacl开传送门去看看。

    9总结

         ACL大大的方便了管理员对文件对象的管理,可以利用ACL的条目,轻松的添加一些访问例外,而用chmod实现同样的功能,则要添加很多组,然后把用户添加到组中间。无论多么复杂的系统中,文件系统的权限管理都是最基础的内容。而 Linux 对 ACL的支持,无疑是一把管理海量用户系统的利器,对 Linux 在大规模的企业级应用中更方便的发挥更大的作用添了一把火。注意:在单个文件的 ACL 条目的数量上,不同的文件系统有不同的限制。Ext2 和 Ext3 只能支持每个文件 25 个 ACL 条目。ReiserFS 和 JFS 可以支持超过 8,000 个条目。这个方面 Ext* 文件系统还需要加强。

    Comments

    Please wait...
    Sorry, the comment you entered is too long. Please shorten it.
    You didn't enter anything. Please try again.
    Sorry, we can't add your comment right now. Please try again later.
    To add a comment, you need permission from your parent. Ask for permission
    Your parent has turned off comments.
    Sorry, we can't delete your comment right now. Please try again later.
    You've exceeded the maximum number of comments that can be left in one day. Please try again in 24 hours.
    Your account has had the ability to leave comments disabled because our systems indicate that you may be spamming other users. If you believe that your account has been disabled in error please contact Windows Live support.
    Complete the security check below to finish leaving your comment.
    The characters you type in the security check must match the characters in the picture or audio.

    To add a comment, sign in with your Windows Live ID (if you use Hotmail, Messenger, or Xbox LIVE, you have a Windows Live ID). Sign in


    Don't have a Windows Live ID? Sign up

    Trackbacks

    The trackback URL for this entry is:
    http://seanxiaoxiao.spaces.live.com/blog/cns!7677365E5B9342DE!688.trak
    Weblogs that reference this entry
    • None