PortSentry是Abacus工程的一個組成部分。Abacus工程的目標是建立一個基于主機的網絡入侵檢測系統,可以從http://www.psonic.com的到關于Abacus工程更為詳細的信息。
1.1 能夠檢測的端口掃描
PortSentry主要用來檢測外部對主機的端口掃描,它能夠對多種掃描方法進行檢測,包括:
* 完全連接掃描
這是最基本的一種掃描方式,使用connect()系統調用,建立完整的TCP連接,如果連接能夠建立,就表明目標主機的目標端口打開。
* SYN/半公開掃描
因為不用建立完整的TCP連接,所以這種方法通常稱為半公開掃描。這種掃描方法不進行三次握手建立TCP連接,只是向目標主機發出一個SYN數據包。然后等待來自目標主機的相應。如果收到SYN|ACK數據包,表示目標端口打開;如果收到RST數據包就表示端口沒開。
* FIN掃描
向目標主機發出FIN數據包進行掃描,由Uriel Maimon在Rhrack第49期文15提出。如果收到RST數據包,就表示目標端口關閉;如果沒有收到數據包,就表示目標端口可能打開。
* NULL掃描
使用這種方法發出的探測包中,所有TCP包頭標志都被關閉和圣誕樹(xmas)掃描相反
* 圣誕樹掃描
探測包TCP包頭的所有標志都被打開,象燈都被打開的圣誕樹,夠形象吧
* UDP掃描
使用recvfrom()和write()系統調用掃描
* 以上無法包括的其它類型的掃描
為了便于對PortSentry的使用,本文對一些端口掃描技術做了一些簡單的解釋,如果想了解更加詳細的技術細節請參考http://www.insecure.org/nmap關于nmap的技術文檔。
1.2 監視模式和處理方式
PortSentry可以對一般的TCP、UDP掃描進行監視,使用-tcp、-udp選項;對于隱秘掃描,PortSentry有四種檢測模式:-stcp、-atcp、-sudp、-audp。有兩種方法設置PortSentry需要監視的端口:
* 使用預定義端口列表。在配置文件中,指定需要監視的端口列表,一旦發生對這些端口的刺探行為,PortSentry就被激活。
* 反向端口綁定。你可以指定PortSentry監視某個范圍內,除了被系統網絡精靈進程綁定端口之外的所有端口,用戶也可以指定不需要監視的端口。使用這種配置方法,會使PortSentry對端口掃描行為很敏感,從另一方面看,也會產生大量的誤報警,凡事有利則必有弊嘛。
如果檢測到端口掃描,PortSentry有多種方式應付掃描行為:
* 使用syslog()系統調用將掃描行為記錄到日志中
* 將發起掃描的主機名加入到/etc/hosts.deny文件中,這種方式需要TCP_Wrappers的配合
* 自動修改路由表,刪除到發起掃描主機的路由,使回應數據包無法返回
* 自動修改本地包過濾程序的配置,丟棄來自惡意主機的數據包
2.安裝
如果你經常使用源代碼安裝軟件,可能會習慣于./configure、make、make install的方式。但是,PortSentry到目前為止還沒有configure腳本,只能手工對一些選項進行配置,然后再進行編譯安裝。使用這種安裝方式很容易造成編譯錯誤,或者即使編譯通過,安裝后因為無法找到配置文件等原因,而使portsentry程序無法執行。下面將詳細介紹起安裝過程。
2.1 編輯portsentry_config.h文件
portsentry_config.h文件中定義了一些很重要的信息,對于portsentry能否正常運行至關重要。
* CONFIG_FILE
PortSentry配置文件的路徑
* WRAPPER_HOST_DENY
tcp_wrappers的hosts.deny文件所在的路徑,PortSentry能夠使用tcp_wrappers應付掃描行為,它將發起掃描的主機放到hosts.deny文件中,tcp_wrappers就會拒絕從這個主機發起的連接。
* SYSLOG_FACILITY
PortSentry使用的syslog facility。它使用的默認syslog facility是LOCAL_DAEMON,使用這個syslog facility,syslogd一般會把PortSentry的警告信息記錄在/var/log/messages文件中,這取決于/etc /syslog.conf文件。
系統中,如果某個精靈程序不使用自己的日志文件,那么它的日志信息將被syslogd記錄到/var/log/messages文件,造成這個文件的信息非常龐大、雜亂,不容易閱讀。因此用戶希望指定PortSentry自己的日志文件,專門保存PortSentry發出的警告信息。
可以按照以下步驟設置PortSentry自己使用的日志文件:
o 修改portsentry_config.h文件
修改PortSenry_config.h文件的SYSLOG_FACILITY一行,就可以改變PortSentry使用的日志FACILITY:
SYSLOG_FACILITY LOG_LOCAL0 /*LOG_LOCAL0-7都可以*/
o 修改/etc/syslog.conf文件
在/etc/syslog.conf文件中加入下面一行,設置PortSentry使用的日志文件。你也可以選擇自己喜歡的日志文件名。^_^
local0.* /usr/local/psionic/portsentry/portsentry.log
做了以上的修改后,syslogd將把PortSentry產生的報警信息同時記錄到/usr/local/psinic/portsentry /portsentry.log和/var/log/messages兩個文件。如果想避免這種情況,還要繼續修改/etc/syslog.conf文件。在這個文件有一行:
*.info;mail.none;news.none;authpriv.none; /var/log/messages
把它改為:
*.info;mail.none;news.none;authpriv.none;local0.none /var/log/messages
o 重新啟動syslogd程序
# /etc/init.d/syslog restart
* SYSLOG_LEVEL
警告信息的sylog級別。一般不必修改。
2.2 編輯PortSentry的配置文件portsentry.conf
PortSentry使用portsentry.conf文件作為自己的配置文件。用戶可以編輯這個配置文件設置PortSentry的各項功能,用戶也可以在編譯安裝完成后的使用過程中,根據自己的實際情況進行調整。
* TCP_PORTS
在TCP監視模式(-tcp)下使用,指定需要PortSentry監聽的端口號。端口號使用逗號分開,中間不能有空格。PortSentry會對端口進行綁定,綁定的數量默認是64,在源代碼的portsentry.h文件中定義#define MAXSOCKS 64。目前還沒有配置選項對其進行設置置,如果想使用其它值,需要修改源代碼。
如果使用隱秘掃描檢測模式,PortSentry不會對端口進行綁定,而是使用RAW套接字,在套接字層對連接進行監視。
# UDP_PORTS
在UDP監視模式(-udp)下使用,指定要監視的UDP端口。你應該慎重使用UDP模式,稍有不慎就會給攻擊者以可乘之機,對系統進行拒絕服務攻擊。攻擊者可以在數據包中偽造一個端口范圍,誘使PortSentry阻塞主機的這些端口,達到拒絕服務攻擊的目的。如果你的站點是一個比較出名的站點,訪問量很大,最好不要使用UDP監視模式。
# ADVANCED_PORT_TCP
設置要監視的最大TCP端口號。PortSentry會對小于這個值的端口號進行監視。默認值為1024,最大可以是65535。建議不要超過 1024,因為如果超過這個值,PortSentry就會產生大量的誤報警。使用-atcp參數啟動PortSentry時,會用到這個值。
# ADVANCED_PORT_UDP
設置PortSentry監視的最大UDP端口號。使用-audp參數啟動PortSentry時用到。
# ADVANCED_EXCLUDE_TCP
和ADVANCED_PORT_TCP配合使用。設置在TCP高級監視模式(-atcp)下,不需要PortSentry監視的端口。在一些普通的端口上,一些遠程客戶程序的錯誤會造成PortSentry發出誤報警信息,可以使用這個配置選項去掉這些端口,例如:ident、SSL。
# ADVANCED_EXCLUDE_UDP
和ADVANCED_PORT_UDP配合使用。設置不用PortSentry監視的端口。
# IGNORE_FILE
有時候需要指定一些IP地址,無論如何都不要使PortSentry阻塞這些IP地址,例如:127.0.0.1。在一個文件中保存要被忽略的IP 地址,然后使用IGNORED_FILE指定這個文件所處的路徑,默認的情況下是/usr/local/psionic/portsentry /portsentry.ignore。文件中,每個IP地址占一行,例如:
127.0.0.1
0.0.0.0
# BLOCKED_FILE
指定記錄被阻塞主機IP地址的臨時文件。默認是portsentry.blocked,在記錄時,PortSentry會自動在后面加上監視模式名作為文件的后綴。例如:portsentry.blocked.tcp、portsentry.blocked.udp。
# HISTORY_FILE
指定被阻塞著急IP地址的文件。BLOCKED_FILE和HISTORY_FILE的區別:BLOCKED_FILE指定的文件是一個臨時文件,每次 PortSentry運行,被阻塞的主機IP,重新啟動PortSentry后,就會被清空,其記錄就被加入到HISTORY_FILE指定的文件。默認是portsentry.history。
# BLOCK_UDP
設置針對UDP探測的自動反應功能。。有三個選項:
* 0
只對探測行為進行記錄。不阻塞探測報文中的源地址。
* 1
啟動KILL_RUN_CMD指定的命令,然后運行KILL_ROUTE指定的命令,阻塞探測報文中的源地址。
* 2
只啟動KILL_RUN_CMD設置的命令,使用外部的程序或者腳本處理探測行為。
原文轉自:http://www.anti-gravitydesign.com