Linux ACL 體驗

發表于:2007-05-25來源:作者:點擊數: 標簽:
在 安全 管理日益重要的今天,傳統的 Unix 文件系統的 UGO 權限管理方式已經無法滿足日常系統管理工作的需要。而 ACL 機制逐漸成為主流的權限管理方式。本文主要介紹了在基于 Linux2.6 內核的發行版 Fedora Core 上進行的一些 ACL 基本功能的實驗。 ACL 簡介
安全管理日益重要的今天,傳統的 Unix 文件系統的 UGO 權限管理方式已經無法滿足日常系統管理工作的需要。而 ACL 機制逐漸成為主流的權限管理方式。本文主要介紹了在基于 Linux2.6 內核的發行版 Fedora Core 上進行的一些 ACL 基本功能的實驗。

ACL 簡介

用戶權限管理始終是 Unix 系統管理中最重要的環節。大家對 Linux/Unix 的 UGO 權限管理方式一定不陌生,還有最常用的 chmod 命令。為了實現一些比較復雜的權限管理,往往不得不創建很多的組,并加以詳細的記錄和區分(很多時候就是管理員的噩夢)??梢葬槍δ骋粋€用戶對某一文件指定一個權限,恐怕管理員都期待的功能。比如對某一個特定的文件,用戶A可以讀取,用戶B所在的組可以修改,惟獨用戶B不可以……。于是就有了IEEE POSIX 1003.1e這個ACL的標準。所謂ACL,就是Aclearcase/" target="_blank" >ccess 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.anti-gravitydesign.com

国产97人人超碰caoprom_尤物国产在线一区手机播放_精品国产一区二区三_色天使久久综合给合久久97