請使用Tcp_wrapper,RedHat8.0默認是安裝的了
----------------------------------
Tcp_wrapper的安裝和使用
Internet的開放互連性使得每一台連在網上的服務器都逃脫不了被攻擊的可能性,事實上我國從接入互聯網以來這類事從未中斷過。對目前我國的絕大部分網絡管理員而言,熟練的使用Unix操作系統尚是一個亟待解決的問題, 網絡安全,很難顧及。然而
今天我們來介紹一個軟件Tcp_wrapper,說起這個軟件,可算得上是大名鼎鼎了,互聯網上, 無論采用何種unix操作系統,安裝了這個軟件的主機恐怕都是不計其數的,事實上它已經成為一種安全的標准配置.本文就以solaris作為操作環境對這個軟件做一說明,在其它的Unix操作系統平台上是相通的,讀者根據自己的操作系統的種類稍加變化即可。 Tcp_wrapper是Wietse Venema開發的一個可用於各種Unix平台的免費軟件,說起Tcp_wrapper的誕生,到有個小小的故事,大約在1990年,作者所在大學的服務器屢屢受到一個外來黑客侵入, 因為受害主機的硬盤數據屢次被rm –rf / 命令整個抹掉,所以找尋線索極為困難,直到有一天晚上Venema在工作的過程中無意中發現這個黑客在不斷的finger 受害主機,偷窺受害者的工作,在那個時候一個想法誕生了:設計一個軟件,使它可以截獲發起finger請求的IP,用戶名等資料,Venema 很快投入了工作,而Tcp_wrapper也由此出現!在這以後,Tcp_wrapper隨著應用逐漸成為一種標准的Unix安全工具,成為unix守護程序inetd的一個插件.通過Tcp_wrapper,管理員可以設置對inetd提供的各種服務進行監控和過濾.
我們知道,unix中各種服務的實現是基於inetd這個守護進程的,每當有網絡服務請求時,無論是FTP,telnet,rlogin等等,這種請求都被送到處於偵聽狀態的inetd守護進程,inetd再根據請求啟動相應服務.inetd的設置是根據/etc目錄下inetd.conf決定的.inetd.conf中標識了每種服務由什麼進程來控制,我們抽取一行如下:
telnet stream tcp nowait root /usr/sbin/in.telnted in.telned
從上面這一行我們可以看到,telnet這個服務,是由/usr/sbin目錄下的in.telnetd來控制的,每當有telnet的連接請求時,inetd就指導in.telnetd來啟動telnet服務.這是unix默認的連接方式,在這個過程中,沒有管理員可以控制的部分,也沒有連接紀錄.
而在安裝了Tcp_wrapper的主機上,管理員可以對上述服務加以控制,當Tcp_wrapper編譯安裝成功後,會生成一個tcpd程序,它可以在inetd.conf這個控制文件中取代in.telnetd的位置,這樣,每當有telnet的連接請求時,tcpd即會截獲,先讀取管理員所設置的訪問控制文件,合乎要求,則會把這次連接原封不動的轉給真正的in.telnetd程序,由in.telnetd完成以後的工作.如果這次連接發起的ip不符合訪問控制文件中的設置,則會中斷連接請求,拒絕提供telnet服務.除in.telnetd以外,tcpd還可以替代其它各種tcp服務.
Tcp_wrapper訪問控制的實現是依靠兩個文件:hosts.allow,hosts.deny來實現的.這兩個文件的語法是比較簡單的,基本語法就是:服務類型 :本服務有效ip范圍 : 許可或拒絕.如hosts.allow中為:
In.telnetd : secu.unix.org : allow
In.ftpd : 10.68.32. : allow
in.rshd : all : /usr/local/sbin/safe_finger -l @%h usr/UCb/mail
[email protected]
而hosts.deny為:all : all.這兩個文件的意思是對telnet來講,只允許來自secu.unix.org的連接,對ftp而言,允許10.68.32這個c類地址的連接.in.rshd這一部分語法稍微復雜一些,它的意思是外界任何一個ip每次試圖使用rsh連接本系統的時候系統會finger發起連接請求的遠程用戶,並立即將結果發mail到一個管理員的遠程信箱
[email protected],我們知道,管理員之所以這麼做,是因為一般試圖進行rsh的連接, 都是有很大的潛在危險性的,這說明也許系統已經被人入侵,並安插了.rhosts文件了,這很危險! 所以對管理員來說,這種連接需要引起極大的注意. hosts.deny文件中的all : all表示除了這些以外,拒絕來自任何地方的任何服務.以上只是對訪問控制文件的一個簡單說明,管理員可以參看Tcp_wrapper的相應說明定制更為復雜的控制策略.同時需要說明的是,如果需要象上例中設置對rsh的這種finger,mail功能,是需要在Makefile中打開language extension的.
下面來講講Tcp_wrapper的安裝
首先,我們從可信站點下載tcp_wrappers,如ftp://ftp.porcupine。org/pub/security/tcp_wrappers_7.6.tar.gz(目前最新的版本是7.6)
我們假設你的主機已有了各種所需的編譯工具,cc(或gcc),make(或gmake),gzip等,如果使用solaris的讀者主機上沒有這些工具,可到sunfreeware.com下載它們,使用其它Unix系統亦可到相關站點下載。我們在得到Tcp_wrapper包後,用gzip和tar將壓縮包解開,會生成Tcp_wrapper目錄,進入目錄,我們需要編輯Makefile文件,使它合乎我們的工作要求。編輯的基本工作可以分為3步。
1:在Makefile的頭一部分我們可以看到REAL_DAEMON_DIR的描述,它表明了Unix系統中真正的守護程序所在位置,即上面提到的第六個分隔段的守護進程所在目錄,solaris中這些守護程序的目錄是/usr/sbin,所以我們將SysV.4 Solaris 2.x OSF AIX前的#注釋號去掉,即下面的形式:
# Ultrix 4.x SunOS 4.x ConvexOS 10.x Dynix/ptx
#REAL_DAEMON_DIR=/usr/etc
#
# SysV.4 Solaris 2.x OSF AIX
REAL_DAEMON_DIR=/usr/sbin
#
# BSD 4.4
#REAL_DAEMON_DIR=/usr/libexec
#
# HP-UX SCO Unicos
#REAL_DAEMON_DIR=/etc
2:在Makefile 中查找FACILITY= LOG_MAIL這幾個關鍵字,Tcp_wrapper的紀錄功能就是由這裡實現的,系統默認是使用solaris的MAIL精靈來做連接紀錄的,但這樣會造成Tcp_wrapper的連接紀錄和系統的mail日志混雜在一起,不利於管理員分辨.所以建議還是選用一個solaris中未使用的local精靈.我們在這裡使用LOCAL3,即FACILITY= LOG_ LOCAL3 ,SEVERITY級別保持INFO級別不變。在讀者的機器上可視情況而定用何種精靈。修改後即下面的形式:
# The LOG_XXX names below are taken from the /usr/include/syslog.h file.
FACILITY= LOG_LOCAL3 #LOG_MAIL is what most sendmail daemons use
# The syslog priority at which successful connections are logged。
SEVERITY= LOG_INFO # LOG_INFO is normally not logged to the console
3:接著查找/etc/hosts.allow,/etc/hosts.deny,也就是上文提到的訪問控制文件,建議將默認的/etc替換為其它路徑。 由此Makefile編輯完成,退出vi,執行make sunos5(sunos5這個參數是由Makefile開始描述部分得到,采用其它操作系統的將sunos5替換為為相應參數即可)。我們可以看到系統在編譯,成功後,在當前目錄下會生成tcpd,tcpdmatch,safe_finger等5個可執行文件。建議選一個目錄如/usr/local/sbin,將上述5個文件拷貝到這個目錄中,至此Tcp_wrapper本身的編譯工作就此結束。
下一步,編輯/etc/inetd.conf,將原
telnet stream tcp nowait root /usr/sbin/in.telnetd in.telnetd中的/usr/sbin/in.telnetd替換為tcpd及其所在路徑,在此例中即
telnet stream tcp nowait root /usr/local/sbin/tcpd in.telnetd
其它ftp , tftp , rsh , rlogin等同樣操作即可,建議至少替換telnet,ftp,rsh,rlogin這幾個守護程序。
編輯結束後,保存文件,ps –ef grep inetd找出inetd的進程號,kill –HUP 重啟inetd進程使改動生效。
接著我們編輯/etc/syslog.conf文件,加入日志紀錄功能,在此例中即
#tcp wrapper log
local3.info /var/log/tcplog
編輯結束後,保存文件, 在/var/log下生成tcplog文件,注意這個文件的讀寫屬性, 應該只對root有讀寫權限。然後ps –ef grep syslogd,找出syslogd的進程號,kill –HUP 重啟syslogd進程使改動生效。
最後一項工作是編輯hosts.deny和hosts.allow文件,按上面的語法編輯即可。至此所有工作完成,我們可以用上述兩個文件的設置來試一試,假設主機refuse(IP 11.22.33.44)telnet本機,我們看一看,會有什麼反應?
refuse#telnet www.yiming.com
Trying www.yiming.com ...
Connected to www.yiming.com
Connection closed by foreign host.
我們再看看本機Tcp_wrapper的日志,多了一條:
Apr 2 13:56:20 yiming in.telnetd[1769]: refused connect from 11.22.33.44
實際上這種測試可用Tcp_wrapper自帶的測試文件tcpdmatch,使用很簡單,格式tcpdmatch 守護程序 假定IP 即可,這裡也不介紹了。
我們再看看本機Tcp_wrapper的日志,多了一條:
Apr 2 13:56:20 yiming in.telnetd[1769]: refused connect from 11.22.33.44
實際上這種測試可用Tcp_wrapper自帶的測試文件tcpdmatch,使用很簡單,格式tcpdmatch 守護程序 假定IP 即可,這裡也不介紹了。