天天看點

用chattr保護檔案系統的安全

 chattr

1.作用

修改ext2和ext3檔案系統屬性(attribute),使用權限超級使用者。

2.格式

chattr [-RV] [-+=AacDdijsSu] [-v version] 檔案或目錄

3.主要參數

-R:遞歸處理所有的檔案及子目錄。

-V:詳細顯示修改内容,并列印輸出。

-:失效屬性。

+:激活屬性。

= :指定屬性。

A:Atime,告訴系統不要修改對這個檔案的最後通路時間。

S:Sync,一旦應用程式對這個檔案執行了寫操作,使系統立刻把修改的結果寫到磁盤。

a:Append Only,系統隻允許在這個檔案之後追加資料,不允許任何程序覆寫或截斷這個檔案。如果目錄具有這個屬性,系統将隻允許在這個目錄下建立和修改檔案,而不允許删除任何檔案。

i:Immutable,系統不允許對這個檔案進行任何的修改。如果目錄具有這個屬性,那麼任何的程序隻能修改目錄之下的檔案,不允許建立和删除檔案。

D:檢查壓縮檔案中的錯誤。

d:No dump,在進行檔案系統備份時,dump程式将忽略這個檔案。

C:Compress,系統以透明的方式壓縮這個檔案。從這個檔案讀取時,傳回的是解壓之後的資料;而向這個檔案中寫入資料時,資料首先被壓縮之後才寫入磁盤。

:Secure Delete,讓系統在删除這個檔案時,使用0填充檔案所在的區域。

u:Undelete,當一個應用程式請求删除這個檔案,系統會保留其資料塊以便以後能夠恢複删除這個檔案。

4.說明

chattr 指令的作用很大,其中一些功能是由Linux核心版本來支援的,如果Linux核心版本低于2.2,那麼許多功能不能實作。同樣-D檢查壓縮檔案中的錯誤的功能,需要2.5.19以上核心才能支援。另外,通過chattr指令修改屬性能夠提高系統的安全性,但是它并不适合所有的目錄。chattr指令不能保護/、/dev、/tmp、/var目錄。

      雖然檔案系統能夠接受并保留表示每個屬性的标志,但是這些屬性卻不一定有效,這要看核心的版本。表2是每個版本支援的屬性:

在這些屬性中,最為重要的是a(Append Only)屬性和不可修改(immutable)屬性,它們對于提高檔案系統的安全性和保障檔案系統的完整性(尤其對于系統日志檔案)有很大的作用。

另外,由于ext3檔案系統是以ext2檔案系統為基礎的,是以所有ext2檔案系統支援的屬性,ext3檔案系統也都支援。 

管理工具

标準的系統指令,例如:ls、chmod并不支援對檔案屬性的查詢和修改。要檢視或者修改檔案或者目錄的屬性,需要使用ext2檔案系統工具包(e2fsprogs)中的兩個工具:chattr和lsattr。

chattr的用法和指令chmod指令的用法極為相似,例如:

◆ 給test.txt檔案添加同步(S)和不可修改(i)屬性:

[root@LinuxAid nixe0n]# chattr +Si test.txt

◆ 把檔案的隻擴充(a)屬性和不可變屬性(i)去掉:

[root@LinuxAid nixe0n]# chattr -ai test.txt

◆ 把test.txt檔案的屬性設定為a、i和A:

[root@LinuxAid nixe0n]# chattr =aiA test.txt

◆ 遞歸地改變test目錄下所有檔案和目錄的屬性:

[root@LinuxAid nixe0n]# chattr -R +i test/

屬性和權限的差別

幾乎所有使用Unix系統的使用者都了解檔案/目錄權限和所有者的概念,對ls指令就更熟悉不過了。下面,我們使用具體的例子來看屬性和權限的差別:

[nixe0n@LinuxAid nixe0n]$ ls -al test*

-rw-rw-r--    1 nixe0n  users           0 Oct 17 17:02 test.conf

-rw-rw-r--    1 nixe0n  users           0 Oct 17 17:02 test.log

-rw-rw-r--    1 nixe0n  users           0 Oct 16 19:41 test.txt

從ls的輸出可以得到這些資訊:這些檔案屬于使用者nixe0n、nixe0n所在的使用者組是users、使用者nixe0n本人、users使用者組的成員具有對檔案的修改權限、其他的使用者隻有讀取檔案的權限。

下面再看lsattr指令的輸出:

[nixe0n@LinuxAid nixe0n]$ lsattr -a test*

---i-------- test.conf

----a------- test.log

------------ test.txt

輸出結果顯示,test.log隻能被添加,而test.conf檔案不準任何修改。

利用chattr提高系統的安全

在Unix及Linux系統中,如果一個使用者以root的權限登入或者某個程序是以root的權限運作的,使用權限就不再有任何的限制了。是以,攻擊者通過遠端或者本地攻擊手段獲得系統的root權限将是一個災難。

在這種情況下,檔案系統将是系統的最後一道防線,合理的屬性設定可以最大限度地減小對系統的破壞程度,儲存攻擊者的行蹤。在核心中,屬性是由sys_open()和sys_trunca

te()等系統調用檢查和修改的,不受使用者識别号的影響。是以在任何情況下,試圖對具有不可修改(immutable)屬性的檔案進行任何修改都會失敗,而不管是否是root使用者。例如:

[root@S103 home]# touch bb.txt

[root@S103 home]# chattr +i bb.txt

[root@S103 home]# rm -rf bb.txt

rm: cannot remove `bb.txt': Operation not permitted

不過,到目前為止防護隻不過給攻擊者加了一點小麻煩罷了。隻要獲得了root權限,他可以使用chattr指令把檔案的i屬性去掉。是以,系統的安全性并沒有根本性的提高,我們還需要和其他的方法結合使用才能真正提供系統的安全性。

在Linux2.1之前的核心版本中,存在一個安全層(secure level)的概念。如果系統的安全層大于0,核心将不允許對任何檔案的i屬性進行修改。這些版本的核心由sysctl指令的“kernel.securelevel”變量進行控制。如果在啟動時,這個變量的值被設定為1或者更大的值,核心将不允許對具有i屬性和a屬性的檔案進行修改,除非啟動到單使用者狀态。

但是,在2.2版及以後的版本中,Linux核心引入了更為靈活的能力(capability)的概念。修改能力限制集(capabilities bounding set),使核心放棄CAP_LINUX_不可修改(immutable)屬性和CAP_SYS_RAWIO能力,才能使屬性的保護生效。直接修改能力限制集(capabilities bounding set)比較麻煩,工具lcap(作者的個人首頁已經關閉,可以使用google找一下)可以幫助您友善地放棄核心的能力:

lcap CAP_LINUX_IMMUTABLE

lcap CAP_SYS_RAWIO

上面的第一個指令删除任何使用者(包括超級使用者)對i标志的修改能力;第二個指令删除任何使用者(主要針對超級使用者)對塊裝置直接通路的能力,防止一些技術高超的攻擊者直接修改檔案系統索引節點的不可修改(immutable)屬性域。一旦一個核心能力被删除,就隻有在系統重新啟動,才能恢複被删除能力。

如果主機直接暴露在Internet或者位于其他危險的環境,而且有很多shell賬戶或者提供HTTP和FTP等網絡服務,一般應該在安裝配置完成後對一些重要的目錄和檔案加上i屬性,以及給一些重要的日志檔案加上a屬性:

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目錄樹也應該具有不可改變屬性。除此之外,為了系統的安全,還可以修改/etc/fstab使/usr目錄所在的分區以隻讀的方式加載。另外,把系統日志檔案設定為隻能添加屬性(append-only),将使入侵者無法擦除自己的蹤迹。

不過,如果在系統中大範圍地使用,可能會造成一些不便,下面我們分别讨論這些問題。

安裝、更新軟體

由于軟體管理程式需要加入和删除某些檔案和目錄,是以在進行軟體安裝和更新之前需要删除某些目錄和檔案的不可修改(immutable)屬性和append-only屬性。對于Linux系統,我們一般使用rpm管理軟體包,您可以使用以下指令檢視要安裝或者更新的軟體包都有哪些檔案:

rpm -qipl foopackage.rpm

然後去掉有關目錄和檔案的不可修改(immutable)屬性和append-only屬性。通常,使用rpm指令更新軟體需要對以下目錄進行寫操作:

/bin

/sbin

/usr/bin

/usr/sbin

/usr/man 

/lib

/etc

/usr/share

是以,如果您需要更新/usr/sbin/someprogram,您應該去掉someprogram檔案本身以及目錄/usr/sbin的不可修改(immutable)屬性。

使用者和使用者組的管理

如果要修改使用者和使用者組,需要讀寫以下的目錄和檔案:

/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)和use

rad

d(8)等指令需要在/etc目錄下建立臨時檔案,修改這個檔案,然後删除原始檔案,最後把新檔案複制為被修改的系統檔案。

不能濫用屬性的目錄

雖然屬性能夠提高系統的安全性,但是它并不适合所有的目錄。如果在系統中濫用chattr,可能造成很多問題,甚至使系統無法工作。表4是使用chattr時應該注意的一些問題。

表1

屬性                                      含義

A               Atime。告訴系統不要修改對這個檔案的最後通路時間。

S               Sync。一旦應用程式對這個檔案執行了寫操作,系統  立刻把修改的結果寫到磁盤。

a               Append Only。系統隻允許在這個檔案之後追加資料,不  允許任何程序覆寫或者截斷這個檔案。如果目錄具有  這個屬性,系統将隻允許在這個目錄下建立和修改文  件,而不允許删除任何檔案。

i 不可修改(immutable)屬性。系統不允許對這個檔案進行  任何的修改。如果目錄具有這個屬性,那麼任何的進  程隻能修改目錄之下的檔案,不允許建立和删除檔案。

d               No dump。在進行檔案系統備份時,dump程式将忽略這  個檔案。

c Compress。系統以透明的方式壓縮這個檔案。從這個文  件讀取時,傳回的是解壓之後的資料;而向這個檔案  中寫入資料時,資料被壓縮之後,才寫入磁盤。

s                   Secure Delete。讓系統在删除這個檔案時,使用0填充  檔案所在的區域。

u Undelete。當一個應用程式請求删除這個檔案,系統會  保留其資料塊以便以後能夠恢複這個檔案。

表2

屬性           1.0版         1.2版       2 .0版            2.2版             2.4版

A                   N/A          N/A          A                   A                   A

S                     A            A             A                   A                   A

a                    N/A          A             A                   A                   A

i                     N/A         A              A                   A                   A 

d                   N/A          A              A                   A                   A

c                   I              I                I                   I                     I

s                   A             A               I                   I                     I

u                   I              I                I                   I                     I

表中:A:核心支援,I:可以設定,但是會被忽略,N/A:核心不支援。

表3

-a   列出目錄中的所有檔案,包括隐藏檔案(以點開頭)。

-d   以和檔案相同的方式列出目錄,并顯示其包含的内容。

-R   以遞歸的方式列出目錄的屬性及其内容。

-v   列出網絡檔案系統(Network File System)的檔案版本。

表4

/ 很顯然,根目錄不能有不可修改(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屬性。

本文來自ChinaUnix部落格,如果檢視原文請點:

http://blog.chinaunix.net/u/20647/showart_345322.html

繼續閱讀