文件版本: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