使用chattr提高ext2文件系統的安全性
簡介
眾所周知,Linux內核中有大量安全特征。其中有很多的特征有著廣泛的應用,但是絕大多數的系統管理員(包括一些資深系統管理員)都忽略了EXT2文件系統的屬性(attribute)。Linux的這種安全特征甚至遠沒有Lids和Tripwire等外部安全工具受關注。本文將詳細介紹EXT2文件系統的屬性已經如何使用這個特征保護系統的安全。
1.什么是ext2的屬性(attribute)
從Linux的1.1系列內核開始,ext2文件系統就開始支持一些針對文件和目錄的額外標記或者叫作屬性(attribute)。在2.2和2.4系列的內核中,ext2文件系統支持以下屬性的設置和查詢:
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實現中也支持類似的特征。
2.使用什么命令設置和顯示ext2文件系統的屬性
在任何情況下,標準的ls命令都不會一個文件或者目錄的擴展屬性。ext2文件系統工具包中有兩個工具--chattr和lsattr,專門用來設置和查詢文件屬性。因為ext2是標準的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選項,用于遞歸地對目錄和其子目錄進行操作。
3.ext2屬性和文件權限的區別
幾乎所有的系統管理員都理解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/
4.我們應該使用chattr做什么?
主機直接暴露在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.管理用戶和用戶組
如果要進行用戶和用戶組,以下的目錄和文件需要能夠被讀寫:
/etc
/etc/.pwd.lock
/etc/passwd
/etc/passwd-
/etc/shadow
/etc/shadow-
/etc/group
/etc/group-
/etc/gshadow
/etc/gshadow-
passwd(1)、 chsh(1)、chfn(1)、vipw(8)、vigr(8)和useradd(8)等命令需要在/etc目錄下建立臨時的拷貝,修改這個拷貝,然后刪除原始文件,最后把新拷貝。
5.不能使用chattr命令的目錄
雖然屬性能夠提高系統的安全性,但是它并不適合所有的目錄。如果在系統中濫用chattr,可能造成很多問題,甚至使系統無法工作。
/
很顯然,根分區不能有immutable屬性。如果根分區具有immutable屬性,系統將根本無法工作。
/dev
在啟動時,syslog需要刪除并重新建立/dev/log套接字設備。如果對/dev/目錄設置了immutable和append-only屬性,就可能出現問題,除非在啟動syslogd時使用-p選項指定其它的套接字,例如:/var/run/syslog.sock。即使這樣也還存在一些問題,syslog客戶程序需要/dev/log套接字設備,因此需要建立一個自相真正套接字的符號連接。總而言之,為了減少麻煩,這個目錄還是不要設置immutable和append-only屬性。
/tmp
有很多應用程序和系統程序需要在這個目錄下建立臨時文件,因此這個目錄也不能設置immutable和append-only屬性。
/var
這個目錄不能設置immutable屬性。對append-only屬性的使用要根據實際情況。例如,為var/log目錄下的日志文件設置了append-only屬性,會使日志輪換(logrotate)無法進行,但不會造成太大問題,你需要權衡是否使用日志輪換的利弊,以絕對是否對日志文件設置append-only屬性。再比如,sendmail程序會定時地截斷或者覆蓋/var/log/sendmail.st文件,因此也不能設置append-only屬性。
總結
雖然ext2文件系統的屬性已經出現了很長時間,但是對它的應用和系統的介紹卻不是很多。很里地使用文件系統的屬性,對提高系統的安全性有很大好處。