对Linux一直知道有User/Group/Other权限,今天看RHEL4文档,看到有ACL一说,马上上网查询,原来早在1999年就提出了ACL,只是对传统LINUX权限的扩充,可以指定多名User,多个Group。使用ACL的条件是:内核支持,以-o acl方式MOUNT分区,用setfacl设置
|
|
Linux 檔案系統的權限是研襲傳統 UNIX 系統的規劃方式,到目前也已經沿用了許多年的時間。由於傳統 UNIX 的權限規劃限制方式非常單純,相對於現今的資訊系統來說也已經顯得非常落後而且不敷使用,尤其在商業檔案伺服器的權限管理上更顯得非常不足。不過由於新的標準已經正是納入 LINUX 系統內,所以本文就來談談如何在目前的系統上透過該標準來提供更完善的權限管理功能。
傳統 UNIX 系統對於檔案目錄權限的控管方式
傳統 UNIX 系統對於檔案目錄權限管理,分別使用 “owner (擁有者)”、
“group(群組)” 與 “other(其他人)” 來表示不同身份對象,然後每個身份對象又分別使用 “readable(讀取)”、”writable(寫入)” 與 “executable(執行)” 屬性項目來表示。
若使用一般系統上面的長格式來看,透過 ls –l 可以得到像是如下的權限表示:
-rw-rw-r-- 1 kenduest office 0 Dec 22 15:01 filename.doc
就上面的長格式顯示內容來說,該檔案的擁有者為 kenduest,其群組為office。而其中又可以知道 kenduest 使用者對於filename.doc 檔案的存取權限為可以 “讀取” 與 “寫入”,以及屬於 office 該群組的使用者也具備 “讀取” 與 “寫入” 權限,最後剩下其他的使用者只有具備 “讀取” 權限。
目前若希望只有擁有者與所屬群組有存取權限,那就是透過 chmod 權限改成 660來達成需求
chmod 660 filename.doc
變更完成後,其長格式權限如下:
-rw-rw---- 1 kenduest office 0 Dec 22 15:01 filename.doc
就上面檔案的權限設定來說,若要開放讓其他特定使用者能夠對該檔案進行 “寫入” ,傳統做法就是把該使用者加入到 office 群組裡面,如此只要使用者屬於 office 群組就具備該 “寫入” 權限。
而若是目前還有更複雜的需求,希望屬於 sales 群組的使用者僅具備 “讀取” 權限而不具備 “寫入” 權限時,傳統的 UNIX 權限設定方式就顯得不足來提供這樣的設定需求。所以為了要滿足上面的權限設定,勢必要引入新的權限管理架構來解決該問題。
POSIX ACL 權限納入
為了解決上面的問題,於是 UNIX 系統上發展了進階的權限管理稱呼為 ACL (Access Control List)。ACL提供了能夠針對檔案目錄有傳統的對象
(擁有者、群組、其他) 對象的權限管理外,另外納入支援可以設定針對多個對象甚至群組權限管理功能。而該規範並納入成為 POSIX (Portable Operating System Interface) 標準成為 POSIX ACL,便於提供個家 UNIX 系統本身的系統設計遵循的標準規範。
POSIX ACL 於 POSIX 1003.1e 編號內,一直處於草案階段,也就是到現在還沒有有任何正式定案的標準,不過許多商業的 UNIX 系統都已經納入支援,而 Linux 核心也一直到最近 2.6 版本時正式納入支援。這相對於其他商業 UNIX 相關系統來說,Linux 正式納入POSIX ACL 的權限控管功能可以說是晚期才納入。不過對於 Microsoft 的 Windows NT 4.0 或者是 Windows 2000 系統來說,早也已經納入支援多擁有者與群組的權限控管,但是不是完整遵循 POSIX ACL 規範設計,所以一些功能上相同,但是並沒有完整對等。
Linux 上面的 POSIX ACL 主要專案計劃於 1999 年開跑,計劃站台於
http://acl.bestbits.at/。早期成果只能夠使用於 ext2 (second extended fs) 系統上,不過目前已經支援於 ext2、ext3、reiserfs、jfs 與 xfs 等相關檔案系統。此外專案計劃的成果成果除了上述提到的 Access Control List 權限之外,另外另外一個好消息就是 Extended Attribute 的項目也一併納入,這意味者往後能夠針對特定的檔案目錄添加附註相關相關資料。
POSIX ACL 支援
要於 kernel 2.6 內的檔案系統使用 POSIX ACL 權限管理功能甚至包含 Exntended Attribute 功能,通常需要需要重新編譯 kernel。比方針對編譯核心選項於 ext2/ext3 部分的 POSIX ACL 項目
<*> Ext3 journalling file system support
[*] Ext3 extended attributes
[*] Ext3 extended attribute block sharing
[*] Ext3 extended user attributes
[*] Ext3 trusted extended attributes
[*] Ext3 POSIX Access Control Lists
[ ] JBD (ext3) debugging support
<*> Second extended fs support
[*] Ext2 extended attributes
[*] Ext2 extended attribute block sharing
[*] Ext2 extended user attributes
[*] Ext2 trusted extended attributes
[*] Ext2 POSIX Access Control Lists
除了核心要支援外,系統還有其他的套件也需要一並更新修正才可以使用,
其中像是 GNU coreutils 提供的檔案管理工具 (cp、rm、mv 等) 相關的 patch 檔案都都可以在 http://acl.bestbits.at/ 站台抓取。
為了讓系統支援 POSIX ACL 其實要整合的東西不少,因為除了 kernel要支援外,更重要的是系統的一些檔案系統管理程式也要支援,所以手動自行完成這整個項目是一個不小的工程。還好目前的 Linux Distribution 版本都已經逐漸納入支援,所以只要挑對正確的 Linux 發行版本就可以直接使用,
不需要擔心還需要費心編譯核心與安裝相關修正程式。
關於各家 Linux 發行版本 POSIX ACL 整合部分,目前的 SuSE Linux 9 與 Fedora Linux core2 等版本已經正式納入POSIX ACL 支援,Mandrake Linux 10.1 部分支援,所以要直接使用這些功能時請先確認一下自己目前系統所採用的發行版本是否有支援。
POSIX ACL 啟用支援
當採用支援 POSIX ACL 的核心後,預設 Linux 系統開機時不會自動啟用該功能,所以需要於掛入檔案系統時傳入必要的參數才會開啟使用。比方
/home 是獨立一個分割區,目前還沒有掛入系統使用時可以透過該方式掛入
mount -t ext3 /dev/hda7 -o acl /dev/hda5 /home
若是該分割區已經掛入,事後可以透過如下方式讓 POSIX ACL 權限開啟:
mount -o remount,acl /home
若是希望每次開機都開啟 POSIX ACL 權限,直接於 /etc/fstab 該檔案內傳入 acl 參數即可。
/dev/hda5 /home ext3 defaults,acl 1 2
當上面設定完成後,可以執行 mount 程式看一下掛入設定是否有多了 “acl” 字串,有看到表示 ACL 功能已經開啟。
為了要設定 POSIX ACL 權限,系統提供了如下的程式檔案來達成需求:
chacl - change the access control list of a file or directory
setfacl - set file access control lists
getfacl - get file access control lists
其中 setfacl 一般設定 ACL 存取權限,getfacl 提供檢視 ACL 存取權限。chacl 本身為 SGI 的 IRIX UNIX 相容的 ACL 管理工具。
POSIX ACL 檢視
下面使用 touch 程式來建立一個檔案,並使用 getfacl 檢是檔案權限。
[kenduest@kendlee tmp]$ touch file.txt
[kenduest@kendlee tmp]$ getfacl file.txt
# file: file.txt
# owner: kenduest
# group: office
user::rw-
group::r--
other::r—
在這個清單輸出內可以看出來 ACL 表示為
user::rw- 表示 kenduest 使用者存取權限
group::r-- 表示屬於office 群組存取權限
other::r— 表示其他人存取權限
上面輸出這是傳統 UNIX 系統權限規範的結果
POSIX ACL 設定
使用 setfacl 程式可以來變更該檔案 ACL 權限,使用的方式為
setfacl [-bkndRLPvh] [{-m|-x} acl_spec] [{-M|-X} acl_file] file ...
一般常用的參數為:
-m 表示修改與新增權限
-x 表示移除權限
一般ACL 的規格寫法為:
[d[efault]:] [u[ser]:]uid [:perms] 表示指定某個使用者的權限
[d[efault]:] g[roup]:gid [:perms] 表示指定某一群組的權限
[d[efault]:] o[ther][:] [:perms] 表示指定剩下其他人權限
[d[efault]:] m[ask][:] [:perms] 表示設定有效的權限遮罩
目前要設定peter 使用者有 rwx 存取權限,使用方式為:
setfacl -m user:peter:rwx file.txt
或者是
setfacl -m u:peter:rwx file.txt
設定完成後使用 ls –l 觀察一下,會有如下的顯示結果。
-rw-rw-r--+ 1 kenduest office 0 Dec 22 15:01 file.txt
可以注意到權限的右側出現了 + 符號,這表示該檔案已經設定了POSIX ACL 延伸權限屬性,那使用 getfacl 程式可以檢視 ACL權限設定內容。
[kenduest@kendlee tmp]$ getfacl file.txt
# file: file.txt
# owner: kenduest
# group: office
user::rw-
user:peter:rwx
group::r--
mask::rwx
other::r--
輸出畫面內可以得到這些資訊:
user::rw- 表示使用者 kenduest 存取權限
user:peter:rwx 表示使用者 peter 存取權限
group::r-- 表示屬於 office 群組權限
mask::rwx 表示權限遮罩
other::r-- 表示其他人存取權限
POSIX ACL 目錄繼承權限
上面提到的 ACL 權限設定都是針對個別的檔案或者是目錄的權限進行設定,不過 POSIX ACL 本身也制定規範了目錄繼承的權限。
前面提到的,通常是針對目前的檔案、目錄設定存取權限。若是希望能夠設定某個目錄往後預設建立檔案目錄的存取權限,setfacl 則可以搭配 -d 參數或者是規則指定 default (d) 參數字即可指定目錄 default permission。
建立 test 目錄並查看該目錄的權限設定為何:
[kenduest@kendlee tmp]$ mkdir test
[kenduest@kendlee tmp]$ getfacl test
# file: test
# owner: kenduest
# group: kenduest
user::rwx
group::rwx
other::r-x
目前設定目錄預設權限,也就是繼承的權限項目:
[kenduest@kendlee tmp]$ setfacl -m d:u:peter:rwx test
[kenduest@kendlee tmp]$ getfacl test
# file: test
# owner: kenduest
# group: kenduest
user::rwx
group::rwx
other::r-x
default:user::rwx
default:user:peter:rwx
default:group::rwx
default:mask::rwx
default:other::r-x
進入 test 目錄,再建立一個 file.txt 檔案並檢視權限設定:
[kenduest@kendlee tmp]$ cd test
[kenduest@kendlee test]$ touch file.txt
[kenduest@kendlee test]$ ls -l file.txt
-rw-rw----+ 1 kenduest office 0 Dec 22 15:25 file.txt
[kenduest@kendlee test]$ getfacl file.txt
# file: file.txt
# owner: kenduest
# group: office
user::rw-
user:peter:rwx #effective:rw-
group::rwx #effective:rw-
mask::rw-
other::r—
所以可以看出來,往後於該目錄內建立的檔案目錄,其權限都會繼承該
目錄所設定的 default ACL 權限。
POSIX ACL 其他事宜
POSIX ACL 的功能的確非常方便,尤其是商業檔案伺服器要提供多人的細部權限管理上更是如此。不過目前 POSIX ACL 權限使用還有些問題需要時間來解決。
目前像是 KDE 與 Gnome 這類 X 下的整合桌面環境還沒有支援 POSIX ACL,所以要顯示與修改 ACL 權限還是需要透過傳統 command line 的工具。
常用來備份的 tar 與 dump 程式,到目前還沒有任何 ACL 權限支援納入,這表示無法使用 tar 程式備份與還原檔案系統的 ACL 權限設定。不過好消息是與 tar 近似的 star 這套程式支援 ACL 權限備份與還原,需要的話需要另外安裝上使用。另外其他像是 rsync 遠端同步檔案的程式也還不支援 ACL 權限,這都讓後續於使用 ACL 系統上同步還原的困難。
另外 Linux 內常用的文字編輯器 vim 與 ACL 搭配上也是有小取問題,因為透過 vim 修改了具備設定了 ACL 權限的文字檔案,儲存結束後會遺失 ACL 權限設定。會有這個問題主要是 vim 本身處理檔案寫入最終方式並非直接寫入該檔案,而是採行搬移更名方式來完成,所以才引發 ACL 權限遺失問題,不過在目錄 default 權限 ACL 環境下就可以避免。
==========================================================
在众多的linux访问控制系统中,Andreas Gruenbacher的Linux
ACL工程(http://acl.bestbits.at/)是比较有影响力的一个,也是最容易使用的一个。它依赖于文件系统的扩展属性(Extended ;
Attribute)。
(2002-12-03 12:53:10)
--------------------------------------------------------------------------------
By nixe0n
http://www.linuxaid.com.cn
简介
作为一种自由的操作系统,Linux的发展极为迅速,也出现了很多改进传统UNIX系统缺点的工程。这些工程通过不同的方式帮助系统管理员提高系统的安全性,例如:进程的能力,更细粒度的权限等。在上期我们介绍了Linux的能力特性,本文将介绍Linux的ACL系统。
传统UNIX系统的访问控制方法是非常简单的,它把用户分成三类:文件的拥有者、组成员和其他用户。很显然,这种访问控制模型过于简陋了。随着对Linux系统安全性要求的提高,需要一种更细粒度的访问控制模型来代替传统UNIX系统的访问控制模型。使用ACL(Access
Control
List,访问控制列表)系统,系统管理员能够为每个用户(包括root用户在内)对文件和目录的访问提供更好的访问控制。在POSIX中定义了一种访问控制叫做POSIX
ACL,可以实现基于单独用户的控制,目前的大多数Linux访问控制工程都是以此为基础。
在众多的工程中,Andreas Gruenbacher的Linux
ACL工程(http://acl.bestbits.at/)是比较有影响力的一个。它依赖于文件系统的扩展属性(Extended ;
Attribute)。当前,Linux能够在ext2/ext3和SGI的XFS文件系统中支持POSIX
ACL。其它类型的文件系统,例如:ReiserFS文件系统也很快会支持ACL。在网络文件系统中,Linux能够通过Samba共享支持ACL,不过目前的NFS还不能支持ACL。需要指出的是,目前使用磁盘限额的ext3文件系统对ACL的支持不是很好。
1.安装EA/ACL系统
1.1.下载ACL/EA内核补丁以及相关工具
安装ACL/EA系统,首先需要下载相关的内核补丁、工具以及辅助库。所有所需的软件包都可以从http://acl.bestbits.at/download.html下载。
本文将讨论如何在RedHat7.3(内核使用编写本文时的最新版本2.4.19,在本文完成时linux-2.4.20刚刚发布,不过相关的ea/acl的补丁还不太稳定)中安装ACL系统。需要指出的是,最新版的RedHat
8中已经广泛使用了ea/acl。为了系统维护的方便,建议除了内核补丁使用源代码包之外,其余软件都是用RPM包进行安装。整个安装过程需要用到以下的软件包:
acl-2.0.18-0.src.rpm
attr-2.0.10-0.src.rpm
e2fsprogs-1.27ea-26.4.src.rpm
star-1.5a03-2.src.rpm
fileutils-4.1.18acl65.5.src.rpm
linux-2.4.19-xattr-0.8.50.diff.gz
linux-2.4.19-acl-0.8.50.diff.gz
1.2.安装内核
在下在了所需的软件之后,就可以进入实际的安装了。我们首先需要一个支持ACL的内核,以下是具体的操作步骤:
1)进入内核源代码所在的目录,使用EA/ACL补丁升级内核源代码:
$ cd linux-2.4.19
$ zcat ../linux-2.4.19-xttr-0.8.50.diff.gz | patch -p1
$ zcat ../linux-2.4.19-acl-0.8.50.diff.gz | patch -p1
2)执行如下命令进入内核选项配置界面
# make xconfig
3)选择File systems进入文件系统的配置界面(如下图)
4)打开POSIX Access Control List选项,然后根据需要打开ext2/ext3文件系统的支持选项(如下图)。
5)完成配置之后,执行如下命令编译支持ACL的内核:
#make dep
#make bzImage
#make modules
#make modules_install
#cp arch/i386/boot/bzImage /boot/ACLKernel
6)最后使用自己喜欢的编辑器编辑/boot/grub/menu.lst文件,使我们刚才编译的内核能够启动。
1.3.安装辅助工具
完成内核的安装之后,我们还需要安装用户空间的工具和库以便对ACL进行日常维护。
1)安装attr库
# rpm --rebuild attr-2.0.10-0.src.rpm
# rpm -ihv /usr/src/redhat/RPMS/i386/attr-2.0.10-0.i386.rpm
# rpm -ihv /usr/src/redhat/RPMS/i386/attr-devel-2.0.10-0.i386.rpm
# rpm -ihv /usr/src/redhat/RPMS/i386/libattr-2.0.10-0.i386.rpm
2)安装acl库
# rpm --rebuild acl-2.0.18-0.src.rpm
# rpm -ihv /usr/src/redhat/RPMS/i386/acl-2.0.18-0.i386.rpm
# rpm -ihv /usr/src/redhat/RPMS/i386/acl-devel-2.0.18-0.i386.rpm
# rpm -ihv /usr/src/redhat/RPMS/i386/libacl-2.0.18-0.i386.rpm
3)安装支持ACL的fileutils软件包。它比原始的fileutils软件包增加了维护ACL的工具。
# rpm --rebuild fileutils-4.1.18acl65.5.src.rpm
# rpm -Uhv /usr/src/redhat/RPMS/i386/fileutils-4.1.8acl-65.5.i386.rpm
4)安装支持文件系统的扩展属性(Extended Attribute)的e2fsprogs软件包。
# rpm --rebuild e2fsprogs-1.27ea-26.4.src.rpm
# rpm -Uhv /usr/src/redhat/RPMS/i386/e2fsprogs-1.27ea-26.4.i386.rpm
5)安装star。Star是一个类似于tar,支持ACL的快速归档工具。
# rpm --rebuild star-1.5a03-2.src.rpm
# rpm -Uhv /usr/src/redhat/RPMS/i386/
1.4.安装完成之后的设置
如果使用0.8.50版本的EA/ACL内核补丁,内核重新启动之后不会自动打开ACL功能,我们需要使用acl或者user_xattr选项mount文件系统才能使ACL生效。例如,笔者系统的/home目录位于/dev/hda7分区,我可以使用如下命令使/home分区支持访问控制列表:
# mount -o remount,acl /dev/hda7
为了方便使用(毕竟每次重新启动系统都是用手工打开ACL是很麻烦的),可以直接修改/etc/fstab文件,还是以笔者的系统为例,下面/etc/fstab文件的节选:
LABEL=/ / ext2 defaults 1 1
LABEL=/boot /boot ext2 defaults 1 2
LABEL=/home /home ext3 defaults 1 2
LABEL=/usr /usr ext3 defaults 1 2
如果需要使这几个分区支持文件系统的扩展属性和访问控制列表,只要在选项栏加入acl选项,然后执行#mount -remount -a命令即可:
LABEL=/ / ext2 defaults,acl 1 1
LABEL=/boot /boot ext2 defaults,acl 1 2
LABEL=/home /home ext3 defaults,acl 1 2
LABEL=/usr /usr ext3 defaults,acl 1 2
2.Linux EA/ACL的语法
安装了ACL系统之后,系统中的每个对象(文件和目录)都有一个ACL项目控制对这个目标的访问。每个目录之内所有对象的初始访问控制由目录的默认ACL项目决定。
每个ACL项目由一系列ACL规则组成,这些规则设置单独用户或者一组用户对目标的访问权限,包括:读、写和搜索/执行。每个ACL条目被冒号分为三个部分:规则标签类型(tag
type)、规则限制符(qualifier)和访问权限(access permission)。规则标签类型包括以下关键词:
user--以user关键词开头的ACL规则设置对象拥有者或者其他用户对对象的访问权限。例如:
user::rw- 表示对象拥有者的访问权限;
user:nixe0n:r-- 表示用户nixe0n拥有读对象的权限。
group--设定某个用户组对对象的访问权限。例如:
group::rw- 表示用户所在用户组拥有读写权限;
group:linuxaid:r-- 表示属于linuxaid组的用户拥有读权限。
mask--以mask关键词开头的ACL规则用来限制赋予用户的最大访问权限,对象拥有者除外。例如:
user::rw-
user:nixe0n:rw- #有效的是user:nixe0n:r--
group::rw- #有效的是group:r--
group:linuxaid::rw- #有效的是group:linuxaid:r--
mask::r--
other::r--
other--指定其他用户对对象的访问权限。
每条ACL规则的第二部分是包含用户或者用户组识别符。用户识别符可以是用户名或者十进制的用户ID号;用户组识别符可以是用户组名或者十进制的用户组ID号。空白表示对象的拥有者或者拥有者所在的用户组。
第三部分是对对象的访问权限。读、写和搜索(目录)/执行(文件)分别由x、w和x代表,和通常使用的权限表示方法完全相同。对应的权限被-代替表示不具有此权限。
除了以上的关键词之外,还有一个只用于目录的关键词default。由default关键词修饰的ACL条目表示目录下所有子目录和文件的默认访问控制列表。
为了方便,还有一种简化的ACL规则表示方式。user可以用u代替;g表示group;m表示mask;o表示other。简化方式的访问控制列表,条目之间使用逗号分割。这种表示方式为命令行设置访问控制列表提供了很大的便利。例如:
$setfacl -m u::rw-,u:floatboat:rw-,g::r--,g:nixe0n:rw-,m::r--,o::r-- foo.txt
3.访问控制列表的维护
ACL生效之后,在使用ls -l命令罗列文件时,你会看到具有访问控制规则的目录或者文件的权限域会有一个加号(+)。例如,在打开ACL功能之前的文件如下所示:
[nixe0n@nixe0n nixe0n]$ ls -l
-rw-rw-r-- 1 nixe0n nixe0n 11331 09-12 20:02 exam.txt
使ACL功能生效之后,ls -l命令得到如下结果:
[nixe0n@nixe0n nixe0n]$ ls -l
-rw-rw-r--+ 1 nixe0n nixe0n 11331 09-12 20:02 exam.txt
3.1.setfacl
setfacl工具设置文件和目录的访问控制列表,支持对ACL规则的设置(-s/-S)、修改(-m/-M)和删除(-x/-X)。我们可以使用自己喜欢的编辑器按照ACL语法事先编写好某个对象的访问控制列表,然后使用大写的命令行选项进行设置或者修改操作;我们也可以使用小写命令行选项直接修改对象的访问控制规则,例如:
[nixe0n@nixe0n nixe0n]$ setfacl -m -m u::rw-,u:floatboat:rw-,g::r--, - exam.txt
3.2.getfacl
ls命令能够获得某个对象的访问权限,与之类似,getfacl命令可以获得文件和目录的访问控制列表规则,其输出格式如下所示:
[nixe0n@nixe0n nixe0n]$ getfacl doc
# file: doc/
# owner: nixe0n
# group: linuxaid
user::rwx
user:floatboat:rwx
group::rwx
group:cool:r-x
mask:r-x
other:r-x
default:user::rwx
default:user:flatboat:rwx
default:group::r-x
default:mask:r-x
default:other:---
总结
以上,我们讨论了EA/ACL访问控制系统的安装和使用。相对于其它类似的系统,如:lids、grsecurity等,EA/ACL非常容易使用,和Linux内核的结合也好的多。而且,ea/acl已经合并到了2.5内核中。合理地利用访问控制列表对提高系统的安全性很有帮助。