TCP Wrapper とは、inetd から起動されるプログラムに対して、どこからサービス 要求が出されたか調べ、ログを記録すると共に、アクセス制御を行うための ソフトウェアです。inetd から起動されるプログラムだけを監視対象としているので 万全とは言えませんが、主要なサービスに対するアクセス制御を手軽に実現するための ツールとして、最低限インストールしなければならないセキュリティツールです。
TCP Wrapper は非常に幅広く使われているセキュリティ基本ツールであり、様々な anonymous FTP サーバから入手可能です。例えば、
ftp://ftp.chiba-u.ac.jp/pub/security/tools/tcp_wrapper/
より入手できます。ここでは、tcp_wrappers_7.6.tar.gzを入手しました。
FreeBSD や Linux ではバイナリパッケージが用意されているので、そちらを 使うのが便利です。FreeBSD の場合は、# pkg_add tcp_wrappers-7.6.tgzでインストールは終了です。
バイナリパッケージが用意されていない場合は、ソースファイルからコンパイルし、 インストールします。まず、入手したソースファイルを展開しディレクトリを移動 します。% tar xvfz tcp_wrappers_7.6.tar.gz % cd tcp_wrappers_7.6コンパイルは例えば、OS が SunOS 5.x (Solaris 2.x) なら、以下のようにします。% make CC=gcc REAL_DAEMON_DIR=/usr/sbin make sunos5ここで、REAL_DAEMON_DIR には inetd から起動されるデーモンプログラム (in.ftpd や in.telnetd など)が置かれているディレクトリを指定します。 また、SunOS 4.1.x の場合は、% make CC=gcc REAL_DAEMON_DIR=/usr/etc make sunos4となります。その他の OS も同じようにしてコンパイルできます。詳しくは Makefile を御覧ください。
コンパイルが終了すると、以下の 5 つのプログラムができています。TCP Wrapper にはインストーラが付いていないので、root になってから、これらの プログラムを REAL_DAEMON_DIR にコピーします。
- tcpd
- TCP Wrapper の本体
- tcpdchk
- TCP Wrapper の設定ファイルが正しいことをチェックするプログラム
- tcpdmatch
- 設定を実験するために、サービス名とアクセス元ホスト名を指定してアクセスの可否を表示するプログラム
- try-from
- リモートホストから(rshを使って)呼び出し、ホスト情報を表示するプログラム
- safe_finger
- finger にアクセスしてきた攻撃者の情報を収集するために使用するプログラム
% su Password: # cp tcpd tcpdchk tcpdmatch try-from safe_finger REAL_DAEMON_DIRまた、以下のようにしてオンラインマニュアルを所定の位置にコピーしておくと 便利です。# cp hosts_access.3 /usr/local/man/man3 # cp hosts_access.5 /usr/local/man/man5 # cp tcpd.8 tcpdchk.8 tcpmatch.8 /usr/local/man/man8以上で TCP Wrapper のインストールは終了です。
TCP Wrapper は、inetd がクライアントからのリクエストに応じてサーバを起動する 仕組みを利用しています。inetd はサーバの代わりに tcpd を起動し、tcpd が クライアントのアクセス権をチェックすると共に、結果をログに記録します。アクセス が認められるクライアントであれば、tcpd は本来のサーバプログラムを起動 します。
ここでは、アクセス制限の方針としては、とします。
- ftp は全て許可する。
- telnet , rlogin , rsh , finger 等に関しては制限する。
- アクセス許可は、本研究室と電気・情報工学科、その他関係機関のみとする。
アクセス可否の決定と、リクエストに対するアクションを決定するのは、 /etc/hosts.allow と /etc/hosts.deny という 2 つのファイルで行います。 /etc/hosts.allow ファイルにはアクセスを許可する条件を指定し、/etc/hosts.deny ファイルにはアクセスを拒否する条件を指定します。クライアントからの接続要求は、 まず /etc/hosts.allow ファイルとの一致がチェックされ、次に /etc/hosts.deny ファイルとの一致がチェックされます。どちらにも一致しなかった場合には接続が 許可されます。
どちらのファイルも記入方法は同じであり、付属のオンラインマニュアル hosts_access(5) に詳細やサンプルが書かれているので、そちらを参考にして 下さい。ファイルの形式は、デーモンのリスト : クライアントのリスト [: シェルコマンド ]というようになります。
ここでは、/etc/hosts.deny ファイルで全てのアクセスを禁止しておいて、必要最小限 のものを /etc/hosts.allow ファイルで許可するというようにします。
- /etc/hosts.deny
/etc/hosts.deny ファイルには、アクセスを拒否する条件を指定します。 ここでは、全てのアクセスを禁止するようにするため、ALL: ALLとだけ記述します。ここで ALL は全てのデーモン、及び全てのクライアントに一致 します。
- /etc/hosts.allow
/etc/hosts.allow ファイルには、アクセスを許可する条件を指定します。 ここでは、上に述べたアクセス制限の方針に基づいて、例えば Solaris 2.x ではin.ftpd: ALL ALL: LOCAL, .ec.t.kanazawa-u.ac.jp, .関係機関のドメイン名, 127.0.0.1というように記述しました。ここで LOCAL はそのマシンが所属するドメイン名 (eg.t.kanazawa-u.ac.jp) を表しています。また、ピリオドで始まる文字列は サブドメインを含むドメイン名とみなされます。また、ピリオドで終わる文字列は IPアドレスの一部とみなされます。127.0.0.1 といったループバックアドレスを指定 したのは、自分からのアクセスも全て許可するためです。
この他にも IPアドレスとサブネットマスクで記述することも可能です。
- /etc/inetd.conf
TCP Wrapper は inetd が起動するプログラムをすげ替える仕組みを利用するので、 inetd の設定ファイルである /etc/inetd.conf (Solaris 2.x では /etc/inetd/inetd.conf のシンボリックリンクになってます) を変更します。具体的には、不必要なデーモンはコメントアウトして起動しないように し、必要なデーモンについては inetd が tcpd を起動するように設定します。
例えば、Solaris 2.x では、以下のように編集しました。ftp stream tcp nowait root /usr/sbin/tcpd in.ftpd telnet stream tcp nowait root /usr/sbin/tcpd in.telnetd shell stream tcp nowait root /usr/sbin/tcpd in.rshd login stream tcp nowait root /usr/sbin/tcpd in.rlogind talk dgram udp wait root /usr/sbin/tcpd in.talkd finger stream tcp nowait nobody /usr/sbin/tcpd in.fingerd上に記述したデーモン以外は全てコメントアウトして利用できないようにしました。 また上に記述してあるように inetd が /usr/sbin/tcpd を起動するように変更 しました。
/etc/inetd.conf ファイルを書き換えたら、次のようにして稼働中の inetd に HUP シグナルを送信して、/etc/inetd.conf ファイルを再読込させるようにします。Solaris 2.x # ps -ef | grep inetd root 121 1 0 02:27:15 ? 0:00 /usr/sbin/inetd -s sakai 412 401 1 06:53:08 pts/1 0:00 grep inetd # kill -HUP 121
TCP Wrapper の設定が終了したら、まず tcpdchk を実行し、設定ファイルにミスが 無いことを確認します。ミスが無ければ何も表示されません。# cd REAL_DAEMON_DIR # ./tcpd次に、様々なサービスと様々なホストを指定して tcpdmatch を実行し、意図した アクセス制限が実現されていることを確認します。tcpdmatcp コマンドは# tcpdmatch サービス名 ホスト名(IPアドレス)のようにパラメータを取ります。例えば、# tcpdmatch in.telnetd mip13.ce.t.kanazawa-u.ac.jp client: hostname mip13.ce.t.kanazawa-u.ac.jp client: address 133.28.117.200 server: process in.telnetd matched: /etc/hosts.deny line 1 access: deniedのように実行します。この例ではアクセスが拒否されています。
最後に、様々なホストやプロバイダ等から実際にアクセスしてみて、意図する アクセス制限が行われており、ログがきちんと残ることを確認します。