tcp_wrapperを用いたアクセス制限
1. 概要
情報論の計算機のIPアドレスは 133.30.244.xxx である. セキュリティのため,特に希望がなければ,基本的には外部からの接続は禁止するように設定する. このために tcp_wrapper というアクセス制限用のツールを用いる.
2. inetd
通常,デーモンは inetd というデーモン起動用のサーバによって要求に応じて自動的に起 動される. どのような要求があったときにどのようなデーモンを起動するかは inetd の設定ファイル (通常は /etc/inetd.conf)に書かれている. 例えば,inetd.conf に以下の行があったとする.
ftp stream tcp nowait root /usr/libexec/ftpd ftpd -l
この行はftpというサービスの要求があったときに root の権限で /usr/libexec/ftpdというデーモンを起動することを示している.
デーモンのファイル名の次に書かれた文字列(この例では"ftpd -l")はデーモンを実行する際の引 数を示しており,すなわち,/usr/libexec/ftpdの引数としてargv[0] = "ftpd", argv[1] = "-l"が渡される.
サービスの要求は,実際には何番のポートに要求が来たかということで判断される. 各サービスに何番のポートが割り振られているかという情報は/etc/servicesに書かれてい る. 例えば以下のように,ftp のサービスには TCP の 21番ポートが割り振られてい る.
ftp 21/tcp #File Transfer [Control]
つまり,TCPで21番のポートに接続しようとすると,inetdはftpのサー ビス要求が来たと判断し,/usr/libexec/ftpdを実行する.
3. tcpd
tcp_wrapper の実体は tcpd というデーモン起動用のツールである. これは hosts.allow や hosts.deny といった設定ファイルを参照し,許可され ていれば,第0引数のファイル名で指定されたデーモンを起動する.
そこで,inetd.confの行,例えばftpの行を以下のように変更する.
ftp stream tcp nowait root /usr/local/etc/tcpd /usr/libexec/ftpd -l
すると,ftpのサービス要求があると,inetdはまず /usr/local/etc/tcpdを実行する. tcpdは設定ファイルに従って接続要求元が接続許可されているかを判断し,許可されてい れば,第0引数である /usr/libexec/ftpd を起動する.
最近のLinuxやFreeBSDでは,tcp_wrapperの機能はlibwrap.aというライブラリと して提供されており,これをリンクしているデーモンプログラムは自分自身で tcp_wrapperの設定ファイルによって接続許可を確認するようになっている.
オンラインマニュアル第3章のhosts_accessの項を以下のコマンドにより確認してみること.
% man 3 hosts_access
その中で libwrap.a に関して言及されていればまず問題ないと思われる(もちろん,設定 後の確認はお忘れなく).
また,tcp_wrapperをインストールしなくても,すでにtcpdがインストールされており, 上記のような設定がinetd.confに書かれている場合もある.
4. 設定
アクセス制限はhosts.allowとhosts.denyの二つの設定ファイルで行う. 多くの場合,これは/etcディレクトリにあるが,環境によっては異なる場所にある場合も 考えられる. オンラインマニュアル第5章のhosts_accessの項を以下のコマンドにより確認できるので調 べておくこと.
% man 5 hosts_access
場所が分かればこれの設定を行う. ファイルの書式は両方とも同じで,一行ごとに
デーモンリスト : クライアントリスト
の形式で記述する. デーモンリストの部分には設定を行うデーモン名(複数可)を記述し,クライアントリストにはその デーモンの実行を許可(hosts.allowの場合)または禁止(hosts.denyの場合) するホスト名(複数可)またはネットワークを記述する. 詳細はオンラインマニュアルに譲るが,デーモンリスト,クライアントリストともに,「全て」を表 す「ALL」という記述も許される.
思いがけない穴を避けるために,基本的には hosts.deny には次の一行を記述し,すなわ ち,全ての計算機からの全てのデーモンの実行を禁止しておいて,必要な接続について hosts.allowに記述するという方針が良いと思う.
ALL:ALL
情報論の場合は,計算機のIPアドレスは 133.30.244.xxxであり,基本としてはそれ以外のネット ワークからのアクセスを禁止するので,とりあえず以下のように作成すると良い.
- hosts.allow
-
ALL: 133.30.244.1/255.255.255.0
- hosts.deny
-
ALL: ALL
うまく動作しているかを確認するには,他のネットワークの計算機からアクセスするしかないが,ま ずは,特定の計算機からのアクセスのみを許可した状態で,それ以外の計算機からアクセスが禁止さ れているかどうかを確認してみると良いだろう.