TCP/IP サービスの制限 - TCP_Wrappers


  1. アクセスコントロールしたい

    inetd から起動される TCP サービス (ftp, telnet 等) のアクセスを制限し、リクエストをログに記録します。


  2. リソース

    ソースを入手します。


  3. コンパイルとインストール

    アーカイブを展開します。

    Makefile を書き換えてコンパイルします。以下の3行を加えます。

    コンパイルします。

    実行可能ファイルが5個作成されます。

    root になり、作成されたバイナリファイルを手動でインストールします。

    マニュアルをインストールします。

    man コマンドで参照できるように環境変数 MANPATH に /usr/local/man を加えておきます。
    例えば csh だと以下のようにします ($HOME/.cshrc に記述します)。


  4. inetd.conf の編集 - /etc/inet/inetd.conf

    inetd (Internet services daemon) は、/etc/inet/inetd.conf ファイルの設定にしたがってサービスを起動します。起動するプログラムを tcpd に変更することでアクセスの制限を実現します。inetd の子プロセスとして tcpd が起動し、tcpd は /etc/hosts.allow と /etc/hosts.deny を参照してリクエストの可否を判断します。

    inetd.conf を書き換え、起動されるサーバプログラムを tcpd に置き換えます。

    Makefile 中で定義した、REAL_DAEMON_DIR=/usr/sbin 以外のディレクトリに存在するサーバプログラムを tcpd で置き換える場合は、引数の指定でプログラム名を絶対パスで記述します。

    ついでに permission を変更しておきます (policy に依存すると思います)。


  5. hosts.allow と hosts.deny

    tcpd によるアクセスコントロールは /etc/hosts.allow と /etc/hosts.deny の2つのファイルの検索によって決定します。最初に hosts.allow の検索を行い、これと一致する場合アクセスを許可します。hosts.allow と一致しない場合は hosts.deny の検索を行い、これと一致する場合はアクセスを拒否します。hosts.deny とも一致しない (つまり両方に一致しない) 場合はアクセスを許可します。

    以下に /etc/hosts.deny と /etc/hosts.allow の例を挙げます。

    この場合は hosts.deny ですべてを拒否しておいて、許可する address をサービス毎に hosts.allow で許可しています。テスト用にひとつのローカルアドレスをアクセス拒否しています。
    記述の書式は以下です。

    それぞれの list element は comma か blank で区切ります。daemon_list には以下の wildcard が使用でき、client_list には host 名と、以下の address, pattern, wildcard が使用できます。

    /etc/hosts.allow, /etc/hosts.deny の2つも permission を変更しておきます。


  6. 制限の確認

    /etc/inetd/inetd.conf, /etc/hosts.allow, /etc/hosts.deny の編集のあとで tcpdchk を実行します。
    error が出力される場合はファイルを修正し、error (と warning ) が出力されないように設定します。
    ちなみに上の例だと下のように warning が出力されます。

    つぎに、tcpdmatch でいくつかのパターンを match してみます。これは policy に従った設定がされているか確認するためのもの (oracle: 預言) ですので、重要なパターンを確認すれば問題ないと思います。

    実際にアクセス制御を開始するために inetd を再起動します。

    実際に他の host からリクエストし、アクセス制限を確認します。


  7. メッセージの出力

    ちょっと淋しいので、アクセスを拒否するときにメッセージ (banner) を表示するようにしてみます。

    banner 用ディレクトリ (例えば /etc/banners) を作成し、Banners.Makefile を cp します。

    banner 用ディレクトリに prototype という名前のファイルを作成し、表示するメッセージを記述します。

    shell command で使用できる expansion を以下に挙げます。

    つぎに banner 表示用のコマンドを作成します。

    banner は /etc/hosts.allow と /etc/hosts.deny の rule ひとつひとつに割り当てることが可能です。それぞれの rule に対してディレクトリを用意し、banner 表示プログラムを置きます。ここでは、アクセスを拒否する場合のディレクトリ (/etc/banners/refuse) を用意し、ファイルを cp します。

    /etc/hosts.deny ファイルを編集して、アクセス拒否時の banner ディレクトリを指定します。

    アクセスを拒否する場合、banner が表示されるようになります。



もどる Last modified: 04/09/01 00:41:05 JST