作者:
[email protected]
一、系統入侵
隨著Internet上的Linux主機的增加,越來越多的安全漏洞在當前的GNU/Linux系統上發現。你也許在Internet上聽說過在Linux下發現Bug,它會導致系統很容易的被黑客攻擊。
因為Linux是一個開放源代碼的系統,漏洞很容易發現,並且也會很快的有補丁出來。但是當漏洞沒有公布的時候,並且管理員很懶,沒有去打補丁。黑客就會很容易的攻擊這個系統,取得root權限,在現有的GNU/Linux下,他就可以做任何他想做的事情。現在你可以問,我們現在到底可以做些什麼呢?
1、現在的GNU/Linux錯誤在哪裡?
超級用戶會濫用職權,他能夠做所有他要做的事情。作為root。他會改變所有的東西。
許多系統文件很容易被更改。這些文件可能是很重要的文件,如/bin/login,如果一個黑客進入,他可以上傳一個login程序來覆蓋/bin/login,這樣他就可以不用登陸名和密碼來登陸系統。但是這些文件不需要經常改動,除非你要升級系統。
模塊modules很容易用來中斷內核。模塊是為了讓Linux內核更模塊話和更高效而設計的。但是當模塊加入到內核,它就會成為內核的一部分並且能做原始內核能做的工作。因此,一些不友好的代碼可以寫成模塊來加入到內核裡,這些代碼就會重定向系統調用並且作為一個病毒來運行。
進程是不受保護的,一些進程,如後台的Web服務器,一直都認為是沒有嚴格保護的程序。因此,他們就會很容易被黑客攻擊。
2、LIDS的設想是什麼。
保護重要文件。因為文件很容易被root更改,為什麼不嚴格文件操作呢?因此,LIDS改變了文件系統在內核裡的安全系統調用。如果某個時候一些人訪問一個文件,他就會進入系統調用然後我們就可以檢查文件名並且看她們是否被保護。如果它已經被保護,我們就可以拒絕這個訪問者的要求。
保護重要的進程。這個和上面的保護進程的想法不是一樣的。當一個系統裡運行一個進程,它會在/proc 文件系統裡有一個用pid作為路徑名的入口。所以,如果你用"ps -axf"你就可以顯示出當前運行的進程。你可以問如果保護這些進程。如果你要殺死一個進程的話,首先,你鍵入"ps"來得到進程的PID,然後,你鍵入"kill 〈pid〉"來殺死它。但是,如果我不讓你看到進程,你怎麼來殺死這個進程呢?因此,LIDS是用隱藏進程來保護它的。 另外一個重要的方法就是不讓任何人可以殺死進程,包括root用戶。LIDS能夠保護父進程是init(pid=1)的所有進程 。
封裝內核。有時候我們需要要把一些必要的模塊加入到內核裡來使用,另外,我們也要拒絕任何人包括root用戶向內核插入模塊。那麼如何來平衡這個矛盾的問題呢?我們可以只允許在系統啟動的時候插入模塊,然後我們封裝模塊,在封裝後,內核不允許任何人插入模塊到內核裡。通過這種封裝功能,我們能用它來保護重要的文件,進程,我們可以在系統啟動的時候只允許必要的進程,只改變必要的文件。在封裝內核後,我們就不能在對文件有任何的修改。
二、保護文件系統
1、保護文件系統是LIDS的重要功能之一。這個功能是在內核的VFS(虛擬文件系統)層實現的,我們可以保護任何種類的文件系統,如EXT2,FAT。 在LIDS,保護的文件按種類分為以下幾種:
只讀的文件或目錄。只讀文件意味著它們不被允許改寫,如,在目錄/usr/bin,/sbin。這些類型的文件大多數都是二進制系統程序或是系統配置文件,除了在升級系統的時候,我們不需要改變它們。
只可增加文件或目錄。這些文件是那些只可以增加大小的文件。大多數是系統的日值文件,如在/var/log裡的只可增加文件。
額外的文件或目錄,這些文件沒有被保護。一般來說,你想要保護目錄下的所有文件,但是,還需要有一些特殊的文件不要被保護。所以我們可以定義這些文件作為額外的其他的只讀文件。
保護掛載或卸載文件系統。當你在啟動的時候掛載文件系統的時候,你可以禁止所有人,甚至是root,去卸載文件系統。你也可以禁止任何人在當前文件系統下掛載文件系統來覆蓋它。
2、LIDS如何在內核保護文件
在這部分,我們會看到一些內核的代碼來理解LIDS是如何保護文件的。
(1)、Linux文件系統數據結構程序
首先,我們必須了解Linux的虛擬文件系統。
在Linux裡的每一個文件,不管是什麼樣子的,都有一個結點inode數,文件系統提供了以下數據結構。
在/usr/src/linux/include/linux/fs.h
strUCt inode {
struct list_head i_hash;
struct list_head i_list;
struct list_head i_dentry;
unsigned long i_ino; ----> inode number.
unsigned int i_count;
kdev_t i_dev; ----> device number.
umode_t i_mode;
nlink_t i_nlink;
uid_t i_uid;
......
}
注意:用來鑒定一個結點inode。這個意思是你可以用一對來得到一個系統裡獨一無二的inode。
在/ur/src/linux/cinclude/linux/dcache.h裡
struct dentry {
int d_count;
unsigned int d_flags;
struct inode * d_inode; /* Where the name belongs to - NULL is negative */
struct dentry * d_parent; /* parent Directory */
struct dentry * d_mounts; /* mount information */
struct dentry * d_covers; struct list_head d_hash; /* lookup hash list */
struct list_head d_lru; /* d_count = 0 LRU list */
struct list_head d_child; /* child of parent list */
struct list_head d_subdirs; /* our
......
}
dentry是一個目錄文件的入口。通過這個入口,我們可以很容易的在文件的父目錄下移動。
例如,如果你一文件的inode是(struct inode*)file_inode,如果你可以用file_inode->d_entry來得到它的目錄入口並且用file_inode->d_entry->d_parent來得到父目錄的目錄入口。
(2)、LIDS保護數據結構
在分析完linux文件系統後,讓我們來看看LIDS是如何容VFS來保護文件和目錄的。
在/usr/src/linux/fs/lids.c
struct secure_ino {
unsigned long int ino; /* the inode number */
......
}
dentry是一個目錄文件的入口。通過這個入口,我們可以很容易的在文件的父目錄下移動。
例如,如果你一文件的inode是(struct inode*)file_inode,如果你可以用file_inode->d_entry來得到它的目錄入口並且用file_inode->d_entry->d_parent來得到父目錄的目錄入口。
(2)、LIDS保護數據結構
在分析完linux文件系統後,讓我們來看看LIDS是如何容VFS來保護文件和目錄的。
在/usr/src/linux/fs/lids.c
struct secure_ino {
unsigned long int ino; /* the inode number */