用PortSentry保護Linux服務器

在遭遇Linux服務器被外部IP惡意掃描端口的時候,一般系統管理員會部署一些防***的環境,比如snort,不過snort部署起來比較複雜,而有時候我們只是需要防止惡意掃描而已。這個時候,可以用PortSentry這個工具來進行非常簡單的實現。雖然PortSentry被Cisco收購後不再開發,但絲毫不影響此軟件的強大功能。
    我在檢查一臺CentOS5.5服務器的安全環境時,發現很多IP在惡意掃描此服務器的端口。本來想部署snort防***環境的,後來發現snort環境部署非常複雜,而以上的惡意掃描完全可以用 PortSentry來實現。PortSentry是***檢測工具中配置最簡單、效果最直接的工具之一。PortSentry是Abacus工程的一個組成部分。Abacus工程的目標是建立一個基於主機的網絡***檢測系統,可以從http://www.psonic.com得到關於Abacus工程更爲詳細的信息。雖然PortSentry被Cisco收購後不再開發,但絲毫不影響此軟件的強大功能。PortSentry可以實時檢測幾乎所有類型的網絡掃描,並對掃描行爲做出反應。一旦發現可疑的行爲,PortSentry可以採取如下一些特定措施來加強防範:
    ◆給出虛假的路由信息,把所有的信息流都重定向到一個不存在的主機;
    ◆自動將對服務器進行端口掃描的主機加到TCP-Wrappers的/etc/hosts.deny文件中去,我個人比較喜歡這種方式,因爲線上許多環境並非都能打開iptables,這個選項也是PortSentry默認的功能;
    ◆利用Netfilter機制,用包過濾程序,比如iptables和ipchain等,把所有非法數據包(來自對服務器進行端口掃描的主機)都過濾掉;
    ◆通過syslog()函數給出一個目志消息,甚至可以返回給掃描者一段警告信息。
    一、PortSentry的安裝
    下面詳細介紹PortSentry工具的安裝和配置方法。
    1.從http://sourceforge.net/projects/sentrytools/下載軟件的最新版portsentry-1.2.tar.gz,用root用戶執行如下命令進行安裝:
    #tarzxvfportsentry-1.2.tar.gz
    #cdportsentry-1.2_beta
    #make
    #makeinstall
    進行到這步時發現報錯,系統生成不了protsentry執行文件,我們查看Makefile文件時發現,make後面根據操作系統的不同有許多選項。
    所以我們重新執行此步操作,將目錄刪除重新解壓縮
    然後我們執行makelinux,發現系統仍然報錯,如下:
    SYSTYPE=linux
    Making./portsentry.c:1585:error:missingterminating"character
    ./portsentry.c:1595:error:expected?.?.before?.?.token
    make:***[linux]Error1解決方法:
    我們打開portsentry.c文件,在1590行左右,我們將帶有Copyright1997-2003字樣的那行調整爲一行即可,文字有白線標記的那行代碼應調整爲一行
    調整後我們再執行makelinux&&makeinstall後,PortSentry順利安裝成功,其安裝路徑爲/usr/local/psionic/portsentry,如下所示表示成功安裝此軟件:
    Edit/usr/local/psionic/portsentry/portsentry.confandchange
    yoursettingsifyouhaven'talready.(route,etc)
    WARNING:Thisversionandabovenowuseanew
    directorystructureforstoringtheprogram
    andconfigfiles(/usr/local/psionic/portsentry)。
    Pleasemakesureyoudeletetheoldfileswhen
    thetestingofthisinstalliscomplete.
    cc-O-Wall-DLINUX-DSUPPORT_STEALTH-o./portsentry./portsentry.c\
    ./portsentry_io.c./portsentry_util.c
    ./portsentry.c:Infunction?.ortSentryModeTCP?.
    ./portsentry.c:1187:warning:pointertargetsinpassingargument3of?.ccept?.differinsignedness
    ./portsentry.c:Infunction?.ortSentryModeUDP?.
    ./portsentry.c:1384:warning:pointertargetsinpassingargument6of?.ecvfrom?.differinsignedness
    ./portsentry.c:Infunction?.sage?.
    ./portsentry.c:1584:error:missingterminating"character
    ./portsentry.c:1585:error:?.ourceforget?.undeclared(firstuseinthisfunction)
    ./portsentry.c:1585:error:(Eachundeclaredidentifierisreportedonlyonce
    ./portsentry.c:1585:error:foreachfunctionitappearsin.)
    ./portsentry.c:1585:error:expected?.?.before?.ot?
    ./portsentry.c:1585:error:stray?.?.inprogram
    二、PortSentry的配置
    1.修改配置文件portsentry.conf
    通過PortSentry進行***檢測,首先需要爲它定製一份需要監視的端口清單,以及相應的阻止對策。然後啓動後臺進程對這些端口進行檢測,一旦發現有人掃描這些端口,就啓動相應的對策進行阻攔。
    (1)設置端口清單
    下面給出portsentry.conf中關於端口的默認配置情況:
    #Un-commenttheseifyouarereallyanal;
    #TCP_PORTS="1,7,9,11,15,70,79,80,109,110,111,119,138,139,143,512,513,514,515,540,636,1080,1424,2000,2001,[]
    #UDP_PORTS="1,7,9,66,67,68,69,111,137,138,161,162,474,513,517,518,635,640,641,666,700,2049,31335,27444,34555,[]

   #Usetheseifyoujustwanttobeaware:
    TCP_PORTS="1,11,15,79,111,119,143,540,635,1080,1524,2000,5742,6667,12345,12346,20034,27665,31337,32771,32772,[]
    UDP_PORTS="1,7,9,69,161,162,513,635,640,641,700,37444,34555,31335,32770,32771,32772,32773,32774,31337,54321"
    #Usetheseforjusebare-bones
    #TCP_PORTS="1,11,15,110,111,143,540,635,180,1524,2000,12345,12346,20034,32771,32772,32773,32774,49724,54320"
    #UDP_PORTS="1,7,9,69,161,162,513,640,700,32770,32771,32772,32773,32774,31337,54321"
    可以有選擇地去掉前面的註釋來啓用默認配置,也可以根據自己的實際情況定製一份新的清單,格式和原來的一樣即可。端口列表要根據具體情況而定,假如服務器爲Web服務器,那麼Web端口就不需要監視。反之,如果是FTP服務器,那麼監視Web端口也是有必要的。
    (2)portsentry.conf裏的相關文件
    在portsentry.conf中自動配置了許多文件,我們看下它們有哪些用途:
    #此文件記錄允許合法掃描服務器的主機地址
    IGNORE_FILE="/usr/local/psionic/portsentry/portsentry.ignore"
    #此文件中保留了以往所有***主機的IP歷史記錄
    HISTROY_FILE="/usr/lcal/psionic/portsentry/portsentry.history"
    #此文件中是已經被阻止連接的主機IP記錄
    BLOCKED_FILE="/usr/local/psionic/portsentry/portsentry.blocked"
    (3)設置路由重定向
    通過配置portsentry.conf文件,可以設置一條虛擬路由記錄,把數據包重定向到一個未知的主機。使之無法獲取信息。相應配置代碼如下:
    #Generic
    #KILL_ROUTE="/sbin/routeadd$TARGET跭。444.555.666"
    #GenericLinux
    KILL_ROUTE="/sbin/routeadd-host$TARGET$gw333.444.555.666
    針對不同的平臺有不同的路由命令,在配置文件中選擇適臺自己平臺的命令即可。我的服務器是CentOS5.5x86_64,以上語法適合Linux平臺的機器;PortSentry非常人性化,下面都有系統對應的配置文件,我們只需要依樣操作即可。
    (4)我們還可以利用Linux中的iptables命令,可以切斷***主機的連接:
    KILL_ROUTE="/usr/local/sbin/iptables-IINPUT-s$TARGET$-jDROP"
    也可以直接把***者的IP記錄到/etc/hosts.deny文件中,利用TCP_Wrappers保護機制來防止***:
    KILL_HOSTS_DENY="ALL:$TARGET$#Portsentryblocked"
    系統默認是利用TCP_Wrappers來切斷與主機之間的連接

 

(5)定製警告信息
    我們也可以定製一條警告信息,警告***者。不過,手冊上建議不要使用該選項,因爲這樣做可能會暴露主機的IDS系統。
    PORT_BANNER="**UNAUTHORIZEDACCESSPROHIBITED***YOURCONNECTIONATTEMPTHASBEENLOGGED.GOAWAY."
    修改完畢後,改變文件的權限。以保證其安全性:
    chmod600/usr/local/psionic/portsentry/portsentry.conf
    2.配置portsentry.ignore文件
    /usr/psionic/portsentry/portsentry.ignore文件中設置了希望PortSentry忽略的主機IP,即允許合法掃描的主機地址下面是配置情況:
    #Puthostsinhereyouneverwantblocked,ThisincludestheIPaddresses
    #ofalllocalinterfacesontheprotectedhost(i.evirtualhost,mult-home)
    #keep127.0.0.1and0.0.0.0tokeeppeoplefromplayinggames.
    127.0.0.1/32
    0.0.0.0
    #Excludealllocalinterfaces
    192.168.1.103
    192.168.1.102
    127.0.0.1
    記得帶上本機地址,以防萬一。
    修改完成後同樣需要改變文件默認的權限:
    chmod600/usr/local/psionic/portsentry/portsentry.ignore
    三、啓動檢測模式
    最後介紹一下PortSentry的啓動檢測模式。對應TCP和UDF兩種協議方式,PortSentry分別有三種啓動模式,即基本、祕密和高級祕密掃描檢測模式,合計6個模式。
    ◆portsentry-tcp,TCP的基本端口綁定模式;
    ◆portsentry-udp,UDP的基本端口綁定模式;
    ◆portsentry-stcp,TCP的祕密掃描檢測模式;
    ◆portsentry-sudp,UDP的祕密掃描檢測模式;
    ◆portsentry-atcp,TCP的高級祕密掃描檢測模式;
    ◆portsentry-audp,UDP的高級祕密掃描檢測模式。
    一般情況下,建議使用祕密掃描檢測模式或高級祕密掃描檢測模式。
    使用高級祕密掃描檢測模式(AdvancedStealthScanDetectionMode),PortSentry會自動檢查服務器上正在運行的端口,然後把這些端口從配置文件中移去,只監控其它的端口。這樣會加快對端口掃描的反應速度,並且只佔用很少的CPU時間,這種模式非常智能,我比較喜歡用
    啓動PortSentry的命令如下:
    #/usr/psionic/portsentry/portsentry-atcp
    可以把啓動命令加到“/etc/rc.d/rc.local”腳本文件中,果想讓它和其它後臺進程一樣可以隨時啓動、停止並查看進程狀態,可以去這樣當重新啓動計算機的時候PortSentry就會自動運行。

  四、測試
    我們在192.168.1.102上啓動PortSentry後,先暫時清掉portsentry.ignore裏的文件,然後在另一臺 192.168.1.104的機器上啓動掃描命令nmap-sS192.168.1.102。稍等片刻,就會發現/etc/hosts.deny裏會出現 ALL:192.168.1.104的字樣,證明此軟件配置都是生效的。
    爲了證明其有效性,我拿自己的線上的一臺LVS機器佈署了portsentry1.2,查看日誌發現
    [root@localhostportsentry_beta]#tail/var/log/messages
    Jun613:11:07localhostportsentry[2555]:attackalert:TCPSYN/Normalscanfromhost:adsl-65-9-251-89.mia.bellsouth.net/65.9.251.89toTCPport:80
    Jun613:11:07localhostportsentry[2555]:attackalert:Host65.9.251.89hasbeenblockedviawrapperswithstring:"ALL:65.9.251.89"
    Jun613:11:07localhostportsentry[2555]:attackalert:TCPSYN/Normalscanfromhost:adsl-65-9-251-89.mia.bellsouth.net/65.9.251.89toTCPport:80
    Jun613:11:07localhostportsentry[2555]:attackalert:Host:adsl-65-9-251-89.mia.bellsouth.net/65.9.251.89isalreadyblockedIgnoring
    Jun613:11:08localhostportsentry[2555]:attackalert:TCPSYN/Normalscanfromhost:adsl-65-9-251-89.mia.bellsouth.net/65.9.251.89toTCPport:80
    Jun613:11:08localhostportsentry[2555]:attackalert:Host:adsl-65-9-251-89.mia.bellsouth.net/65.9.251.89isalreadyblockedIgnoring
    Jun613:19:57localhostportsentry[2555]:attackalert:TCPSYN/Normalscanfromhost:ns38534.ovh.net/91.121.14.153toTCPport:80
    Jun613:19:57localhostportsentry[2555]:attackalert:Host91.121.14.153hasbeenblockedviawrapperswithstring:"ALL:91.121.14.153"
    Jun613:35:44localhostportsentry[2555]:attackalert:TCPSYN/Normalscanfromhost:61.156.31.43/61.156.31.43toTCPport:80
    Jun613:35:44localhostportsentry[2555]:attackalert:Host61.156.31.43hasbeenblockedviawrapperswithstring:"ALL:61.156.31.43"
    檢查了下/etc/hosts.deny,發現如下惡意IP:
    ALL:113.57.224.3
    ALL:124.238.249.246
    ALL:65.9.251.89
    ALL:91.121.14.153
    ALL:61.156.31.43

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章