TCP Wrappers の概要
TCP Wrappers は、トランスポート層(レイヤー 4)の TCP プロトコルに対して動作するホストベースのアクセス制御システムです。Wieste Venema によって開発され、特定のネットワークサービスに対する接続要求を監視し、許可または拒否の判定を行います。この機能は libwrap というライブラリ形式で提供されており、サービスプログラムが编译時に libwrap をリンクしているかどうかで制御の可否が決定されます。
サービスプログラムの対応確認
特定のデーモンプロセスが TCP Wrappers の制御対象となっているかを確認するには、バイナリファイルが libwrap.so を参照しているか調査します。以下のコマンドを用いて依存関係や文字列を検査できます。
ldd /usr/sbin/sshd | grep libwrap
strings /usr/sbin/sshd | grep libwrap
いずれのコマンドでも該当する出力があれば、そのサービスは hosts.allow および hosts.deny による制御が可能です。
設定ファイルと評価順序
アクセス制御ルールは以下の 2 つのファイルで定義します。
/etc/hosts.allow:アクセス許可リスト/etc/hosts.deny:アクセス拒否リスト
システムは接続要求を受け取ると、まず hosts.allow を検査し、一致するルールがあれば接続を許可します。一致しない場合、次に hosts.deny を検査し、一致すれば拒否します。どちらのファイルにも一致するルールが存在しない場合、デフォルトでは接続が許可されます。
ルールの構文
設定ファイル内の各行は以下の形式で記述します。
daemon_list : client_list [ :option ]
daemon_list の指定
制御対象となるサービスの実行ファイル名を指定します。サービス名ではなくバイナリ名(例:sshd, vsftpd)を用います。複数のサービスはカンマまたはスペースで区切り、すべての対応サービスを指す場合は ALL を使用します。また、サーバーが複数の IP アドレスを持つ場合、daemon@IP の形式で特定のインターフェースへの接続のみを制御することも可能です。
例:sshd@192.168.10.5 は、宛先 IP が 192.168.10.5 である sshd 接続のみを対象とします。
client_list の指定
アクセス元となるクライアントを指定します。複数のクライアントはカンマまたはスペースで区切ります。
- IP アドレス指定:
192.168.10.1または192.168.10.(プレフィックス) - ホスト名指定:
host.example.comまたは.example.com(ドメイン全体) - ネットワークマスク:
192.168.0.0/255.255.255.0 - CIDR 表記:
192.168.1.0/24(バージョンによる) - NIS ネットワークグループ:
@netgroup - キーワード:
ALL,LOCAL,KNOWN,UNKNOWN,PARANOID
EXCEPT 演算子
特定の範囲から一部のホストを除外する際に EXCEPT キーワードを使用します。
in.ftpd : 192.168.0. EXCEPT 192.168.0.50
上記の設定は、192.168.0.0/24 ネットワークからの FTP 接続を許可しますが、192.168.0.50 からの接続は除外します。
拡張オプション
ルール行の末尾にオプションを付与することで、接続時の追加動作を定義できます。主なオプションは以下の通りです。
deny:hosts.allow 内で使用し、マッチした場合に明示的に拒否します。allow:hosts.deny 内で使用し、マッチした場合に明示的に許可します。spawn:指定されたシェルコマンドをバックグラウンドで実行します。ログ記録などに利用されます。twist:接続を拒否し、指定されたコマンドの出力をクライアントに返して接続を閉じます。
spawn および twist 内では以下の変数展開が利用可能です。
%c:クライアント情報%s:サーバー情報%d:デーモン名%p:プロセス ID%%:パーセント記号
設定事例
以下の例では、SSH サービスへのアクセスを特定のサブネットに制限し、ログを残す構成を示します。
事例 1:特定ネットワークからの SSH アクセス許可
10.20.30.0/24 ネットワークからのみ sshd への接続を許可し、それ以外は拒否します。また、接続試行をログファイルに記録します。
/etc/hosts.allow
sshd : 10.20.30. : spawn /bin/echo "Login attempt from %c" >> /var/log/wrapper_audit.log
/etc/hosts.deny
sshd : ALL
事例 2:twist を利用した接続拒否メッセージ
特定のネットワーク帯域からの SSH 接続を拒否し、クライアント側にメッセージを表示させて切断します。
/etc/hosts.deny
sshd : 172.16. : twist /bin/echo "Access denied for your network"
この設定により、172.16.0.0/16 からの接続試行に対してはサービスが起動せず、指定されたメッセージが表示された後に接続が終了します。