サービスにクライアントマシンが接続を許可されるかどうか決定するために、 TCPラッパーは次の2つのファイルを参照します。これは一般的にホストアクセスファイルと 呼ばれるものです:
/etc/hosts.allow
/etc/hosts.deny
クライアントの要求がTCPラップしたサービスで受け付けられた時、次のような 基本ステップが取られます:
サービスが/etc/hosts.allowを参照する。 — TCPラップしたサービスは連続的に/etc/hosts.allowファイルを構文解析して そのサービスで指定されている最初の規則を適用します。対応する規則があれば、接続を許可します。 そうでなければ、それは第2ステップへと移動します。
サービスが/etc/hosts.denyを参照する。 — TCPラップしたサービスは連続的に/etc/hosts.denyファイルを構文解析します。 対応する規則があれば、接続は拒否されます。そうでなければ、そのサービスへのアクセスは認可されます。
TCPラッパーを使用してネットワークサービスを保護する場合、次の重要な点を 考慮する必要があります:
hosts.allow内のアクセスの規則が最初に適用される為、 これらの規則はhosts.deny内に指定してある規則より優先されます。 そのため、hosts.allowでサービスへのアクセスが許可された場合、 hosts.denyの同じサービスに対するアクセス拒否の規則は無視 されます。
各ファイル内の規則が上から下に読まれ、該当するサービスに対して最初の 適応する規則が1つだけ採用されますので、規則の配置順序は非常に重要です。
どちらのファイルにもそのサービス用の規則がない場合、あるいは どちらのファイルも存在しない場合、そのサービスへのアクセスは承認されます。
TCPラップのサービスは、ホストのアクセスファイル規則をキャッシュしません。 そのため、hosts.allowまたはhosts.denyへの 変更は、ネットワークサービスを再開始しなくても直ちに反映されます。
/etc/hosts.allowと/etc/hosts.denyの フォーマットは全く同じです。「#」マークで始まる行、又は空白行は すべて無視されます。各規則はその独自の行になければなりません。
それぞれの規則は以下のような基本フォーマットを使用してネットワークサービスへの アクセスを制御します:
<daemon list>: <client list> [: <option>: <option>: ...] |
<daemon list> — プロセス名 (サービス名ではなく)のカンマで区切られたリスト、又は ALLワイルドカード(項15.2.1.1を参照)。デーモンリストは また、項15.2.1.3内の演算子を 承認し、より高い柔軟性を与えます。
<client list> — ホスト名の カンマで区切られたリスト、ホストIPアドレス、特殊パターン (項15.2.1.2を参照)、あるいは特殊 ワイルドカード(項15.2.1.1を参照)など、 規則により影響されるホストを識別します。クライアントリストは、項15.2.1.3にある演算子リストも 承認して、より高い柔軟性を与えます。
<option> — 規則が発動された時に 実施される1つのオプション行動、又はカンマで区切られた行動のリスト。オプションの フィールドは拡張(項15.2.3.4を参照)を サポートし、シェルコマンド、アクセスの許可/拒否、ロギング行動の変更などの開始に使用できます (項15.2.3を参照)。
以下に基本的なホストのアクセス規則のサンプルを示します:
vsftpd : .example.com |
この規則はTCPラッパーに対して、example.comドメインの ホスト全てからのFTPデーモン(vsftpd)への接続を監視する ように指示します。もし、この規則がhosts.allowにある 場合、接続は許可されます。この規則がhosts.denyにある 場合は、接続は拒否されます。
次のホストアクセス規則のサンプルはより複雑で、2つのオプションフィールドを 使用します:
sshd : .example.com \ : spawn /bin/echo `/bin/date` access denied>>/var/log/sshd.log \ : deny |
この例の中で、各オプションフィールドが逆スラッシュ(\)の 後に始まっていることに注意してください。逆スラッシュの使用は、規則の長さに よる問題を防止します。
警告 | ||
---|---|---|
ホストアクセスファイルの最後の行が、改行マーク(
|
このサンプルの規則は、SSHデーモンへの接続(sshd)が、 example.comドメインのあるホストからの試行である場合、 echoコマンドを実行(特別ファイルへの試行をログします) して、接続を拒否するように示しています。オプションのdeny ディレクティブが使用されている為、それがhosts.allowファイル 内に存在しても、この行がアクセスを拒否します。利用できるオプションの詳細は項15.2.3で御覧下さい。
ワイルドカードの使用により、TCPラッパーはデーモンやホストのグループを より簡単に照合できます。これらはアクセス規則のクライアントリストフィールドの 中で多く使用されます。
以下のようなワイルドカードが使用できます:
ALL — すべてを照合します。これはデーモンリストと クライアントリストの両方に使用できます。
LOCAL — ローカルホストなど、ピリオド(.)の ないホストをすべて照合します。
KNOWN — ホスト名、ホストアドレス、あるいは ユーザーが既に判っているホストを照合します。
UNKNOWN — ホスト名、ホストアドレス、あるいは ユーザーが不明なホストをすべて照合します。
PARANOID — ホスト名とホストアドレスが一致しない ホストをすべて照合します。
重要 | |
---|---|
KNOWN、UNKNOWN、PARANOIDの それぞれのワイルドカードは、名前解決中で問題となると正式なユーザーがサービスへの アクセスを取得するのを阻止する可能性がありますので、注意して使用して下さい。 |
パターンはアクセス規則のクライアントリストフィールドに使用して、 クライアントホストのグループをより正確に指定できます。
以下にクライアントエントリー用の最も一般的に人気のあるパターンのリストを 示します:
ピリオド(.)で始まるホスト名 — ホスト名の先頭にピリオドを付けると、その名前のリストされたコンポーネントを共有する 全てのホストを照合します。以下の例では、example.comドメイン内の すべてのホストに適用されます:
ALL : .example.com |
ピリオド(.)で終了するIPアドレス — ピリオドをIPアドレスの末尾に置くと、あるIPアドレスの最初の数字のグループを共有する全ての ホストを照合します。次の例では、192.168.x.xネットワーク内のすべての ホストに適用されます:
ALL : 192.168. |
IPアドレス/ネットマスクのペア — ネットマスク表現もIPアドレスの特定のグループへのアクセスを制御する 為にパターンとして使用されます。次の例では、192.168.0.0から 192.168.1.255までのアドレスを持つ全てのホストに適用されます:
ALL : 192.168.0.0/255.255.254.0 |
アスタリスク(*)— アスタリスクはホスト名のグループやIPアドレスの全体を照合するのに使用 されます。これは他のタイプのパターンを含むようなクライアントリストが 混合していない場合に有効です。次の例では、example.com ドメイン内の全てのホストに適用されます:
ALL : *.example.com |
スラッシュ(/) — クライアントリストがスラッシュで始まる場合、それはファイル名と して取り扱います。これは、多量のホストを指定する規則が必要な場合に役に 立つものです。次の例では、全てのTelnet接続の為の/etc/telnet.hosts ファイルへのTCPラッパーを対称にしています:
in.telnetd : /etc/telnet.hosts |
他にも使用頻度の低いパターンもTCPラッパーで受け付けられます。詳細は ホストアクセスのman 5ページで御覧下さい。
警告 | |
---|---|
ホスト名やドメイン名など、名前解決を必要とするものに関する規則を作成している 場合、侵入者は各種のトリックを使用して正確な名前解決を邪魔します。さらには、 DNSサービスへのいかなる妨害は、権限のあるユーザーでさえもネットワークサービスを 使用出来ないようにしてしまいます。 可能な限り、IPアドレスを使用するのが最善の策です。 |
現在、アクセス制御規則は、1つの演算子、EXCEPTを受け付けます。 これはデーモンリストと規則内のクライアントリストで使用できます。
EXCEPT演算子の使用により、同じ規則内でより幅広い 照合へと特別な拡張が可能になります。
次のhosts.allowからの例では、cracker.example.com以外の 全てのexample.comホストからの、全てのサービスへの接続が許可されます:
ALL: .example.com EXCEPT cracker.example.com |
もう1つのhosts.allowファイルからの例では、192.168.0.xの ネットワークからのクライアントはFTP以外は、すべてのサービスを使用できます:
ALL EXCEPT vsftpd: 192.168.0. |
注意 | |
---|---|
組織的な観点からは通常は、EXCEPT演算子は控えめに使用して、他のアクセス制御ファイルで 規則の例外を指定する方がよいでしょう。このようにすれば、どの管理者も該当するファイルを調べるだけで サービスへのアクセスを許可するホストか、禁止するホストを知ることができ、さまざまなEXCEPT 演算子を調べる必要がなくなります。 |
portmapのアクセス制御規則を作成する場合、TCPラッパーの実装は ホストのルックアップをサポートしないので、ホスト名は使用しないで下さい。この理由で、 ホストを指定する時はIPアドレスかキーワードALLのみを、 hosts.allow又は、hosts.denyで使用して ください。
さらには、portmapアクセスコントロール規則への変更は すぐに反映されない場合があります。
NISやNFSなど幅広く使用されているサービスはportmapに 依存して運用されているので、これらの制限に気をつけて下さい。
アクセスの許可と拒否についての基本的な規則の他に、Red Hat LinuxのTCPラッパーの実装はオプションフィールドを 通じてアクセス制御言語への拡張をサポートしています。ホストアクセス規則内のオプションフィールドを 使用することにより、管理者はログの動作の変更、アクセス制御の確定、及びシェルコマンドの始動などの 各種タスクを達成することが出来ます。
オプションフィールドにより管理者は、severityディレクティブを 使用してログ設備と規則の優先度を簡単に変更することができます。
以下の例では、example.comドメインのホストからのSSHデーモンへの 接続は、emergの優先度を持つデフォルトのauthpriv 設備(設備値が指定されていない為)にログされます:
sshd : .example.com : severity emerg |
severityオプションを使用して設備を指定することもできます。 次の例では、alertの優先度を持つlocal0設備への example.comドメインのホストによるSSHサービス接続の試行をログします:
sshd : .example.com : severity local0.alert |
注意 | |
---|---|
実際には、この例はlocal0設備へ syslogデーモン(syslogd)が ログするように設定されるまで、機能しません。カスタムログ設備の設定に関する詳細については syslog.confのmanページをお読み下さい。 |
オプションフィールドにより、管理者はallow又はdeny ディレクティブを最終オプションとして追加することで、1つの規則内で明確に許可、あるいは 拒否ができるようになります。
例えば、次の2つの例は、client-1.example.comからの SSH接続を許可しますが、client-2.example.comからの 接続を拒否します:
sshd : client-1.example.com : allow sshd : client-2.example.com : deny |
アクセス制御を規則単位ベースで許可することにより、オプションフィールドは 管理者が全てのアクセス規則を1つのシングルファイル、hosts.allow、 又はhosts.denyに統合できるようにします。幾らかの人々にとっては この方法がアクセス規則を簡単に構成させてくれるでしょう。
オプションフィールドにより、アクセス規則は次の2つのディレクティブを通じて シェルコマンドを始動できます:
spawn — シェルコマンドを子プロセスとして 始動できます。このオプションディレクティブは/usr/sbin/safe_fingerの 使用などのタスクを実行し、要求しているクライアントの情報を得たり、echo コマンドを使用して特殊なログファイルを作成したりします。
次の例では、example.comドメインからTelnetサービスへ アクセスを試行するクライアントは、密かに特殊なファイルにログされます:
in.telnetd : .example.com \ : spawn /bin/echo `/bin/date` from %h>>/var/log/telnet.log \ : allow |
twist — 要求されたサービスを指定されたコマンドで入れ換えます。 このディレクティブは侵入者に対する仕掛け(蜜の壷といいます)をするのによく使用されます。また 接続しているクライアントにメッセージを送信するためにも使用されます。ツイストコマンドは、 規則行の末尾に置く必要があります。
以下の例では、example.comドメインからFTPサービスへ アクセスを試行しているクライアントがechoコマンドにより メッセージを受け取ります。
vsftpd : .example.com \ : twist /bin/echo "421 Bad hacker, go away!" |
シェルコマンドのオプションに関する情報はhosts_optionsの manページで御覧下さい。
拡張は、spawnやtwistディレクティブと一緒に 使用して、クライアント、サーバー、プロセスなどの関連の情報を提供します。
以下にサポートされている拡張のリストを示します:
%a — クライアントのIPアドレス。
%A — サーバーのIPアドレス。
%c — ユーザー名とホスト名、又はユーザー名と IPアドレスなどのような各種のクライアントの情報を提供します。
%d — デーモンのプロセス名。
%h — クライアントのホスト名 (又は、それがない場合、 IPアドレス)。
%H — サーバーのホスト名 (又は、それがない場合、 IPアドレス)。
%n — クライアントのホスト名。ない場合は、 unknownが出力されます。もしクライアントのホスト名と ホストアドレスが一致しない場合は、paranoidが出力 されます。
%N — サーバーのホスト名。ない場合は、 unknownが出力されます。サーバーのホスト名とホスト アドレスが一致しない場合、paranoidが出力されます。
%p — デーモンのプロセス ID。
%s — デーモンのプロセスやサーバーのホスト又は IPのアドレスなどのさまざまなタイプのサーバー情報。
%u — クライアントのユーザー名。ない場合は unknownが出力されます。
以下の規則のサンプルは、spawnコマンドと一緒に拡張を使用して カスタマイズログファイルの中のクライアントホストを識別しています。
これはTCPラッパーに対して、SSHデーモン(sshd)への接続が example.comドメインのホストから試行された場合は、 echoコマンドを実行して、クライアントのホスト名 (%h拡張を使用して)を含むその試行を特殊ファイルへ ログするように指示しています:
sshd : .example.com \ : spawn /bin/echo `/bin/date` access denied to %h>>/var/log/sshd.log \ : deny |
同様に、拡張はクライアントに送り返すメッセージを個人化するのに使用されます。 次の例では、example.comドメインからFTPサービスへアクセスを 試行しているクライアントは、彼らがサーバーに立ち入り禁止となったことを通知 されています:
vsftpd : .example.com \ : twist /bin/echo "421 %h has been banned from this server!" |
利用できる拡張、及び追加のアクセス制御オプションに関する総合的説明には、 hosts_accessの為のmanページのセクション5 (man 5 hosts_access)とhosts_optionsの manページを御覧下さい。
TCPラッパーに関する追加のリソースについては、項15.5を 参照して下さい。