Chinaunix首页 | 论坛 | 博客
  • 博客访问: 88841
  • 博文数量: 18
  • 博客积分: 1400
  • 博客等级: 上尉
  • 技术积分: 272
  • 用 户 组: 普通用户
  • 注册时间: 2009-07-14 17:24
文章分类

全部博文(18)

文章存档

2011年(1)

2009年(17)

我的朋友

分类: LINUX

2009-07-14 17:59:07

转自鸟哥linux私房菜
 
大標題的圖示主機的細部權限規劃:ACL 的使用

開始,我們就一直強調 Linux 的權限概念是非常重要的! 但是傳統的權限僅有三種身份 (owner, group, others) 搭配三種權限 (r,w,x) 而已,並沒有辦法單純的針對某一個使用者或某一個群組來設定特定的權限需求,例如前一小節最後的那個任務! 此時就得要使用 ACL 這個機制啦!這玩意挺有趣的,底下我們就來談一談:


小標題的圖示什麼是 ACL

ACL 是 Access Control List 的縮寫,主要的目的是在提供傳統的 owner,group,others 的 read,write,execute 權限之外的細部權限設定。ACL 可以針對單一使用者,單一檔案或目錄來進行 r,w,x 的權限規範,對於需要特殊權限的使用狀況非常有幫助。

那 ACL 主要可以針對哪些方面來控制權限呢?他主要可以針對幾個項目:

  • 使用者 (user):可以針對使用者來設定權限;
  • 群組 (group):針對群組為對象來設定其權限;
  • 預設屬性 (mask):還可以針對在該目錄下在建立新檔案/目錄時,規範新資料的預設權限;

好了,再來看看如何讓你的檔案系統可以支援 ACL 吧!


小標題的圖示如何啟動 ACL

由於 ACL 是傳統的 Unix-like 作業系統權限的額外支援項目,因此要使用 ACL 必須要有檔案系統的支援才行。目前絕大部分的檔案系統都有支援 ACL 的功能,包括 ReiserFS, EXT2/EXT3, JFS, XFS 等等。在我們的 CentOS 5.x 當中,預設使用 Ext3 是啟動 ACL 支援的!至於察看你的檔案系統是否支援 ACL 可以這樣看:

[root@www ~]# mount  <==直接查閱掛載參數的功能
/dev/hda2 on / type ext3 (rw)
/dev/hda3 on /home type ext3 (rw)
# 其他項目鳥哥都將他省略了!假設我們只要看這兩個裝置。但沒有看到 acl 喔!

[root@www ~]# dumpe2fs -h /dev/hda2  <==由 superblock 內容去查詢
....(前面省略)....
Default mount options:    user_xattr acl
....(後面省略)....

由 mount 單純去查閱不見得可以看到實際的項目,由於目前新的 distributions 常常會主動加入某些預設功能, 如上表所示,其實 CentOS 5.x 在預設的情況下 (Default mount options:) 就幫你加入 acl 的支援了! 那如果你的系統預設不會幫你加上 acl 的支援呢?那你可以這樣做:

[root@www ~]# mount -o remount,acl /
[root@www ~]# mount
/dev/hda2 on / type ext3 (rw,acl)
# 這樣就加入了!但是如果想要每次開機都生效,那就這樣做:

[root@www ~]# vi /etc/fstab
LABEL=/1   /   ext3    defaults,acl    1 1

如果你不確定或者是不會使用 dumpe2fs 觀察你的檔案系統,那麼建議直接將上述的 /etc/fstab 裡面的內容修改一下即可!


小標題的圖示ACL 的設定技巧: getfacl, setfacl

好了,讓你的 filesystem 啟動 ACL 支援後,接下來該如何設定與觀察 ACL 呢? 很簡單,利用這兩個指令就可以了:

  • getfacl:取得某個檔案/目錄的 ACL 設定項目;
  • setfacl:設定某個目錄/檔案的 ACL 規範。

先讓我們來瞧一瞧 setfacl 如何使用吧!


  • setfacl 指令用法
[root@www ~]# setfacl [-bkRd] [{-m|-x} acl參數] 目標檔名
選項與參數:
-m :設定後續的 acl 參數給檔案使用,不可與 -x 合用;
-x :刪除後續的 acl 參數,不可與 -m 合用;
-b :移除所有的 ACL 設定參數;
-k :移除預設的 ACL 參數,關於所謂的『預設』參數於後續範例中介紹;
-R :遞迴設定 acl ,亦即包括次目錄都會被設定起來;
-d :設定『預設 acl 參數』的意思!只對目錄有效,在該目錄新建的資料會引用此預設值

上面談到的是 acl 的選項功能,那麼如何設定 ACL 的特殊權限呢?特殊權限的設定方法有很多, 我們先來談談最常見的,就是針對單一使用者的設定方式:

# 1. 針對特定使用者的方式:
# 設定規範:『 u:[使用者帳號列表]:[rwx] 』,例如針對 vbird1 的權限規範 rx :
[root@www ~]# touch acl_test1
[root@www ~]# ll acl_test1
-rw-r--r-- 1 root root 0 Feb 27 13:28 acl_test1
[root@www ~]# setfacl -m u:vbird1:rx acl_test1
[root@www ~]# ll acl_test1
-rw-r-xr--+ 1 root root 0 Feb 27 13:28 acl_test1
# 權限部分多了個 + ,且與原本的權限 (644) 看起來差異很大!但要如何查閱呢?

[root@www ~]# setfacl -m u::rwx acl_test1
[root@www ~]# ll acl_test1
-rwxr-xr--+ 1 root root 0 Feb 27 13:28 acl_test1
# 無使用者列表,代表設定該檔案擁有者,所以上面顯示 root 的權限成為 rwx 了!

上述動作為最簡單的 ACL 設定,利用『 u:使用者:權限 』的方式來設定的啦!設定前請加上 -m 這個選項。 如果一個檔案設定了 ACL 參數後,他的權限部分就會多出一個 + 號了!但是此時你看到的權限與實際權限可能就會有點誤差! 那要如何觀察呢?就透過 getfacl 吧!


  • getfacl 指令用法
[root@www ~]# getfacl filename
選項與參數:
getfacl 的選項幾乎與 setfacl 相同!所以鳥哥這裡就免去了選項的說明啊!

# 請列出剛剛我們設定的 acl_test1 的權限內容:
[root@www ~]# getfacl acl_test1
# file: acl_test1   <==說明檔名而已!
# owner: root       <==說明此檔案的擁有者,亦即 ll 看到的第三使用者欄位
# group: root       <==此檔案的所屬群組,亦即 ll 看到的第四群組欄位
user::rwx           <==使用者列表欄是空的,代表檔案擁有者的權限
user:vbird1:r-x     <==針對 vbird1 的權限設定為 rx ,與擁有者並不同!
group::r--          <==針對檔案群組的權限設定僅有 r 
mask::r-x           <==此檔案預設的有效權限 (mask)
other::r--          <==其他人擁有的權限囉!

上面的資料非常容易查閱吧?顯示的資料前面加上 # 的,代表這個檔案的預設屬性,包括檔名、檔案擁有者與檔案所屬群組。 底下出現的 user, group, mask, other 則是屬於不同使用者、群組與有效權限(mask)的設定值。 以上面的結果來看,我們剛剛設定的 vbird1 對於這個檔案具有 r 與 x 的權限啦!這樣看的懂嗎? 如果看的懂的話,接下來讓我們在測試其他類型的 setfacl 設定吧!

# 2. 針對特定群組的方式:
# 設定規範:『 g:[群組列表]:[rwx] 』,例如針對 mygroup1 的權限規範 rx :
[root@www ~]# setfacl -m g:mygroup1:rx acl_test1
[root@www ~]# getfacl acl_test1
# file: acl_test1
# owner: root
# group: root
user::rwx
user:vbird1:r-x
group::r--
group:mygroup1:r-x  <==這裡就是新增的部分!多了這個群組的權限設定!
mask::r-x
other::r--

基本上,群組與使用者的設定並沒有什麼太大的差異啦!如上表所示,非常容易瞭解意義。不過,你應該會覺得奇怪的是, 那個 mask 是什麼東西啊?其實他有點像是『有效權限』的意思!他的意義是: 使用者或群組所設定的權限必須要存在於 mask 的權限設定範圍內才會生效,此即『有效權限 (effective permission)』 我們舉個例子來看,如下所示:

# 3. 針對有效權限 mask 的設定方式:
# 設定規範:『 m:[rwx] 』,例如針對剛剛的檔案規範為僅有 r :
[root@www ~]# setfacl -m m:r acl_test1
[root@www ~]# getfacl acl_test1
# file: acl_test1
# owner: root
# group: root
user::rwx
user:vbird1:r-x        #effective:r-- <==vbird1+mask均存在者,僅有 r 而已!
group::r--
group:mygroup1:r-x     #effective:r--
mask::r--
other::r--

您瞧,vbird1 與 mask 的集合發現僅有 r 存在,因此 vbird1 僅具有 r 的權限而已,並不存在 x 權限!這就是 mask 的功能了!我們可以透過使用 mask 來規範最大允許的權限,就能夠避免不小心開放某些權限給其他使用者或群組了。 不過,通常鳥哥都是將 mask 設定為 rwx 啦!然後再分別依據不同的使用者/群組去規範她們的權限就是了。

例題:
將前一小節任務二中 /srv/projecta 這個目錄,讓 myuser1 可以進入查閱,但 myuser1 不具有修改的權力。
答:
由於 myuser1 是獨立的使用者與群組,而 /srv 是附屬於 / 之下的,因此 /srv 已經具有 acl 的功能。透過如下的設定即可搞定:
# 1. 先測試看看,使用 myuser1 能否進入該目錄?
[myuser1@www ~]$ cd /srv/projecta
-bash: cd: /srv/projecta: Permission denied  <==確實不可進入!

# 2. 開始用 root 的身份來設定一下該目錄的權限吧!
[root@www ~]# setfacl -m u:myuser1:rx /srv/projecta
[root@www ~]# getfacl /srv/projecta
# file: srv/projecta
# owner: root
# group: projecta
user::rwx
user:myuser1:r-x  <==還是要看看有沒有設定成功喔!
group::rwx
mask::rwx
other::---

# 3. 還是得要使用 myuser1 去測試看看結果!
[myuser1@www ~]$ cd /srv/projecta
[myuser1@www projecta]$ ll -a
drwxrws---+ 2 root projecta 4096 Feb 27 11:29 .  <==確實可以查詢檔名
drwxr-xr-x  4 root root     4096 Feb 27 11:29 ..

[myuser1@www projecta]$ touch testing
touch: cannot touch `testing': Permission denied <==確實不可以寫入!
請注意,上述的 1, 3 步驟使用 myuser1 的身份,2步驟才是使用 root 去設定的!

上面的設定我們就完成了之前任務二的後續需求喔!這麼簡單呢!接下來讓我們來測試一下,如果我用 root 或者是 pro1 的身份去 /srv/projecta 增加檔案或目錄時,該檔案或目錄是否能夠具有 ACL 的設定? 意思就是說,ACL 的權限設定是否能夠被次目錄所『繼承?』先試看看:

[root@www ~]# cd /srv/projecta
[root@www ~]# touch abc1
[root@www ~]# mkdir abc2
[root@www ~]# ll -d abc*
-rw-r--r-- 1 root projecta    0 Feb 27 14:37 abc1
drwxr-sr-x 2 root projecta 4096 Feb 27 14:37 abc2

你可以明顯的發現,權限後面都沒有 + ,代表這個 acl 屬性並沒有繼承喔!如果你想要讓 acl 在目錄底下的資料都有繼承的功能,那就得如下這樣做了!

# 4. 針對預設權限的設定方式:
# 設定規範:『 d:[ug]:使用者列表:[rwx] 』

# 讓 myuser1 在 /srv/projecta 底下一直具有 rx 的預設權限!
[root@www ~]# setfacl -m d:u:myuser1:rx /srv/projecta
[root@www ~]# getfacl /srv/projecta
# file: srv/projecta
# owner: root
# group: projecta
user::rwx
user:myuser1:r-x
group::rwx
mask::rwx
other::---
default:user::rwx
default:user:myuser1:r-x
default:group::rwx
default:mask::rwx
default:other::---

[root@www ~]# cd /srv/projecta
[root@www projecta]# touch zzz1
[root@www projecta]# mkdir zzz2
[root@www projecta]# ll -d zzz*
-rw-rw----+ 1 root projecta    0 Feb 27 14:57 zzz1
drwxrws---+ 2 root projecta 4096 Feb 27 14:57 zzz2
# 看吧!確實有繼承喔!然後我們使用 getfacl 再次確認看看!

[root@www projecta]# getfacl zzz2
# file: zzz2
# owner: root
# group: projecta
user::rwx
user:myuser1:r-x
group::rwx
mask::rwx
other::---
default:user::rwx
default:user:myuser1:r-x
default:group::rwx
default:mask::rwx
default:other::---

透過這個『針對目錄來設定的預設 ACL 權限設定值』的項目,我們可以讓這些屬性繼承到次目錄底下呢! 非常方便啊!那如果想要讓 ACL 的屬性全部消失又要如何處理?透過『 setfacl -b 檔名 』即可啦! 太簡單了!鳥哥就不另外介紹了!請自行測試測試吧!

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