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名 : クライアントリスト : オプション
daemon名
起動されるdaemonの名前(ftpdやtelnetdなど)を指定する。サービス名ではないことに注意する。ALLと記述することで、すべてのネットワークdaemonを指定できる。クライアントリスト
コンマで区切られたホスト名、ドメイン名、ネットワーク名を指定する。ホスト名はドメイン名付きの形式でも、IPアドレスでも指定できる。ドメイン名を指定する場合は先頭にピリオドをつける。ALLと記述することで、すべてのアクセス元を指定できる。オプション
allowまたはdenyを設定する。また、ログの記録や他のコマンドの実行を指定することもできる。
設定例
以下に設定例を示す。
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については、すべてのホストからのアクセスを許可する設定が考えられる。それ以外のアクセスはすべて拒否する。
アクセス制御の確認
アクセス制御が正しく設定されているかどうかを確認するには、tcpdchkとtcpdmatchを使用する。設定を本番環境に適用する前に、これらのコマンドで動作を確認することを推奨する。
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
詳細はman inetdを参照のこと。
wは外部サービスに対して、Wは組み込みの内部サービスに対して、それぞれtcp wrapperを有効にする。
マッチするルールがなかった場合は、アクセスが許可される。
校閲の上,掲載