天天看點

安全運維之:檔案系統安全

一、鎖定系統重要檔案

系統運維人員有時候可能會遇到通過root使用者都不能修改或者删除某個檔案的情況,産生這種情況的大部分原因可能是這個檔案被鎖定了。在Linux下鎖定檔案的指令是chattr,通過這個指令可以修改ext2、ext3、ext4檔案系統下檔案屬性,但是這個指令必須有超級使用者root來執行。和這個指令對應的指令是lsattr,這個指令用來查詢檔案屬性。

通過chattr指令修改檔案或者目錄的檔案屬性能夠提高系統的安全性,下面簡單介紹下chattr和lsattr兩個指令的用法。

chattr指令的文法格式如下:

chattr [-RV] [-v version] [mode] 檔案或目錄

主要參數含義如下:

-R:遞歸修改所有的檔案及子目錄。

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

其中mode部分用來控制檔案的屬性,常用參數如下表所示:

參數 含義

+ 在原有參數設定基礎上,追加參數

- 在原有參數設定基礎上,移除參數

= 更新為指定參數

a 即append,設定該參數後,隻能向檔案中添加資料,而不能删除。常用于伺服器日志檔案安全,隻有root使用者才能設定這個屬性

c 即compresse,設定檔案是否經壓縮後再存儲。讀取時需要經過自動解壓操作

i 即immutable,設定檔案不能被修改、删除、重命名、設定連結等,同時不能寫入或新增内容。這個參數對于檔案系統的安全設定有很大幫助

s 安全的删除檔案或目錄,即檔案被删除後硬碟空間被全部收回

u 與s參數相反,當設定為u時,系統會保留其資料塊以便以後能夠恢複删除這個檔案。這些參數中,最常用到的是a和i,a參數常用于伺服器日志檔案安全設定,而i參數更為嚴格,不允許對檔案進行任何操作,即使是root使用者

lsattr用來查詢檔案屬性,用法比較簡單,其文法格式如下:

lsattr [-adlRvV] 檔案或目錄

常用參數如下表所示。

-a 列出目錄中的所有檔案,包括以.開頭的檔案

-d 顯示指定目錄的屬性

-R 以遞歸的方式列出目錄下所有檔案及子目錄以及屬性值

-v 顯示檔案或目錄版本

在Linux系統中,如果一個使用者以root的權限登入或者某個程序以root的權限運作,那麼它的使用權限就不再有任何的限制了。是以,攻擊者通過遠端或者本地攻擊手段獲得了系統的root權限将是一個災難。在這種情況下,檔案系統将是保護系統安全的最後一道防線,合理的屬性設定可以最大限度地減小攻擊者對系統的破壞程度,通過chattr指令鎖定系統一些重要的檔案或目錄,是保護檔案系統安全最直接、最有效的手段。

對一些重要的目錄和檔案可以加上“i”屬性,常見的檔案和目錄有:

chattr -R +i /bin /boot /lib /sbin

chattr -R +i /usr/bin /usr/include /usr/lib /usr/sbin

chattr +i /etc/passwd

chattr +i /etc/shadow

chattr +i /etc/hosts

chattr +i /etc/resolv.conf

chattr +i /etc/fstab

chattr +i /etc/sudoers

對一些重要的日志檔案可以加上“a”屬性,常見的有:

chattr +a /var/log/messages

chattr +a /var/log/wtmp

對重要的檔案進行加鎖,雖然能夠提高伺服器的安全性,但是也會帶來一些不便,例如,在軟體的安裝、更新時可能需要去掉有關目錄和檔案的immutable屬性和append-only屬性,同時,對日志檔案設定了append-only屬性,可能會使日志輪換(logrotate)無法進行。是以,在使用chattr指令前,需要結合伺服器的應用環境來權衡是否需要設定immutable屬性和append-only屬性。

另外,雖然通過chattr指令修改檔案屬性能夠提高檔案系統的安全性,但是它并不适合所有的目錄。chattr指令不能保護/、/dev、/tmp、/var等目錄。

根目錄不能有不可修改屬性,因為如果根目錄具有不可修改屬性,那麼系統根本無法工作:/dev在啟動時,syslog需要删除并重建立立/dev/log套接字裝置,如果設定了不可修改屬性,那麼可能出問題;/tmp目錄會有很多應用程式和系統程式需要在這個目錄下建立臨時檔案,也不能設定不可修改屬性;/var是系統和程式的日志目錄,如果設定為不可修改屬性,那麼系統寫日志将無法進行,是以也不能通過chattr指令保護。

雖然通過chattr指令無法保護/dev、/tmp等目錄的安全性,但是有另外的方法可以實作,在面将做詳細介紹。

二、檔案權限檢查和修改

不正确的權限設定直接威脅着系統的安全,是以運維人員應該能及時發現這些不正确的權限設定,并立刻修正,防患于未然。下面列舉幾種查找系統不安全權限的方法。

(1)查找系統中任何使用者都有寫權限的檔案或目錄

查找檔案:find / -type f -perm -2 -o -perm -20 |xargs ls -al

查找目錄:find / -type d -perm -2 -o -perm -20 |xargs ls –ld

(2)查找系統中所有含“s”位的程式

find / -type f -perm -4000 -o -perm -2000 -print | xargs ls –al

含有“s”位權限的程式對系統安全威脅很大,通過查找系統中所有具有“s”位權限的程式,可以把某些不必要的“s”位程式去掉,這樣可以防止使用者濫用權限或提升權限的可能性。

(3)檢查系統中所有suid及sgid檔案

find / -user root -perm -2000 -print -exec md5sum {} \;

find / -user root -perm -4000 -print -exec md5sum {} \;

将檢查的結果儲存到檔案中,可在以後的系統檢查中作為參考。

(4)檢查系統中沒有屬主的檔案

find / -nouser -o –nogroup

沒有屬主的孤兒檔案比較危險,往往成為黑客利用的工具,是以找到這些檔案後,要麼删除掉,要麼修改檔案的屬主,使其處于安全狀态。

三、/tmp、/var/tmp、/dev/shm安全設定

在Linux系統中,主要有兩個目錄或分區用來存放臨時檔案,分别是/tmp和/var/tmp。存儲臨時檔案的目錄或分區有個共同點就是所有使用者可讀寫、可執行,這就為系統留下了安全隐患。攻擊者可以将病毒或者木馬腳本放到臨時檔案的目錄下進行資訊收集或僞裝,嚴重影響伺服器的安全,此時,如果修改臨時目錄的讀寫執行權限,還有可能影響系統上應用程式的正常運作,是以,如果要兼顧兩者,就需要對這兩個目錄或分區就行特殊的設定。

/dev/shm是Linux下的一個共享記憶體裝置,在Linux啟動的時候系統預設會加載/dev/shm,被加載的/dev/shm使用的是tmpfs檔案系統,而tmpfs是一個記憶體檔案系統,存儲到tmpfs檔案系統的資料會完全駐留在RAM中,這樣通過/dev/shm就可以直接操控系統記憶體,這将非常危險,是以如何保證/dev/shm安全也至關重要。

對于/tmp的安全設定,需要看/tmp是一個獨立磁盤分區,還是一個根分區下的檔案夾,如果/tmp是一個獨立的磁盤分區,那麼設定非常簡單,修改/etc/fstab檔案中/tmp分區對應的挂載屬性,加上nosuid、noexec、nodev三個選項即可,修改後的/tmp分區挂載屬性類似如下:

LABEL=/tmp     /tmp          ext3    rw,nosuid,noexec,nodev   0 0

其中,nosuid、noexec、nodev選項,表示不允許任何suid程式,并且在這個分區不能執行任何腳本等程式,并且不存在裝置檔案。

在挂載屬性設定完成後,重新挂載/tmp分區,保證設定生效。

對于/var/tmp,如果是獨立分區,安裝/tmp的設定方法是修改/etc/fstab檔案即可;如果是/var分區下的一個目錄,那麼可以将/var/tmp目錄下所有資料移動到/tmp分區下,然後在/var下做一個指向/tmp的軟連接配接即可。也就是執行如下操作:

[root@server ~]# mv /var/tmp/* /tmp

[root@server ~]# ln -s  /tmp /var/tmp

如果/tmp是根目錄下的一個目錄,那麼設定稍微複雜,可以通過建立一個loopback檔案系統來利用Linux核心的loopback特性将檔案系統挂載到/tmp下,然後在挂載時指定限制加載選項即可。一個簡單的操作示例如下:

[root@server ~]# dd if=/dev/zero of=/dev/tmpfs bs=1M count=10000

[root@server ~]# mke2fs -j /dev/tmpfs

[root@server ~]# cp -av /tmp /tmp.old

[root@server ~]# mount -o loop,noexec,nosuid,rw /dev/tmpfs /tmp

[root@server ~]# chmod 1777 /tmp

[root@server ~]# mv -f /tmp.old/* /tmp/

[root@server ~]# rm -rf /tmp.old

最後,編輯/etc/fstab,添加如下内容,以便系統在啟動時自動加載loopback檔案系統:

/dev/tmpfs /tmp ext3 loop,nosuid,noexec,rw 0 0

為了驗證一下挂載時指定限制加載選項是否生效,可以在/tmp分區建立一個shell檔案,操作如下:

[root@tc193 tmp]# ls -al|grep shell

-rwxr-xr-x   1 root root    22 Oct  6 14:58 shell-test.sh

[root@server ~]# pwd

/tmp

[root@tc193 tmp]# ./shell-test.sh 

-bash: ./shell-test.sh: Permission denied

可以看出,雖然檔案有可執行屬性,但是已經在/tmp分區無法執行任何檔案了。

最後,再來修改一下/dev/shm的安全設定。由于/dev/shm是一個共享記憶體裝置,是以也可以通過修改/etc/fstab檔案設定而實作,在預設情況下,/dev/shm通過defaults選項來加載,對保證其安全性是不夠的,修改/dev/shm的挂載屬性,操作如下:

tmpfs   /dev/shm    tmpfs   defaults,nosuid,noexec,rw  0 0

通過這種方式,就限制了任何suid程式,同時也限制了/dev/shm的可執行權限,系統安全性得到進一步提升。

本文轉自南非螞蟻51CTO部落格,原文連結:http://blog.51cto.com/ixdba/1554238 ,如需轉載請自行聯系原作者