文件版本:VERSION 1.0 DATE:1995/03/24
【Tcp-wrapper安裝與設定】
Version: 7.2
Data : 1995/01
Tcp wrapper 是Wietse Venema 的大作。
Tcp wrapper 可說是所有連接上網路的主機都必須安裝的基本軟體。它具備了
了管制進入者的功能,例如可限制那些機器、人方才可以使用本系統,那些頑皮的
小孩或「邪惡」的機器,一概不提供Services。另一方面,tcp wrapper 也具有頗
不錯的記錄功能 (至少比廠商的陽春記錄功能強許多) ,可以記錄那時候甚麼人進
來了。因此,在今天蓬勃發達網路世界中不得不留意的系統安全領域,tcp wrapper
佔有極重要的一席之地。
使用者可以在:
ftp://ftp.nccu.edu.tw/pub/security/unix/tools/tcp_wrappers_7.2.tar.gz
抓到這個東東。解壓再tar 開之後,第一步當然是閱讀本軟體的文件檔,如README
,該文件對本軟體的運作、安裝、特色等等有頗完整的介紹,非常值得一讀。
本軟體安裝的方式有兩種,設定也有兩套。不過,筆者不太算全介紹,只打算
介紹其一種較常用的安裝法,其中一種功能上較有彈性的設定法。如果大家對完整
的安裝與設定有興趣,請參考上述的README及*.5, *.8的文件檔。
步驟一:修改Makefile
1.把第一個區段(即Advanced installation )所看到的
"REAL_DAEMON_DIR" 變數,找一個合適的,把remark的"#" 取消。不過
,根據我們下面的裝法,只要隨便消掉一個remark就可以了。
2.在差不多整個檔的中間,找到這麼一行:
#STYLE = -DPROCESS_OPTIONS # Enable language extensions.
把前面的remark消掉,表示我們要用extensible language 的方式作設
定。這種方式設定起來比較有彈性。
3.找尋與資料的記錄有關的這麼一行:
FACILITY= LOG_MAIL # LOG_MAIL is what most sendmail daemons use
這一行是表示,tcp wrapper 在作記錄時,會把資料傳給syslogd (這
是專面處理記錄有關的Daemon),要求syslogd 把資料記錄在syslog的
設定檔所定義的MAIL對應的記錄檔上,一般會把它寫到syslog這個檔案
去。由於這個檔一般是給sendmail作記錄用的,所以如果我們tcp 也把
資料記錄在這個檔中,那麼將來要查閱記錄的資料就會很亂。所以我個
人都毫不考慮的就把FACILITY改成其他的。但是,話說回來,改掉也有
缺點,就是syslog這個檔,系統會維護其檔長,如果改成其他的記錄檔
,那麼系統管理者就要自己定期去留意一下檔長。
所以這裡要不要改就看個人的評斷了:)
假設要改,那要改成甚麼呢?
可以考慮改成LOCALx ->x 是指0-7的數字,例如:LOCAL7,那麼這一行
就可改成:
FACILITY= LOG_LOCAL7
這裡是改了,那麼我們再檢查一下syslogd 的設定檔(一般是
/etc/syslog.conf)中有沒有LOCAL7的設定。如果沒有意外的話,一般
是沒有,所以請在syslog的設定檔中加入如下面的設定:
local7.info /var/log/local7.log
^^^^^^^^^^^^^^Sun 據說要用【兩】個TAB以上
"local7.info" 之後的,是指要把資料寫入的檔案。如果檔案原本不存
在,那得要先用touch 產生一新檔。
如果要把資料傳到其他server,那可以:
local7.info @someserver
^^表示送往其他主機。
要記得的是,如果檔案有變動,那麼得要重新開始syslogd ,即:
# kill -HUP `cat /etc/syslog.pid`
步驟二:編譯
這是下個指令:
make
sys-type是指我們這台機器的系統,不知道的話,直接下"make",程式會
列出,然後再找一個合適的。
成功的編譯,會造出叫"tcpd"的主要程式。
步驟三:修改inetd.conf
這是inetd 的設定檔。這裡得要稍微介紹一下inetd 這個東東了。
如果清楚inetd 運作的朋友可跳過這小節。
我們都知道UNIX有許多的services,例如:ftp, telnet, sendmail等等。
這些services在運作時,負責監聽某固定的port。而port我們就想像成一個
山洞。UNIX上有許許多多的山洞(port),如果有人在某個山洞旁守候,看到
有資料從這個山洞送來,那就可以接收、處理這個資料。我們把這個守候的
傢伙叫「惡魔」(Daemon)(有事沒事守在洞口的,叫惡魔也頗傳神的:))
。UNIX是只認得洞,不認得Daemon的。這句話是說,如果我們要作telnet,
那麼系統就直接把我們的資料送到對方特定的port去。所以我們知道,如果
對方該port沒有Daemon在守候的話,我們就一定沒有辦法與對方連接上。
可是,要知道所謂的「守候」,在電腦世界是某個程式在記憶體中跑,要是
如此的話,那麼小小的記憶中將會塞滿一堆沒事作,單純作等待的怪物,這
很明顯的將造成系統負擔。
所以,UNIX有個相當不錯的作法,就是記憶體中只有一個專門作等待的
Daemon,叫inetd 。這個Daemon所等待的port不一定,是依inetd.conf中的
設定而定。如果inetd.conf有設定要接受telnet,那麼inetd 會在telnet相
關的port(即port 23) 作等待。要是有人把資料送給該port,那inetd 就會
執行(應該叫fork)真正負責作相關事的Daemon(如這裡是telnetd-->
telnet Daemon )。而真正負責作事的Daemon是甚麼?在那裡?執行時有甚
麼參數等等,都會/得在inetd.conf中設定好。
假設inetd.conf沒有設finger,那麼如果有人從finger相關的port送資料來
,那麼可想而知,由於我們的inetd 不在該port作等待,所以送來的資料就
沒被處理,因此別人就不能對我們作finger(這就是所謂的「關」掉
finger)。
inetd.conf的格式大概如下(以ftp為例)
ftp stream tcp nowait root /usr/etc/in.ftpd in.ftpd
^^1. ^^^^^^^^^^^^^^^^^^^^2. ^^^3. ^^^^^^^^^^^^^^^4. ^^^^^5.
1.服務名稱,這得在/etc/services有定義的服務名稱,並不是隨意的阿貓阿
狗喔!:)
2.這裡筆者偷懶略過,請照舊的設定而設。有興趣了解者,請用"man"。
3.表示這個Daemon跑時是以那一個user來跑。如果是finger,最好assign 個
鳥不生蛋的id給它,如nobody。
4.這個服務的負責daemon的所在目錄與程式。
5.執行這個daemon時,所配合使用的參數。如果沒有的話,就如上直接再填上
daemon檔名。如有,則在檔名後直接把參數寫上,如"in.ftpd -l"
如果使用tcp wrapper 的話,則要在"4."與"5."二處作改變。
ftp stream tcp nowait root /some/where/tcpd /usr/etc/in.ftpd
^^^^^^^^^^^^^^^^4. ^^^^^^^^^^^^^5.
"4."改成tcpd所在的位置。
"5."改成daemon的位置與參數,即前面的"4."與"5."的組合。
下面再舉telnet為例,假設tcp wrapper 是裝在/daemon/tcpd:
原本:
telnet stream tcp nowait root /usr/etc/in.telnetd in.telnetd
修改後:
telnet stream tcp nowait root /daemon/tcpd /usr/etc/in.telnetd
□要注意的是:各欄位之間請用TAB 分隔。
而且,在inetd.conf修改之後,得要kill -HUP
步驟四:控制檔的設定
tcp wrapper 的控制檔有二:/etc/hosts.allow與/etc/hosts.deny。前者是
處理允許連接的主機、後者當然是拒絕的主機了。不過,由於我們是採用較
有彈性的extensible language 設法,所以只要用一個檔就可以了。筆者只
打算介紹在/etc/hosts.allow中作設定的設法。
檔案格式是:
daemon_list: client_list :option: option: option: ...
^^^^^^^^^1. ^^^^^^^^^2. ^^^^^^^^^^^^^^^^^^^^^^^^^^^3.
以"#" 作為附注,option間是以":" 作區隔
1.daemon list 是服務的Daemon(注意:不是服務),例如:in.telnetd
ftpd等等。就是在inetd.conf中,用到tcpd的某個服務其運作時的Daemon。
這裡可以把所有要作相同設定的daemon列舉出來,用空白字元或"," 號作
daemon間的區隔。例如:
telnetd in.ftpd in.fingerd: ....something(後面再談這裡)
telnetd, in.ftpd, in.fingerd: ....something
最後的":" 是表示這一行的daemon寫完了,後面是client list 了。
不過,如果是表示全部,那這麼樣子一個一個寫恐怕會很累,我們可以用
兩個wildcard:ALL 與EXCEPT。
a.ALL ,就是全部嘛!
b.EXCEPT,格式是:list_1 EXCEPT list_2。
當我們用ALL 時,不見得都很完美的適合每個daemon(或client),如
果有些例外不要的東東,那用EXCEPT是很方便的,例如:
ALL EXCEPT telnetd: ....something
ALL EXCEPT telnetd ftpd: ....something
EXCEPT會把其後的全都當成例外處理的東東,所以有甚麼要用列舉的,
那我們聰明點,寫在EXCEPT之前就可。
而且,EXCEPT可以包含EXCEPT(請參考hosts_access.5)
2.client list 是設定將受影響的機器。這可以是機器名、主機IP、patterns
或wildcard(如上述兩個)。由於patterns含蓋了前兩者,所以下面只
介紹patterns與wildcard。
A. patterns
共有四種,筆者只打算其中兩種。有興趣者請自行參考hosts_access.5
a.如果一串host name 由"." 開始(如:.nccu.edu.tw),那麼本軟
體只比較"." 之後的字元,只要"." 之後的字元相同,那就算是符
合的。所以:如果.nccu.edu.tw的設定,someway.nccu.edu.tw 這
機器是可以通過的,不過,someway.nccu.edu這機器(沒.tw )當
然沒辦法通過。
如果寫上一主機的全名,那部能受理的就只是該機器。
□這種方式只能在用host name ,而不能用ip address。
b.如果一串IP以"." (如:140.119.),則只比較"." 之前的數字。
所以"140.119."的設定,當看到140.119.1.2 時,是可以很愉快的
大叫賓果的。
如果寫全了一IP ADDRESS,則賓果的只有那一台機器而已。
□這種方式只能用IP ADDRESS。
舉例:
ftpd: 140.113.23.3 140.119. .nccu.edu.tw bbs.ntu.edu.tw: ...
B.wildcard
相同的,筆者沒有全介紹,有興趣者請參考hosts_access.5。
a.ALL
b.EXCEPT這兩個說明請參考上文,daemon list說明的區段。
c.KNOWN
d.UNKNOWN
這兩個可以是使用者帳號、主機名、主機IP address。
KNOWN 當然就指可以知道的,UNKNOWN 則是找不到的。
這些wildcard再配合"@" ,那麼我們可以控制連接的情形細微
到某一使用者。"@" 之後的是使用者的帳號,之後是機器名或
機器IP。
例如:hup@cc.nccu.edu.tw KNOWN@ALL等。
其中KNOWN@ALL 中的KNOWN@是表示可以用RFC 931(or 1413)抓
取連接的使用者的帳號。
如果有"@" 且之前有設定任何東東,那麼系統將會嘗試去抓取
要求連接的使用者的帳號。
3.options 是我們所要控制的動作。在daemon與client都符合之後,那
麼真正所要進行的動作,就是option在作。還是一句老話:筆者只介
紹其中較常用的options ,有興趣者,則請參考hosts_options.5 。
a.allow 接受這個連接的要求。
b.deny 拒絕這個連接的要求。
□注意:這兩個options 只能擺在所有的options list的最
後一個。
例:
ALL: .bad.domain: DENY <--設定這個仇家的domain來的機
都一概不理。
fingerd: UNKNOWN@ALL: DENY <--設定沒有裝ident 的機器
都不讓它finger我們。
ALL: ALL@ALL: ALLOW <--歡迎光臨:)。所以不是上述情
況的機器,都可以接受。
c.keepalive
這是非常好用的一個option。如果有使用者沒有正常離線就
關機,那麼可能會留一些process 在記憶體中,造成系統的
負擔。這個option的設定,系統將定期檢查client是否還活
著,不是就會解決它。
□UDP 不能用。
d.banners /some/directory
常常有人希望在連接之後(如telnet),先出現一段訊息,
例如:說明這部機器的作用、login name是甚麼等等。
這個option就可以滿足這個須求。/some/directory 是指我
們的訊息檔的所在目錄。而我們訊息檔必須與該daemon同名
字(如telnet服務的daemon叫in.telnetd,那我們的訊息檔
也得叫in.telnetd)。
另外,如果我們拒絕某個機器的連接要求,那我們也可以用
這個option,再寫一段溫文、祥合而有禮貌的拒絕兼致歉文
(這千萬不要寫得太過火,要不然,本來沒事,人家看了不
爽,說不定就惹火上身了)。
e.rfc 931 [ timeout_in_seconds ]
這個option設定之後,就表示要嘗試抓取要求連接者的帳號
。後面的參數是表示要用多久的時間來作這個嘗,default
值是10秒。這個值太小,那如果在網路太忙線時就沒辦法抓
到,如果太大,那麼沒有裝identd之類的機器得要等上半天
才有所反應了。
所謂的rfc 931 是指這樣子的東東:
當有機器要求與我們連接時,我們基於安全與控制上的理由
,可能會希望對方能提供對方正要向我們連接的那個使用者
的帳號(這很合理嘛,要我方提供服務,至少禮貌上對方總
得先告訴我們他是誰)。
如果對方有安裝支持rfc 931 的軟體(如identd, pidentd
等),那麼我們就可以成功的抓到對方使用者的帳號。否則
就不行了。
在這裡,筆者順便說一下,如果可以的話,希望大家都能夠
在自己所管的工作站裝這方面的軟體。相同的理由:我們希
望能獲知與我們連接的使用者的帳號,那對方或其他人當然
也希望我們能夠提供。所以將心比心,我們最好裝一裝(而
且安裝了,到最後受益的一定是自己)。
4.控制檔的舉例:
fingerd: UNKNOWN@ALL: banners /usr/daemon/mesg: DENY
telnetd: ALL@ALL: banners /usr/daemon/mesg: ALLOW
ftpd: ALL: rfc931: keepalive: allow
ALL: 140.119.: keepalive: ALLOW
ALL EXCEPT fingerd: ALL: DENY
上面的設定:finger只能給有裝identd之類軟體的機器使用,拒絕時
會有所表示;telnetd 允許全部人使用,且會先秀段訊息,其他的不
給140.119.之外的人使用。
安裝了本軟體之後,在控制上很明顯的就可以輕易的作到,另一方面,也能
夠記錄連接時的重要記錄。在系統發生「不幸」時,那我們就可以參考這些記錄
,對方「兇手」的追查上頗有幫助(當然,前提這些記錄要不被破壞)。
================================================================
作者:陳彩合 E-MAIL: hup@cc.nccu.edu.tw
版本:1995/03/24 version 1.0