本文将詳細介紹 EXT3檔案系統的屬性已經如何使用這個特征保護系統的。
<b>1.什麼是ext3的屬性(attribute)</b>
從Linux的1.1系列核心開始,ext2檔案系統就開始支援一些針對檔案和目錄的額外标記或者叫作屬性(attribute)。在2.2和2.4系列的内 核中,ext3檔案系統支援以下屬性的設定和查詢:
A
Atime。告訴系統不要修改對這個檔案的最後通路時間。
S
Sync。一旦應用程式對這個檔案執行了寫操作,使系統立刻把修改的結果寫到磁盤。
a
Append Only。系統隻允許在這個檔案之後追加資料,不允許任何程序覆寫或者截斷這個檔案。如果目錄具有這個屬性,系統将 隻允許在這個目錄下建立和修改檔案,而不允許删除任何檔案。
i
Immutable。系統不允許對這個檔案進行任何的修改。如果目錄具有這個屬性,那麼任何的程序隻能修改目錄之下的檔案,不允 許建立和删除檔案。
d
No dump。在進行檔案系統備份時,dump程式将忽略這個檔案。
c
Compress。系統以透明的方式壓縮這個檔案。從這個檔案讀取時,傳回的是解壓之後的資料;而向這個檔案中寫入資料時,數 據首先被壓縮之後,才寫入磁盤。
s
Secure Delete。讓系統在删除這個檔案時,使用0填充檔案所在的區域。
u
Undelete。當一個應用程式請求删除這個檔案,系統會保留其資料塊以便以後能夠恢複删除這個檔案。
但是,雖然檔案系統能夠接受并保留訓示每個屬性的标志,但是這些屬性不一定有效,這依賴于核心和各種應用程式的版本。下表顯 示每個版本支援的屬性标志:
* 允許設定這個标志并使設定生效
i 允許設定這個标志但忽略其值
- 完全忽略這個标志
1.0 1.2 2.0 2.2 2.4
A - - * * *
S * * * * *
a - * * * *
i - * * * *
d - * * * *
c i i i i i
s * * i i i
u i i i i i
雖然早期的核心版本支援删除特征,但是從1.3系列的核心開始,開發者抛棄的對這個特征的實作,因為它似乎隻能夠提高一點點 的安全性,而糟糕的是它會給不熟悉安全删除繼承問題的使用者造成安全的假象。
在對具有A屬性的檔案進行操作時,A屬性可以提高一定的性能。而S屬性能夠最大限度的保障檔案的完整性。
本文将主要讨論a屬性和i屬性,因為這兩個屬性對于提高檔案系統的安全性和保障檔案系統的完整性有很大的好處。同樣,一些開放 源碼的BSD系統(如:FreeBSD和OpenBSD),在其UFS或者FFS實作中也支援類似的特征。
<b>2.使用什麼指令設定和顯示ext3檔案系統的屬性</b>
在任何情況下,标準的ls指令都不會一個檔案或者目錄的擴充屬性。ext3檔案系統工具包中有兩個工具--chattr和lsattr,專門用來設定 和查詢檔案屬性。因為ext3是标準的Linux檔案系統,是以幾乎所有的釋出都有e2fsprogs工具包。如果由于某些原因,系統中沒有這個 工具,你可以從以下位址這個工具包的源代碼編譯并安裝:http://sourceforge.net/projects/e2fsprogs
lsattr指令隻支援很少的選項,其選項如下:
-a
列出目錄中的所有檔案,包括以.開頭的檔案。
-d
以和檔案相同的方式列出目錄,并顯示其包含的内容。
-R
以遞歸的方式列出目錄的屬性及其内容。
-v
列出檔案版本(用于網絡檔案系統NFS)。
chattr指令可以通過以下三種方式執行:
chattr +Si test.txt
給test.txt檔案添加同步和不可變屬性。
chattr -ai test.txt
把檔案的隻擴充(append-only)屬性和不可變屬性去掉。
chattr =aiA test.txt
使test.txt檔案隻有a、i和A屬性。
最後,每個指令都支援-R選項,用于遞歸地對目錄和其子目錄進行操作。
<b>3.ext3屬性和檔案權限的差別</b>
幾乎所有的系統管理者都了解UNIX風格檔案系統的權限和所有者以及ls指令的顯示,例如:
[root@typhoid nixe0n]# ls -al test*
-rw-rw-r-- 1 nixe0n users 0 Nov 17 17:02 test.conf
-rw-rw-r-- 1 nixe0n users 0 Nov 17 17:02 test.log
-rw-rw-r-- 1 nixe0n users 0 Nov 16 19:41 test.txt
從ls的輸出結果看,這些檔案屬于使用者nixe0n,而nixe0n所在的使用者組是users。使用者nixe0n本人和users使用者組的成員尉有具有對檔案 的修改權限,而其他的使用者隻有讀取檔案的權限。下面是lsattr指令的輸出:
[root@typhoid nixe0n]# lsattr -a test*
---i-------- test.conf
----a------- test.log
------------ test.txt
輸出結果顯示,test.log隻能被添加,而test.conf檔案不準修改。在UNIX系統中,如果一個使用者以root的權限登入,檔案系統的權限控 制将無法對root使用者和以root權限運作的程序進行任何的限制。這樣對于UNIX類的作業系統,如果攻擊者通過遠端或者本地攻擊獲得 root權限将可能對系統造成嚴重的破壞。而ext2檔案系統可以作為最後一道防線,最大限度地減小系統被破壞的程度,并儲存攻擊者的 行蹤。ext2屬性是由sys_open()和sys_truncate()等系統調用檢查和賦予的,不受使用者識别号和其他因素的影響,在任何情況下,對具有 不可修改(immutable)屬性的檔案的進行任何修改都會失敗,不管是否是root使用者進行的修改。
但是,還有一個問題是root權限的使用者可以通過删除i屬性實作對檔案的修改。這種防護隻不過給獲得root權限的攻擊者加了一點小麻煩 罷了,系統的安全性并沒有根本性的提高。
在2.1之前的核心版本中,存在一個安全層(securelevel)的特征。使用安全層可以解決上述問題,因為如果系統的安全層大于0,核心将 不允許對任何檔案的i屬性進行修改。這些版本的核心由sysctl指令的"kernel.securelevel"變量進行控制。如果在啟動時,這個變量 的值被設定為1或者更大的值,核心将不允許對具有i屬性和a屬性檔案進行修改,除非國旗動到單使用者狀态。
但是,由于引入了更為靈活的核心能力特征(kernel capabilities),以後的核心不再支援安全層。使用核心能力,也可以實作類似的 限制。工具lcap用來查詢和調整核心能力限制集(kernel capabilities bounding set)。在啟動腳本中加入以下指令,就可以實作對具有i屬 性和a屬性檔案的保護:
lcap CAP_LINUX_IMMUTABLE
lcap CAP_SYS_RAWIO
第一個指令删除任何使用者(包括超級使用者)對i标志的修改能力。第二個指令删除任何使用者(主要針對超級使用者)對塊裝置的原始通路 (raw access)能力,防止一些技術高超的攻擊者直接修改檔案系統索引節點的immutable域。BTW,在系統啟動時,CAP_SYS_RAWIO能 力應該直接删除,這個能力是一個非常大的潛在威脅。高明的攻擊者獲得了超級使用者權限之後,通過/dev/kmem裝置可以直接修改核心 記憶體。通過這種方式,可以破壞系統的核心能力限制集(kernel capabilities bounding)。如果沒有任何參數,會列出核心支援的能力和目 前生效的核心能力。
一旦一個核心能力被删除,就隻有在系統重新啟動,進入到單使用者模式才能删除能力限制。
感興趣的讀者,可以從下面的連接配接中獲得更為詳細的能力方面的知識:
LCAP - Linux核心能力限制集編輯器(Linux Kernel Capabilities Bounding Set Editor)
http://pw1.netcom.com/~spoon/lcap/
<b>4.我們應該使用chattr做什麼?</b>
主機直接暴露在Internet或者位于其它危險的環境,有很多shell帳戶或者提供HTTP和FTP等網絡服務,一般應該在安裝配置完成後使用 如下指令:
chattr -R +i /bin /boot /etc /lib /sbin
chattr -R +i /usr/bin /usr/include /usr/lib /usr/sbin
chattr +a /var/log/messages /var/log/secure (...)
如果很少對帳戶進行添加、變更或者删除,把/home本身設定為immutable屬性也不會造成什麼問題。在很多情況下,整個/usr目錄樹也 應該具有不可改變屬性。實際上,除了對/usr目錄使用chattr -R +ii /usr/指令外,還可以在/etc/fstab檔案中使用ro選項,使/usr目錄所在 的分區以隻讀的方式加載。另外,把系統日志檔案設定為隻能添加屬性(append-only),将使入侵者無法擦除自己的蹤迹。
當然,如果使用這種安全措施,需要系統管理者修改管理方式。
4.1.安裝、更新軟體
由于軟體管理程式需要加入和删除某些檔案和目錄,是以在進行軟體安裝和更新之前需要删除某些目錄和檔案的immutable和append- only屬性。對于Linux系統,我們一般使用rpm管理軟體包,你可以使用以下指令檢視要安裝或者更新的軟體包都有哪些檔案:
rpm -qipl foopackage.rpm
然後曲調有關目錄和檔案的immutable和append-only屬性。大多數軟體包需要rpm指令對以下目錄的一個或者多個進行寫操作:
/bin
/sbin
/usr/bin
/usr/sbin
/usr/man
/lib
/etc
注意,如果你需要更新/usr/sbin/someprogram,你應該去掉someprogram檔案以及目錄/usr/sbin的immutable屬性。
4.2.管理使用者和使用者組
如果要進行使用者和使用者組,以下的目錄和檔案需要能夠被讀寫: