• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
    • 軟件測試技術
    • 軟件測試博客
    • 軟件測試視頻
    • 開源軟件測試技術
    • 軟件測試論壇
    • 軟件測試沙龍
    • 軟件測試資料下載
    • 軟件測試雜志
    • 軟件測試人才招聘
      暫時沒有公告

    字號: | 推薦給好友 上一篇 | 下一篇

    Linux ACL 體驗

    發布: 2007-5-25 23:14 | 作者: 高 延斌 | 來源: IBM | 查看: 23次 | 進入軟件測試論壇討論

    領測軟件測試網
    安全管理日益重要的今天,傳統的 Unix 文件系統的 UGO 權限管理方式已經無法滿足日常系統管理工作的需要。而 ACL 機制逐漸成為主流的權限管理方式。本文主要介紹了在基于 Linux2.6 內核的發行版 Fedora Core 上進行的一些 ACL 基本功能的實驗。

    ACL 簡介

    用戶權限管理始終是 Unix 系統管理中最重要的環節。大家對 Linux/Unix 的 UGO 權限管理方式一定不陌生,還有最常用的 chmod 命令。為了實現一些比較復雜的權限管理,往往不得不創建很多的組,并加以詳細的記錄和區分(很多時候就是管理員的噩夢)?梢葬槍δ骋粋用戶對某一文件指定一個權限,恐怕管理員都期待的功能。比如對某一個特定的文件,用戶A可以讀取,用戶B所在的組可以修改,惟獨用戶B不可以……。于是就有了IEEE POSIX 1003.1e這個ACL的標準。所謂ACL,就是Access Control List,一個文件/目錄的訪問控制列表,可以針對任意指定的用戶/組分配RWX權限,F在主流的商業Unix系統都支持ACL。FreeBSD也提供了對ACL的支持。Linux在這個方面也不會落后,從2.6版內核開始支持ACL。





    回頁首


    準備工作

    支持ACL需要內核和文件系統的支持,F在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 在大規模的企業級應用中更方便的發揮更大的作用添了一把火。

    延伸閱讀

    文章來源于領測軟件測試網 http://www.kjueaiud.com/


    關于領測軟件測試網 | 領測軟件測試網合作伙伴 | 廣告服務 | 投稿指南 | 聯系我們 | 網站地圖 | 友情鏈接
    版權所有(C) 2003-2010 TestAge(領測軟件測試網)|領測國際科技(北京)有限公司|軟件測試工程師培訓網 All Rights Reserved
    北京市海淀區中關村南大街9號北京理工科技大廈1402室 京ICP備2023014753號-2
    技術支持和業務聯系:info@testage.com.cn 電話:010-51297073

    軟件測試 | 領測國際ISTQBISTQB官網TMMiTMMi認證國際軟件測試工程師認證領測軟件測試網

    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>