tcp wrapper

inetd

inetd(internet super-server daemon)は、ネットワークサービスへのアクセス要求を一元管理するプログラムである。ここでdaemonとは、バックグラウンドで動作し続けるプログラムを指す。

UNIXシステムへのネットワーク経由のアクセスは、sendmailのような常駐型のdaemonへのものと、常駐はせずにアクセス要求があった時に起動されるものに分けられる。inetdは後者の場合にアクセス要求を受け取り、要求に応じたdaemonを起動する役割を担う。各サービスごとにdaemonを常駐させる必要がないため、システムリソースを節約できる。

inetdの設定は/etc/inetd.confに記述する。このファイルには、ネットワーク越しのログインやファイル転送などを担当するプログラムを起動するために必要な情報が記載されている。以下に/etc/inetd.confの内容を確認する。多くの記述が並んでいるが、その大部分は次のような形式になっている。

ftp stream  tcp nowait  root    /usr/libexec/ftpd   ftpd -l

それぞれの項目の意味は、順にサービス名/ソケットタイプ/プロトコル/{wait|nowait}/ユーザ名/サーバプログラム名/サーバプログラム引数となっている1。行の先頭に#がついている行はコメント行であり、設定行の先頭に#がついている場合はそのサービスが無効になっていることを意味する。サービスが有効になっている場合、外部からのアクセスがあれば対応するプログラムが起動される。

tcp wrapperとは

tcp wrapperは、inetd経由のネットワークアクセスを監視し、アクセス制限を行う仕組みである。許可されていないホストからの接続を拒否し、不正アクセスのリスクを軽減できる。

例えばtelnetの場合、通常は外部からtelnetのアクセスがあると、該当するポート(telnetの場合は23番)に応じてtelnetdが起動し、応答する。ポートとは、ネットワーク通信においてサービスを識別するための番号である。tcp wrapperを導入している場合は、外部からのアクセスをtcp wrapperが受け取り、設定した条件を満たしていることを確認してから、telnetdを起動する。

tcp wrapperはinetd経由で起動されるサービスにのみ有効である。sendmailやsshdのようにスタンドアロンで動作するdaemonには、tcp wrapper以外の方法でアクセス制御を行う必要がある。

tcp wrapperの利用

FreeBSDの場合、以前はtcpdという別のプログラムを用意してtcp wrapperを利用していたが、現在はinetdにtcp wrapperの機能が組み込まれているため、tcpdを介さずにアクセスの制御が行える。

inetdに組み込まれているtcp wrapperを有効にするには、起動時にinetd -wWとオプションを指定する2。多くの環境ではデフォルトでこのモードで起動される。

アクセス制御

tcp wrapperは、接続元のIPアドレスによってアクセスの拒否または許可を設定できる。これらの設定を行うファイルは、以前は/etc/hosts.allowと/etc/hosts.denyという2つのファイルに分かれていたが、現在は/etc/hosts.allowに統一されている。

hosts.allowの基本

以下に、デフォルトで用意されている/etc/hosts.allowの内容を確認する。#から始まるコメント行が多数並んでおり、その中に次のような行がある。

# The rules here work on a "First match wins" basis.
ALL : ALL : allow

コメントに記載されているとおり、このファイルでは最初にマッチしたルールが適用される3。一致した時点で以降のルールは評価されないため、ルールの記述順序が重要である。許可ルールよりも先に「ALL : ALL : deny」を記述すると、すべてのアクセスが拒否されてしまう。

上記の2行目は「すべてのサービスに対して、すべてのホストからのアクセスを許可する」という意味である。このデフォルトの状態では、tcp wrapperによるアクセス制限が機能していない。セキュリティを確保するにはこのファイルを書き換える必要がある。

hosts.allowの記述形式

/etc/hosts.allowの記述形式は次のとおりである。

daemon名 : クライアントリスト : オプション

設定例

以下に設定例を示す。

telnetd : 192.168.33. : allow
ftpd : 133.5.18.0/255.255.255.0 : allow
ALL : .db.is.kyushu-u.ac.jp : allow
ALL : ALL : deny

1行目は、IPアドレスが192.168.33.*であるホストからのtelnetアクセスを許可する。2行目は、IPアドレス133.5.18.*からのftpアクセスを許可する。3行目は、すべてのサービスに対する*.db.is.kyushu-u.ac.jpからのアクセスを許可する。4行目は、上記に該当しないすべてのアクセスを拒否する。

設定の反映

/etc/hosts.allowの変更は即座に反映される。ファイルを保存するだけでよく、inetdの再起動は不要である。ただし、/etc/inetd.confを変更した場合は、inetdに設定を再読み込みさせる必要がある。

# kill -HUP `cat /var/run/inetd.pid`

または、システムによっては次のコマンドを使用する。

# service inetd reload

研究室におけるセキュリティポリシー

研究室においては、一部のサービスを除いてすべてのアクセスを拒否する方針をとる。

まず、/etc/inetd.confでftp以外のサービスをすべて無効にし、アクセスを受け付けないようにする。次に、/etc/hosts.allowを書き換える。有効にしたftpについては、研究室のマシン(133.5.18ネットワークと192.168.33ネットワーク)からのみアクセスを許可する。sshについては、すべてのホストからのアクセスを許可する設定が考えられる。それ以外のアクセスはすべて拒否する。

アクセス制御の確認

アクセス制御が正しく設定されているかどうかを確認するには、tcpdchktcpdmatchを使用する。設定を本番環境に適用する前に、これらのコマンドで動作を確認することを推奨する。

tcpdchk

tcpdchkは/etc/hosts.allowの書式をチェックする。書式に問題がある場合には警告が出力される。

% tcpdchk

tcpdmatch

tcpdmatchは、指定したサービスとアクセス元の組み合わせに対して、アクセスが許可されるか拒否されるかを確認する。

tcpdmatch サービス名 アクセス元

ftpアクセスが許可されている場合には、次のような結果が表示される。

% tcpdmatch ftpd ホスト名
client:   hostname ホスト名
client:   address  ホストのアドレス
server:   process  ftpd
matched:  /etc/hosts.allow line 1
access:   granted

アクセスが拒否されている場合には、次のようになる。

% tcpdmatch ftpd ホスト名
client:   hostname ホスト名
client:   address  ホストのアドレス
server:   process  ftpd
matched:  /etc/hosts.allow line 4
access:   denied

「matched」はマッチしたルールの行番号、「access: granted」は許可、「access: denied」は拒否を意味する。

マニュアル

詳細な説明は、hosts_options(5)やhosts_access(3)のマニュアルに記載されている。

% man hosts_options
% man hosts_access
  1. 詳細はman inetdを参照のこと。

  2. wは外部サービスに対して、Wは組み込みの内部サービスに対して、それぞれtcp wrapperを有効にする。

  3. マッチするルールがなかった場合は、アクセスが許可される。

天野研 修士2年 松本秀夫, 4月26日木曜日
校閲の上,掲載