構建LINUX下的入侵檢測系統——LIDS 系統管理命令--vlockhtml
http://blog.chinaunix.net/uid-306663-id-2440200.htmlnode
LIDS官方網站:http://lids.luky.org/linux
Who's newweb
hkbadu
harpo_marx
arthit75
lbcoqkf
kravciak
Who's onlineapache
There are currently 0 users and 2 guests online.
LIDS 2.2.3rc3 is released for kernel 2.6.23數組
Thu, 01/24/2008 - 01:37 — omo 已經無更新
lids-2.2.3rc3-2.6.23 which included TPE/NFMark feature is
already available.安全
You can download it from
http://www.secureos.jp/LIDS-JP/develop/
You must completely re-install lidstools to lidstools-2.2.7.3 also.
(It means you must erase /etc/lids directory and re-make ACL with
new version of lidsconf command.)服務器
Also, now I'm developing lids-2.2.3rc4-2.6.23 which will inclide TDE/Sandbox feature. Stay tuned.網絡
OMO數據結構
omo's blog
LIDS 2.2.3rc1 is released for kernel 2.6.21
Thanks to Kazuki Omo , We have this new version for kernel 2.6.21, you can download it from lids-2.2.3rc1-2.6.21.patch and the related lidstools-2.2.7.2.tar.gz
ChangeLog
* moved CAP_PROTECTED/CAP_KILL_PROTECTED to LIDS_CAP_PROTECTED/LIDS_CAP_KILL_PROTECTED.
Then above 2 capabilities syntaxes are changed to lidsconf -A -s "Subject" -o LIDS_CAP_PROTECTED -j ENABLE
Read more
Welcome to the LIDS new site
We are starting a new LIDS site as well as a fresh LIDS software..stay tune.
Cytrun Linux use LIDS
Cytrun Linux https://sourceforge.net/projects/cytrun is based on the Slackware, possesss Kernel 2.6.13 + LIDS, Snort Inline(A modified version of Snort that accepts packets from
iptables). Servers: WEB, EMAIL, SQL, PROXY, SSH, DHCP and DNS, Interface of Remote Administration based on Webmin.
Thanks to Michell L. Garcia, I am autor of the Cytrun Linux.
Syndicate content
Download
補丁名稱是lids-x.xx-y.y.y.tar.gz, x.xx表明lids的版本, y.y.y表明Linux內核版本
lidstools-2.2.7.2.tar.gz
lids-2.2.3rc1-2.6.21.patch
Sponsor
LIDS的組成
兩個用戶態工具和一些文件,和一個內核補丁
/sbin/目錄 存放LIDSADM命令和LIDSCONF命令
/etc/lids/lids.conf #ACLS配置文件
/etc/lids/lids.cap #LIDS capabilities(功能)配置文件
/etc/lids/lids.pw #LIDS密碼文件
/etc/lids/lids.net # LIDS郵件警告配置文件
1、什麼是LIDS
LIDS全稱爲Linux Intrusion Detection System,是一種基於LINUX內核補丁模式的入侵檢測系統,它也是一種基於主機的入侵檢測系統。它集成在LINUX內核中,來進一步增強LINUX內核的安全性,爲LINUX內核提供實現一種安全模式、參考模式和強制存取控制模式。
(1)、LIDS的主要功能:
一、保護:保護硬盤上任何類型的重要文件和目錄,如/bin、/sbin、/usr/bin、/usr/sbin、/etc/rc.d等目錄和其下的文件,以及系統中的敏感文件,如passwd和shadow文件,防止未被受權者(包括ROOT)和未被受權的程序進入,任何人包括ROOT都沒法改變,文件能夠隱藏。保護重要進程不被終止,任何人包括root也不能殺死進程,並且能夠隱藏特定的進程。防止非法程序的RAW IO 操做,保護硬盤,包括MBR保護等等。
二、檢測:集成在內核中的端口掃描器,LIDS能檢測到掃描並報告系統管理員。 LIDS還能夠檢測到系統上任何違反規則的進程。
三、響應:來自內核的安全警告,當有人違反規則時, LIDS會在控制檯顯示警告信息,將非法的活動細節記錄到受LIDS保護的系統log文件中。 LIDS還能夠將log信息發到你的信箱中。LIDS還能夠立刻關閉與用戶的會話。
(2)、在LINUX上應用LIDS的必要性。
隨着LINUX進一步的推廣,如今,有不少中小企業都把本身的重要服務遷移到LINUX上。藉着LINUX系統強大的安全性和較少的成本,架設在LINUX系統上的各類企業服務爲這些中小企業提供了更大的發展和更強的競爭力。可是,在當前網絡環境下,隨着黑客技術的不斷提升,以及黑客數量的不斷增長,加上黑客工具的不斷推陳出新,網絡攻擊事件也愈來愈多。LINUX系統的安全性正在一次次地經受着考驗,LINUX系統的安全缺陷也愈來愈多突現出來。對於這些應用LIUNX系統在網絡中提供企業相關業務的中小企業來講,如何保證這些暴露在網絡中的服務器數據的安全性是一個迫在眉急的問題。雖然,網絡防火牆可以阻止大部份的網絡攻擊,可是,一旦這種攻擊穿透了防火牆,系統上的重要數據就會有徹底控制的危險。所以,在LINUX系統上佈置LIDS是頗有必要的。它可以保證LINUX系統上的重要目錄及文件不被複制、刪除,重要的服務不被刪除或中止,不能修改系統登陸方式等等,爲LINUX系統數據安全提供一種全方位的保護,也可做爲防火牆的一種後備保護方式存在。
2、獲取並安裝LIDS補丁包及LIDS工具包
LIDS是基於開源方式,用戶使用是安全免費的。能夠直接到LIDS官方網站(www.lids.org)上下載,包括LIDS的內核補丁包和LIDS工具包。但必定要保證下載的LIDS補丁包與你當前所使用的LINUX系統內核版本相一致,LIDS工具包能夠下載最新版本的,如今的最新版本是:lids-2.2.7.2.tar.gz,LIDS補丁包的最新版本是:lids-2.2.3rc-2.6.21.patch。 打patch
一、 應用LIDS內核補丁包。
如今以上述最新版本的LIDS內核爲例。將下載的LIDS內核補丁包保存到/usr/src下,以根用戶的權限進入字符模式。如今假設內核在/usr/src/linux下:
# cd /usr/src/linux
# patch p1 < /usr/src/ lids-2.2.3rc-2.6.21.patch
從新配置此內核:
# makemenuconfig
把有關LIDS的全部項都選中。這樣的話,不只對於不太熟習的用戶能省去不少沒必要要的麻煩,同時,它也不是很大,並不會影響多少系統性能的。
在選擇好後就是從新編譯內核:
# make
# make install
這樣一個加入了LIDS的內核就從新編譯好了,但要應用LIDS還應作相應設置。要使加入了LIDS的新內核工做,得從新啓動系統(由於LIDS是一個內核補丁,在選擇好後就是從新編譯內核。)。
二、安裝LIDS工具包。
如今也以它的最新版本做例子,把下載的LIDS工具包保存的到/home/用戶名(用戶名是你係統上登陸的用戶名)目錄中後,按以下方式安裝:
# cd /home/用戶名
# tar -zxvf lids-2.2.7.2.tar.gz
# cd lids-2.2.7.2
# ./configure
# make
# make install
這樣會安裝LIDSADM和LIDSCONF這兩個工具到/sbin/目錄中,同時會建立一個/etc/lids的目錄,並在此目錄下生成一個默認的配置文件。在使用LIDS前應先用「lidsadm –U」命令更新這個默認的配置文件。
(注意:若是在編譯LIDS工具包時出現GCC報LIDSTEXT.h文件不存在的錯誤提示,應修改LIDS工具包的安裝目錄下的MAKEFILE文件,在在其中的CFLAGS選項中加入「-I/usr/src/linux/include」,而後就能夠從新編譯了。)
三、LIDSADM和LIDSCONF命令工具解釋。
(1)、LIDSADM工具及其選項:
LIDSADM是LIDS的管理工具單元,能夠用它在你的系統中管理LIDS,包括啓用或停用LIDS、封存LIDSADM到內核中和查看LIDS狀態。
使用以下命令能夠列出全部可用的選項:
# lidsadm -h
它會返回下列信息:
......
lidsadm -[s/I] -- [+/-] [LIDS_FLAG] [...]
lidsadm -v
lidsadm -h
命令參數:
-s:開關某些保護選項時指示應提交密碼;
-I:開關某些保護選項時不提交密碼;
-v:顯示版本;
-V:查看如今LIDS狀態;
-h:列出全部選項。
可用功能,只列出了它的一部分(Availabe capabilities):
CAP_CHOWN:chown/chgrp
CAP_NET_BROADCAST:監聽廣播
CAP_NET_ADMIN:接口、防火牆、路由器改變
CAP_IPC_LOCK:鎖定共享內存
CAP_SYS_MODULE:插入和移除內核模塊
CAP_HIDDEN:隱藏進程
CAP_SYS_RESOURCE:設置資源限制
CAP_KILL_PROTECTED:殺死保護進程
CAP_PROTECTED:保護進程爲單用戶方式
可用的標誌(Available flags):
LIDS:禁止或激活本地LIDS
LIDS_CLOBAL:徹底禁止或激活LIDS
RELOAD_CONF:從新加載配置文件
(2)、LIDSCONF工具及其選項:
LIDSCONF爲LIDS配置訪問控制列表(ACLS)和設置密碼。
輸入如下命令能顯示全部可用的選項:
# lidsconf -h
它會返回如下信息:
......
lidsconf -A [-s subject] -o object [-d] [-t from-to] [-i level] -j Accept
lidsconf -D [-s file] [-o file]
lidsconf -E
lidsconf -U
lidsconf -L
lidsconf -P
lidsconf -v
lidsconf -[h/H]
命令參數:
-A:增長一條指定的選項到已有的ACL中
-D:刪除一條指定的選項
-E:刪除全部選項
-U:更新dev/inode序號
-L:列出全部選項
-P:產生用Ripemd-160加密的密碼
-V:顯示版本
-h:顯示幫助
-H:顯示更多的幫助
子對像(subject):
-s [--subject]:指定一個子對像,能夠爲任何程序,但必須是文件;
目標(object):
-o[object]:能夠是文件、目錄或功能(capabilities)和socket名稱。
動做:
-j:它有如下在個參數:
DENY:禁止訪問
READONLY:只讀
APPEND:增長
WRITE:可寫
GRANT:對子對像授與能力
ignore:對設置的對像忽略全部權限
disable:禁止一些擴展特性
其它選項:
-d :目標的可執行domain
-i:繼承級別
-t:指定從某一時段到某一時段能夠進行怎樣的操做
-e:擴展列表
3、應用LIDS
一、LIDS的啓用與設置。
首先, 要想使LIDS設置的ACLS發揮做用,應在系統引導時把LIDS封裝進內核中。這樣每次系統啓動到最後階段(啓動最後加載內核模塊),此設置會根據你的系統上的/etc/lids/lids.cap文件中的內容來設置全局功能,此文件中保存的是你設置ACLS。設置封裝內核,在你的/etc/rc.d/rc.local文件的未尾加入以下內容:
/sbin/lidsadm –I
在開始應用LIDS前,若是在安裝命令時沒有詢問你設置密碼,那麼還應爲它設置一個進入終端會話模式的密碼,使用以下命令:
# lidsconf -P
你將被提示輸入密碼,兩次輸入密碼後,系統將你設置的密碼保存到/etc/lids/lids.pw文件中,此密碼已經過Ripemd-160加密。設置了密碼後,若是你想修改ACLS、Capabilities或當你開始LIDS會話時,就須要你提交此密碼。你也能夠在之後再次通此命令來修改已設定的密碼,並在修改完成後用如下命令從新更新LIDS的配置文件:(注意:在修改密碼時不會提示輸入舊密碼。)
lidsadm -S -- +RELOAD_CONF
特別要注意的是,在對LIDS作了任何修改後,都應使用上述命令從新更新LIDS的配置文件,它將從新加載下列配置文件:
/etc/lids/lids.conf #ACLS配置文件
/etc/lids/lids.cap #LIDS capabilities(功能)配置文件
/etc/lids/lids.pw #LIDS密碼文件
/etc/lids/lids.net # LIDS郵件警告配置文件
而後從新啓動系統服務使應用改變生效。
二、 經過LIDS來保護系統。
首先要明白,在經過LIDS保護的LINUX的系統中,能夠經過一個LIDS的自由會話終端模式來修改那些已經加入到保護中的數據,全部的LIDS設置工做也可在這個自由會話終端中進行。使用以下命令打開一個LIDS終端會話:
# lidsadm -S -- -LIDS
按提示輸入密碼後,就創建了一個lids 自由會話終端,在此終端你能夠啓用或停用LIDS和退出此終端。此時,LINUX系統中的任何數據都是不受LIDS保護的。在完成對文件或數據的修改後,你應經過以下命令從新啓用LIDS:
# lidsadm -S -- +LIDS
另外要清楚的是,在一個增長了LIDS的內核的系統中,一個叫/etc/lids/lids.cap文件中包括了全部的功能描述列表。每個功能項前經過使用「+」號來啓用此功能,使用「-」號來禁用此功能,完成設置後你必須從新加載配置文件。
下面咱們就來經過運用這些功能項對要保護的重要數據進行設置。
(1)、保護文件爲只讀。
# lidsconf -A -o /some/file -j READONLY
此命令保證一旦LIDS啓用,任何人都不能修改或刪除此文件。若是你在lids自由會話終端方式下,你就能夠修改/some/file指定的文件,只要此分區不是掛載爲只讀方式。應用時用實際的文件路徑代替/some/file。
(2)、保護一個目錄爲只讀。
# lidsconf -A -o /some/directory -j READONLY
此命令用保證一旦LIDS啓用,任何人都不能列出或刪除此目錄及其中的內容。若是你在自由會話終端方式下,你就能夠修改/some/directory目錄,只要分區不是掛載爲只讀方式。例如,你能夠設置保護/etc/目錄爲只讀方式:
lidsconf -A -o /etc -j READONLY
這裏要告別注意的是:當你設定/etc目錄爲只讀後,當你想掛載文件系統時,你應該刪除/etc/mtab文件,而後使用它的一個符號鏈接/proc/mounts。同時,你必須修改你的初始化腳本,使用「-n」選項來設置任何mount和umount命令。這個選項告訴mount和umount不更新/etc/mtab文件。例如,你發如今你的初始化腳本中有一行:mount -av -t nonfs,nproc,應把它改成:mount -av -n -t nonfs,nproc。
(3)、隱藏任何人都看不到的文件或目錄。
# lidsconf -A -o /some/file_or_directory -j DENY
此設置將使用任何人甚至root用戶都不能訪問它,若是是一個目錄,那麼此目錄下的文件、目錄都將隱藏,文件系統也同樣。
(4)、指定某些特定的程序以只讀方式訪問一些很是敏感的文件。
好比在系統登陸時要訪問/etc/shadow文件,我能夠指定某些程序能在系統認證時使用它,如login、ssh、su和vlock。例如,你能夠只容許login以只讀方式訪問/etc/shadow文件:
# lidsconf -A -s /bin/login -o /etc/shadow -j READONLY
(5)、以根用戶身份啓動一個服務在指定的端口上運行。
服務運行在指定的端口(1024如下)上須要CAP_NET_BIND_SERVICE功能。若是你禁止了此功能在/etc/lids/lids.cap文件中,你就不能以根用戶身份啓動任何一個服務運行在指定的端口上。你能夠授與某個程序有此功能:
# lidsconf -A -s /usr/local/bin/apache -o CAP_NET_BIND_SERVICE 80 -J GRANT
或者在LIDS_GLOBAL被禁止時啓用此服務。
(6)、在LIDS啓用時,保證X Windows系統能工做。
X server必須使用CAP_SYS_RAWIO功能才能在LIDS啓用時工做。
# lidsconf -A -s /path/to /your/x-server -o CAP_SYS_RAWIO -j GRANT
(7)、啓用ssh和scp。
缺省狀態下,ssh和scp經過指定的端口建立遠程鏈接,它須要CAP_NET_BIND_SERVICE功能,所以你能夠授與CAP_NET_BIN_SERVICE功能給ssh:
# lidsconf -A -s /usr/bin/ssh -o CAP_NET_BIN_SERVICE 22 -J GRANT
(8)、設置限制訪問時間
例如,只容許用戶從早上8:00到下午6:00這段時間能登陸:
# lidsconf -A -s /bin/login -o /etc/shadow -t 0800-1800 -j READONLY
你也能夠在「-t」選項中使用「!」,即除指定時間外全部時間能作某項工做。
(9)、經過網絡發送安全警報。
在/etc/lids/lids.net文件中指定經過網絡發送安全警報的接收郵箱。要特別要注意的是:在指定e-mail時在E-MAIL地址的先後不能有任何空格。同時,在修改完後必須從新加載它的配置文件。
這篇文章我已經發給網管員世界雜誌刊登了,在這裏貼出只是想可能有更多的朋友須要這方面的內容。
Linux入侵監測系統LIDS原理(2)
http://tech.sina.com.cn/s/2008-09-06/1214796394.shtml
LIDS保護數據結構
在分析完Linux文件系統後,讓咱們來看看LIDS是如何容VFS來保護文件和目錄的。
在/usr/src/Linux/fs/lids.c
struct secure_ino {
unsigned long int ino; /* the inode number */
kdev_t dev; /* the dev number */
int type; /* the file type */
};
上面的結構用一對來存儲保護文件或目錄的結點。「type」是用來標明保護結點文件類型的。
LIDS有4種類型
在/usr/src/Linux/include/Linux/fs.h
#define LIDS_APPEND 1 /* APPEND ONLY FILE */
#define LIDS_READONLY 2 /* Read Only File */
#define LIDS_DEVICE 3 /* Protect MBR Writing to device */
#define LIDS_IGNORE 4 /* Ignore the protection */
經過secure_ino結構,咱們能很容易的初使化保護的文件或是在內核裏執行如下函數。
在/usr/src/Linux/fs/lids.c
int lids_add_inode(unsigned long int inode ,kdev_t dev , int type)
{
if ( last_secure == (LIDS_MAX_INODE-1))
return 0;
secure[last_secure].ino = inode;
secure[last_secure].dev = dev;
secure[last_secure].type = type;
secure[++last_secure].ino = 0;
#ifdef VFS_SECURITY_DEBUG
printk("lids_add_inode : return %d
",last_secure);
#endif
return last_secure;
}
就象你在上面代碼上能夠看到的,給secure_ino加到一個結點上是很是容易的。被保護的結點會在系統啓動的時候初使化。初使化程序在/usr/src/Linux/fs/lids.c的init_vfs_security()裏。
如今,讓咱們看看LIDS是如何來檢查是否一個結點已經受到保護。
在/usr/src/Linux/fs/open.c
int do_truncate(struct dentry *dentry, unsigned long length)
{
struct inode *inode = dentry->d_inode;
int error;
struct iattr newattrs;
/* Not pretty: "inode->i_size" shouldnt really be "off_t". But it is. */
if ((off_t) length < 0)
return -EINVAL;
#ifdef CONFIG_LIDS
if (lids_load && lids_local_load) {
error = lids_check_base(dentry,LIDS_READONLY);
if (error) {
lids_security_alert("Try to truncate a protected file (dev %d %d,inode %ld)",
MAJOR(dentry->d_inode->i_dev),
MINOR(dentry->d_inode->i_dev),
dentry->d_inode->i_ino);
.....................
這個是LIDS加到內核裏作檢測的一個例子。你會看到lids_check_base()是LIDS保護方法的一個核心函數。
你能夠在LIDS要保護的地方看到不少LIDS保護方法用到lids_check_base()函數,特別是在Linux內核的子目錄下。
在/usr/src/Linux/fs/lids.c
int lids_check_base(struct dentry *base, int flag)
{
..................
inode = base->d_inode; /* get the inode number */
parent = base->d_parent; /* get the parent diretory */
.................
----> do {
if ( inode == parent->d_inode)
break;
if ((retval = lids_search_inode(inode))) {
if ( retval == LIDS_IGNORE
(retval == LIDS_DEVICE && flag != LIDS_DEVICE))
break;
if ( flag == LIDS_READONLY
( flag == LIDS_APPEND && retval >flag )
( flag == LIDS_DEVICE && flag == retval )) {
return -EROFS;
}
break;
}
inode = parent->d_inode;
} while( ((parent = parent->d_parent ) != NULL) );
return 0;
}
lids_check_base()會檢查一個給定文件的dentry和它的父目錄是否被保護。
注意:若是它的父目錄被保護,它下面的文件也會被保護。
例如,若是「/etc/」被保護,「/etc/passwd」也同樣被保護。
在內核保護系統調用
爲了保護系統,LIDS會在一些檢查臨界的系統調用的時候作檢查。所以,咱們能夠保護系統調用和限制文件系統的用戶調用。
這些是一些例子,
open(),open是經過禁止一些權利來保護文件的打開。 你能夠在打開調用open_namei()調用的時候LIDS在檢測它。
mknod(),mknod是用來在指定目錄下保護mknod。
unlink(), 在內核代碼檢查do_unlink()。
用LIDS加強Linux系統安全(轉)
http://blog.itpub.net/10617731/viewspace-961062/
用LIDS加強Linux系統安全(轉)[@more@] LIDS( Linux入侵偵察系統)是Linux內核補丁和系統管理員工具(lidsadm),它增強了Linus內核。 它在內核中實現了一種安全模式 -- 參考模式以及內核中的Mandatory Access Control 模式(MAC系統)。本文將闡述LIDS的功能和如何使用它來創建一個安全的Linux系統。
3.1 下載LIDS補丁和相關正式的Linux內核
能夠從LIDS Home,LIDS Ftp Home或最近的LIDS Mirror得到LIDS補丁和系統管理工具。
補丁名稱是lids-x.xx-y.y.y.tar.gz, x.xx表明lids的版本, y.y.y表明Linux內核版本
例如, lids-0.9.9-2.2.17.tar.gz表明lids 版本是0.9.9 以及相關的內核版本是2.2.17.。
必須下載相關的內核版本。例如,你下載了lids-0.9.9-2.2.17.tar.gz,那你就應該下
載Linux內核2.2.17的原代碼。能夠從Kernel FTP Site或其餘鏡象得到內核原碼。
而後,將內核原碼和LIDS tar解壓.例如,從 www.lids.org獲得lids-0.9.9-2.2.17.tar.gz,從ftp.us.kernel.org獲得linux-2.2.17.tar.bz2後
Linux入侵監測系統LIDS原理
http://netsecurity.51cto.com/art/200511/12114.htm
1、入侵
隨着Internet上的Linux主機的增長,愈來愈多的安全漏洞在當前的GNU/Linux系統上發現。你也許在Internet上據說過 在Linux下發現bug,它會致使系統很容易的被黑客攻擊。
由於Linux是一個開放代碼的系統,漏洞很容易發現,而且也會很快的有補丁出來。可是當漏洞沒有公佈的時候,而且管理員很懶,沒有去打補丁。黑客就會很容易的攻擊這個系統,取得root權限,在現有的GNU/Linux下,他就能夠作任何他想作的事情。如今你能夠問,咱們如今到底能夠作些什麼呢?
1.1 如今的GNU/Linux錯誤在哪裏?
超級用戶會濫用職權,他可以作全部他要作的事情。做爲root。他會改變全部的東西。
許多系統文件很容易被更改。這些文件多是很重要的文件,如/bin/login,若是一個黑客進入,他能夠上傳一個login程序來覆蓋/bin/login,這樣他就能夠不用登錄名和密碼來登錄系統。可是這些文件不須要常常改動,除非你要升級系統。
模塊modules很容易用來中斷內核。模塊是爲了讓Linux內核更模塊話和更高效而設計的。可是當模塊加入到內核,它就會成爲內核的一部分而且能作原始內核能作的工做。所以,一些不友好的代碼能夠寫成模塊來加入到內核裏,這些代碼就會重定向系統調用而且做爲一個病毒來運行。
進程是不受保護的,一些進程,如後臺的web服務器,一直都認爲是沒有嚴格保護的程序。所以,他們就會很容易被黑客攻擊。
1.2 LIDS的設想是什麼。
保護重要文件。由於文件很容易被root更改,爲何不嚴格文件操做呢?所以,LIDS改變了文件系統在內核裏的安全系統調用。若是某個時候一些人訪問一個文件,他就會進入系統調用而後咱們就能夠檢查文件名而且看她們是否被保護。若是它已經被保護,咱們就能夠拒絕這個訪問者的要求。
保護重要的進程。這個和上面的保護進程的想法不是同樣的。當一個系統裏運行一個進程,它會在/proc 文件系統裏有一個用pid做爲路徑名的入口。因此,若是你用「ps –axf」你就能夠顯示出當前運行的進程。你能夠問若是保護這些進程。若是你要殺死一個進程的話,首先,你鍵入「ps」來獲得進程的PID,而後,你鍵入「kill 〈pid〉」來殺死它。可是,若是我不讓你看到進程,你怎麼來殺死這個進程呢?所以,LIDS是用隱藏進程來保護它的。
另一個重要的方法就是不讓任何人能夠殺死進程,包括root用戶。LIDS可以保護父進程是init(pid=1)的全部進程 。
封裝內核。有時候咱們須要要把一些必要的模塊加入到內核裏來使用,另外,咱們也要拒絕任何人包括root用戶向內核插入模塊。那麼如何來平衡這個矛盾的問題呢?咱們能夠只容許在系統啓動的時候插入模塊,而後咱們封裝模塊,在封裝後,內核不容許任何人插入模塊到內核裏。經過這種封裝功能,咱們能用它來保護重要的文件,進程,咱們能夠在系統啓動的時候只容許必要的進程,只改變必要的文件。在封裝內核後,咱們就不能在對文件有任何的修改。
2、保護文件系統
2.1 保護文件系統是LIDS的重要功能之一。這個功能是在內核的VFS(虛擬文件系統)層實現的,咱們能夠保護任何種類的文件系統,如EXT2,FAT。
在LIDS,保護的文件按種類分爲如下幾種:
只讀的文件或目錄。只讀文件意味着它們不被容許改寫,如,在目錄/usr/bin,/sbin。這些類型的文件大多數都是二進制系統程序或是系統配置文件,除了在升級系統的時候,咱們不須要改變它們。
只可增長文件或目錄。這些文件是那些只能夠增長大小的文件。大多數是系統的日值文件,如在/var/log裏的只可增長文件。
額外的文件或目錄,這些文件沒有被保護。通常來講,你想要保護目錄下的全部文件,可是,還須要有一些特殊的文件不要被保護。因此咱們能夠定義這些文件做爲額外的其餘的只讀文件。
保護掛載或卸載文件系統。當你在啓動的時候掛載文件系統的時候,你能夠禁止全部人,甚至是root,去卸載文件系統。你也能夠禁止任何人在當前文件系統下掛載文件系統來覆蓋它。
2.2 LIDS如何在內核保護文件
在這部分,咱們會看到一些內核的代碼來理解LIDS是如何保護文件的。
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來獲得父目錄的目錄入口。
LIDS保護數據結構
在分析完Linux文件系統後,讓咱們來看看LIDS是如何容VFS來保護文件和目錄的。
在/usr/src/Linux/fs/lids.c
struct secure_ino {
unsigned long int ino; /* the inode number */
kdev_t dev; /* the dev number */
int type; /* the file type */
};
上面的結構用一對來存儲保護文件或目錄的結點。「type」是用來標明保護結點文件類型的。
LIDS有4種類型
在/usr/src/Linux/include/Linux/fs.h
#define LIDS_APPEND 1 /* APPEND ONLY FILE */
#define LIDS_READONLY 2 /* Read Only File */
#define LIDS_DEVICE 3 /* Protect MBR Writing to device */
#define LIDS_IGNORE 4 /* Ignore the protection */
經過secure_ino結構,咱們能很容易的初使化保護的文件或是在內核裏執行如下函數。
在/usr/src/Linux/fs/lids.c
int lids_add_inode(unsigned long int inode ,kdev_t dev , int type)
{
if ( last_secure == (LIDS_MAX_INODE-1))
return 0;
secure[last_secure].ino = inode;
secure[last_secure].dev = dev;
secure[last_secure].type = type;
secure[++last_secure].ino = 0;
#ifdef VFS_SECURITY_DEBUG
printk("lids_add_inode : return %d
",last_secure);
#endif
return last_secure;
}
就象你在上面代碼上能夠看到的,給secure_ino加到一個結點上是很是容易的。被保護的結點會在系統啓動的時候初使化。初使化程序在/usr/src/Linux/fs/lids.c的init_vfs_security()裏。
如今,讓咱們看看LIDS是如何來檢查是否一個結點已經受到保護。
在/usr/src/Linux/fs/open.c
int do_truncate(struct dentry *dentry, unsigned long length)
{
struct inode *inode = dentry->d_inode;
int error;
struct iattr newattrs;
/* Not pretty: "inode->i_size" shouldnt really be "off_t". But it is. */
if ((off_t) length < 0)
return -EINVAL;
#ifdef CONFIG_LIDS
if (lids_load && lids_local_load) {
error = lids_check_base(dentry,LIDS_READONLY);
if (error) {
lids_security_alert("Try to truncate a protected file (dev %d %d,inode %ld)",
MAJOR(dentry->d_inode->i_dev),
MINOR(dentry->d_inode->i_dev),
dentry->d_inode->i_ino);
.....................
這個是LIDS加到內核裏作檢測的一個例子。你會看到lids_check_base()是LIDS保護方法的一個核心函數。
你能夠在LIDS要保護的地方看到不少LIDS保護方法用到lids_check_base()函數,特別是在Linux內核的子目錄下。
在/usr/src/Linux/fs/lids.c
int lids_check_base(struct dentry *base, int flag)
{
..................
inode = base->d_inode; /* get the inode number */
parent = base->d_parent; /* get the parent diretory */
.................
----> do {
if ( inode == parent->d_inode)
break;
if ((retval = lids_search_inode(inode))) {
if ( retval == LIDS_IGNORE ||
(retval == LIDS_DEVICE && flag != LIDS_DEVICE))
break;
if ( flag == LIDS_READONLY ||
( flag == LIDS_APPEND && retval >flag ) ||
( flag == LIDS_DEVICE && flag == retval )) {
return -EROFS;
}
break;
}
inode = parent->d_inode;
} while( ((parent = parent->d_parent ) != NULL) );
return 0;
}
lids_check_base()會檢查一個給定文件的dentry和它的父目錄是否被保護。
注意:若是它的父目錄被保護,它下面的文件也會被保護。
例如,若是「/etc/」被保護,「/etc/passwd」也同樣被保護。
在內核保護系統調用
爲了保護系統,LIDS會在一些檢查臨界的系統調用的時候作檢查。所以,咱們能夠保護系統調用和限制文件系統的用戶調用。
這些是一些例子,
open(),open是經過禁止一些權利來保護文件的打開。 你能夠在打開調用open_namei()調用的時候LIDS在檢測它。
mknod(),mknod是用來在指定目錄下保護mknod。
unlink(), 在內核代碼檢查do_unlink()。
3、保護設備
Linux的設備會在/dev/目錄下以文件的形式列出,咱們能夠用上面保護文件的方法來保護設備。可是在一些狀況下,用戶也能夠用IO操做來旁路文件系統來讀寫設備,咱們必須注意這個問題。
3.1 設備,內核I/O
在GNU/Linux系統下的設備會以文件的形式表達,因此咱們能夠用保護文件系統那樣來保護設備。
用戶的I/O訪問是經過系統調用sys_operm和sys_iopl來實現的。你能夠看看/usr/src/Linux/arch/i386/kernel/ioport.。這個是要基於系統結構的,要是到其餘平臺,就須要注意它們的變化。
3.2 如何用LIDS來保護
大多數狀況下,程序不須要經過在/dev的設備文件名稱來訪問設備。可是,一些特殊的程序須要直接訪問,如X Server,這個會寫到/dev/mem和甚至是I/O設備。咱們須要一些額外的東西來保護設備。LIDS會在配置內核的時候來定義這個功能。
CONFIG_LIDS_ALLOW_DEV_MEM,若是你選擇了開啓這個功能,你就能夠容許一些特殊程序來訪問/dev/men和/dev/kmen這些內核臨界的設備。若是你想要用內核的X Server,選擇這個功能就會在配置內核的時候提供整個路徑和文件名。
CONFIG_LIDS_ALLOW_RAW_DISKS,若是選擇這個開啓,你就能夠容許一些特殊的程序來訪問物理磁盤。
CONFIG_LIDS_ALLOW_IO_PORTS,若是你選擇了開啓這個功能,你就能夠容許一些特殊的程序來訪I/O端口。
當系統運行fs/lids.c裏的init_vfs_security()的時候初使化就被調用。
#ifdef CONFIG_LIDS_ALLOW_DEV_MEM
lids_fill_table(allow_dev_mem,&last_dev_mem,LIDS_MAX_ALLOWED,CONFIG_LIDS_DEV_MEM_PROGS);
#endif
#ifdef CONFIG_LIDS_ALLOW_RAW_DISKS
lids_fill_table(allow_raw_disks,&last_raw_disks,LIDS_MAX_ALLOWED,CONFIG_LIDS_RAW_DISKS_PROGS);
#endif
#ifdef CONFIG_LIDS_ALLOW_IO_PORTS
lids_fill_table(allow_io_ports,&last_io_ports,LIDS_MAX_ALLOWED,CONFIG_LIDS_IO_PORTS_PROGS);
#endif
若是一個進程或是程序要直接訪問ip端口或是磁盤設備,LIDS就會檢查它在數組 allow_raw_disk,last_io_ports,等)。這個檢查是經過調用lids_check_base()裏的lids_search_inode(inode)來實現的。
如,讓咱們看看CONFIG_LIDS_ALLOW_DEV_MEM
/* in lids_search_inode() */
#ifdef CONFIG_LIDS_ALLOW_DEV_MEM
for( i = 0 ; i < last_dev_mem ;i++ ) {
if ( allow_dev_mem[i].ino == ino && allow_dev_mem[i].dev == dev) {
return LIDS_READONLY;
}
}
#endif
#ifdef CONFIG_LIDS_ALLOW_RAW_DISKS
在allow_dev_mem包括了哪個程序結點在系統啓動的時候在init_vfs_security()裏初使化。用一樣的方法,除了一些特殊程序,咱們能夠保護設備,I/O訪問等等。
4、保護重要進程
進程是操做系統的動態入口。內核裏有兩個特殊進程,進程ID 0 (swapd) 和進程ID 1(init)。Init進程是在系統啓動的時候全部進程的父進程。
4.1 不可殺死的進程。
就象你能夠看到是否有人要奪得root特權同樣,咱們能夠很容易的殺死那些該內核發送特別信號的進程。爲了殺死一個進程,你必須獲得進程的ID,而後用kill命令來殺死它。
系統殺死進程的調用是kill,是在內核裏的sys_kill()命令裏的調用。
讓咱們看看LIDS的保護代碼
在/usr/src/Linux/kernel/signal.c裏
asmlinkage int
sys_kill(int pid, int sig)
{
struct siginfo info;
#ifdef CONFIG_LIDS_INIT_CHILDREN_LOCK pid_t this_pid;
int i;
#ifdef CONFIG_LIDS_ALLOW_KILL_INIT_CHILDREN
if (!(current->flags & PF_KILLINITC))
#endif
if (lids_load && lids_local_load && LIDS_FISSET(lids_flags,LIDS_FLAGS_LOCK_INIT_CHILDREN)) {
this_pid = pid>0?pid:-pid;
for(i=0;i if( this_pid == lids_protected_pid[i]) {
lids_security_alert("Try to kill pid=%d,sig=%d
",pid,sig);
return -EPERM;
}
}
}
#endif
...
}
你能夠在內核裏看到兩個標籤,,CONFIG_LIDS_INIT_CHILDREN_LOCK 和CONFIG_LIDS_ALLOW_KILL_INIT_CHILDREN.
在CONFIG_LIDS_INIT_CHILDREN_LOCK的開啓狀態,LIDS能保護初使的運行程序。如,若是你在系統裏運行inetd程序,你能夠在隱藏內核前運行它,而後,你還能夠殺死它。可是一些人若是telnet到你的機器,inetd就會創造子進程來爲用戶服務,這個子進程不會被LIDS保護,由於用戶在任什麼時候候退出和殺死程序。
4.2 隱藏進程
另一個保護進程的方法就是隱藏進程。當一個黑客危機你的系統。他會登錄,而後會看看有沒有一些已知的進程在監視它。而後他就殺死它。若是你隱藏了這個功能的進程,黑客就不會知道進程的全部狀況而且你能夠記錄他在你係統上作的任何事情。
如何隱藏進程
爲了隱藏進程,你必須在配置內核的時候提供一個徹底的路徑名。
當內核啓動的時候琇IDS會訪問文件結點到一個叫proc_to_hide[]的結構裏。
在include/Linux/sched.h裏
#ifdef CONFIG_LIDS_HIDE_PROC
#define PF_HIDDEN 0x04000000 /* Hidden process */
#endif
/* in fs/lids.c */
#ifdef CONFIG_LIDS_HIDE_PROC
struct allowed_ino proc_to_hide[LIDS_MAX_ALLOWED];
int last_hide=0;
#endif
....
/* in fs/lids.c , init_vfs_security(),
fill up the hidden process in proc_to_hide[]
*/
#ifdef CONFIG_LIDS_HIDE_PROC
lids_fill_table(proc_to_hide,&last_hide,LIDS_MAX_ALLOWED,CONFIG_LIDS_HIDDEN_PROC_PATH);
#endif
PF_HIDDEN是否用戶能夠用顯示進程的命令(如「ps –a」)來顯示和檢查進程,若是一個進程被LIDS隱藏,當他執行的時候,進程就會獲得一個PF_HIDDEN的屬性。而後,當系統輸出系統進程信息到用戶的時候,它就會能夠檢查當前輸出進程是否有PF_HIDDEN標誌。若是發現了,它就不會輸出這個進程的信息。
在in fs/exec.c
int do_execve(char * filename, char ** argv, char ** envp, struct pt_regs * regs)
{
...
if (retval >= 0) {
#ifdef CONFIG_LIDS_HIDE_PROC
if (lids_search_proc_to_hide(dentry->d_inode))
current->flags |= PF_HIDDEN;
...
由於每個Linux的進程都有一個在/proc文件系統的入口,咱們爲了隱藏進程也須要修改proc的文件入口。
在fs/proc/root.c
static struct dentry *proc_root_lookup(struct inode * dir, struct dentry * dentry)
{
...
inode = NULL;
#ifdef CONFIG_LIDS_HIDE_PROC
if ( pid && p && (! ((p->flags & PF_HIDDEN) && lids_load && lids_local_load)) ) {
#else
if (pid && p) {
#endif
unsigned long ino = (pid >> 16) + PROC_PID_INO;
inode = proc_get_inode(dir->i_sb, ino, &proc_pid);
if (!inode)
return ERR_PTR(-EINVAL);
inode->i_flags|=S_IMMUTABLE;
}
...
}
而後若是進程被PF_HIDDEN標記,它就不會在proc文件系統裏顯示。
Linux 指令篇:系統管理--vlockhttp://www.jb51.net/linux/vlock.htmvlock(virtual console lock)功能說明:鎖住虛擬終端。語 法:vlock [-achv]補充說明:執行vlock指令可鎖住虛擬終端,避免他人使用。參 數: -a或--all 鎖住全部的終端階段做業,若是您在全屏幕的終端中使用本參數,則會將用鍵盤 切換終端機的功能一併關閉。 -c或--current 鎖住目前的終端階段做業,此爲預設值。 -h或--help 在線幫助。 -v或--version 顯示版本信息。