hosts_access − ホストアクセス制御ファイルの書式 |
本マニュアルページは、クライアント (ホストの名前/アドレス、ユーザ名) と サーバ (プロセス名、ホストの名前/アドレス) のパターンをベースとする、単 純 なアクセス制御言語を解説します。最後に使用例を示しています。我慢でき ない方は、てっとり早い導入のために、使用例の節へ進んでください。 拡張バージョンのアクセス制御言語は、 hosts_options(5) 文書で解説して い ます。プログラム構築時に -DPROCESS_OPTIONS 付きで構築することにより、拡 張機能はオンになります。 以降の文章においては、 daemon はネットワークデーモンプロセスのプロセ ス 名 であり、 client はサービスを要求しているホストの名前やアドレスです。 ネットワークデーモンプロセスの名前は、inetd 設定ファイルにおいて指定 さ れます。 |
ア クセス制御ソフトウェアは、2 つのファイルを参照します。検索は、最初の マッチで終了します。つまり、 |
• |
(daemon,client) の組が /etc/hosts.allow ファイルのエントリに マッチするとき、アクセスは許可されます。 |
||
• |
そうでない場合、(daemon,client) の組が /etc/hosts.deny ファ イルのエントリにマッチするとき、アクセスは拒否されます。 |
||
• |
そうでない場合、アクセスは許可されます。 |
存在しないアクセス制御ファイルは、そのファイルが空であるものとして扱 わ れ ます。よって、アクセス制御ファイルをなにも用意しないことにより、アク セス制御をオフにすることが可能です。 |
各アクセス制御ファイルは、0 個以上のテキスト行を持ちます。これ ら の 行 は、出現順に処理されます。マッチが検出されたときに、検索が終了します。 |
• |
改行文字は、前にバックスラッシュ文字がある場合、無視されま す。これにより、長い行の分割が可能となり、編集が容易に な り ま す。 |
||
• |
空行または ‘#´ 文字で開始する行は無視されます。これにより、 コメントや空白の挿入が可能となり、表が読み易くなります。 |
||
• |
他のすべての行は、次の書式を満たす必要があります。[] の間 の ものは省略可能です。 |
daemon_list : client_list [ : shell_command ] |
daemon_list は、1 個以上のデーモンプロセス名 (argv[0] 値) またはワイル ドカード (後述) からなるリストです。 client_list は、1 個以上のホスト名、ホストアドレス、パターン、または ワ イ ルドカード (後述) からなるリストです。これが、クライアントホストの名 前またはアドレスに対してマッチされます。 より複雑な形式である、daemon@host と user@host は、それぞれサーバ終点パ ターンとクライアントユーザ名検索の節で説明します。 リストの要素は、空白やコンマで区切ります。 す べてのアクセス制御チェックは大文字小文字の違いは影響ありません。ただ し、NIS (YP) の netgroup の検索は例外です。 |
アクセス制御言語は、次のパターンを実装しています。 |
• |
‘.´ 文字で開始する文字列。ホスト名は、その最後の部分が指定さ れ た パ ターンにマッチする場合、マッチします。例えば、パターン ‘.tue.nl´ は、ホスト名 ‘wzv.win.tue.nl´ にマッチします。 |
||
• |
‘.´ 文字で終了する文字列。ホストアドレスは、その最初の 数 値 フィー ルドが指定された文字列にマッチする場合、マッチします。例 えば、パターン ‘131.155.´ は、 Eindhoven University ネット ワー ク (131.155.x.x) の (ほぼ) すべてのホストのアドレスにマッチしま す。 |
||
• |
‘@´ 文字で開始する文字列は、NIS (以前の YP) の netgroup 名と し て扱われます。ホスト名は、指定された netgroup のメンバである 場合、マッチします。デーモンプロセス名およびクライアントユー ザ 名では、 netgroup のマッチはサポートされていません。 |
||
• |
‘n.n.n.n/m.m.m.m´ 書式の表現は、‘net/mask´ ペアとして解釈さ れます。 ‘net´ が、アドレスと ‘mask´ とをビットごとに AND し た も の に 等 し い 場 合、 ホ ス ト アドレスはマッチします。例え ば、net/mask パ ター ン ‘131.155.72.0/255.255.254.0´ は、 ‘131.155.72.0´ から ‘131.155.73.255´ までの範囲のすべてのアドレ スにマッチします。 |
||
• |
‘[n:n:n:n:n:n:n:n]/m´ 書式の表現は ‘[net]/prefixlen´ ペア と し て 解 釈されます。 ‘net´ の ‘prefixlen´ ビットが、アドレスの ‘prefixlen´ ビットと等しい場合、 IPv6 ホストアドレスはマッチ し ま す。 例 え ば [net]/prefixlen パターン ‘[3ffe:505:2:1::]/64´ は、 ‘3ffe:505:2:1::´ か ら ‘3ffe:505:2:1:ffff:ffff:ffff:ffff´ までの範囲のすべてのアドレスにマッチします。 |
||
• |
文字 ‘/´ で開始する文字列はファイル名として扱われます。ホス ト名またはアドレスは、指定されたファイル中のホスト名またはア ド レ スのパターンのいずれかにマッチするとき、マッチします。ファイ ルの書式は、ホスト名またはアドレスのパターンを空白で区切って 0 個 以上指定した行が、0 個以上存在するというものです。ファイル名 パターンは、ホスト名またはアドレスのパターンを使用可能な場所 で あればどこでも使用可能です。 |
アクセス制御言語は、明示的なワイルドカードをサポートします。 |
ALL |
普遍的なワイルドカードであり、常にマッチします。 |
||
LOCAL |
名前にドット文字を含まない、すべてのホストにマッチしま す。 |
UNKNOWN |
名前が未知のすべてのユーザにマッチします。また、名前 または ア ド レスの いずれか一方でも 未知であるすべてのホストにマッチしま す。このパターンの使用には注意してください。というのは、一時 的 な ネームサーバの問題により、ホスト名を得られなくなる場合がある からです。また、どのタイプのネットワークに対して話しているの か を ソフトウェアが分っていない場合、ネットワークアドレスを得られ なくなるからです。 |
KNOWN |
名前が既知のすべてのユーザにマッチします。また、名前 お よび アドレスが ともに 既知のすべてのホストにマッチします。この パターンの使用には注意してください。というのは、一時的なネー ム サー バ の 問題により、ホスト名を得られなくなる場合があるからで す。また、どのタイプのネットワークに対して話しているのかソフ ト ウェ アが分かっていない場合、ネットワークアドレスを得られなくな るからです。 |
PARANOID |
名前がアドレスにマッチしないすべてのホストにマッチします。 tcpd が -DPARANOID (デフォルトモードです) 付きで構築された場合、アク セス制御表を検索する前に、このようなクライアントからの要求を 落 と し ま す。 こ の よ うな要求に対して更に制御を行いたい場合、 -DPARANOID なしで構築してください。 |
EXCEPT |
‘list_1 EXCEPT list_2´ という形式で使用することを意図し て います。 list_1 にマッチするもので、 list_2 にマッチしないも のに、こ の 構 造 は マッ チ し ま す。 EXCEPT オ ペ レー タ は、daemon_lists と client_lists で使用可能です。 EXCEPT オペ レータは、入れ子 (ネスト) にすることが可能です。これは、仮に 制 御 言 語 が 括 弧の使用を許すとして表記するならば、 ‘a EXCEPT b EXCEPT c´ は ‘(a EXCEPT (b EXCEPT c))´ のように解釈されます。 |
最初にマッチしたアクセス制御ルールがシェルコマンドを含む場合、このコ マ ンドは %<letter> 置換 (次節参照) の対象になります。置換結果は、標準入出 力とエラー出力が /dev/null に接続される /bin/sh 子プロセスにより実行 さ れます。実行完了を待ちたくない場合、コマンドの最後に ‘&´ を指定してくだ さい。 シェルコマンドは inetd の PATH の設定に依存してはなりません。かわりに、 絶 対 パス名を使用するか、明示的な PATH=whatever という文で開始すべきで す。 シェルコマンドフィールドを、これとは異なる互換性のない方法で扱う別の 言 語については、 hosts_options(5) 文書に解説してあります。 |
シェルコマンド中で、次の展開を使用可能です。 |
%a (%A) |
クライアント (サーバ) のホストアドレス。 |
%c |
ク ライアントの情報。これは、 user@host か、user@address か、ホスト名か、単にアドレスかのいずれかです。このうちのどれ が 使えるかは、得られる情報量に依存します。 |
||
%d |
デーモンプロセスの名前 (argv[0] 値)。 |
%h (%H) |
ク ライアント (サーバ) ホストの名前、または名前が得られない場合 アドレス。 |
%n (%N) |
クライアント (サーバ) ホストの名前 (または "unknown" ま た は "paranoid")。 |
%p |
デーモンプロセス id。 |
||
%s |
サーバの情報。これは、 daemon@host か、daemon@address か、 単にデーモン名かのいずれかです。このうちのどれが使えるかは、 得 られる情報量に依存します。 |
||
%u |
クライアントユーザの名前 (または "unknown")。 |
||
%% |
単一の ‘%´ 文字に展開されます。 |
% 展開中の文字でシェルを混乱させ得るものは、アンダスコアに置き換えられ ます。 |
クライアントの区別のために、クライアントが接続しているネットワークア ド レスを使用するには、次の形式のパターンを使用します。 |
process_name@host_pattern : client_list ... 異 なったインターネットアドレスに異なったインターネットホスト名をマシン が持つ場合、このようなパターンを使用可能です。サービス提供者がこの機 構 を 使 用 す る こ とにより、複数のインターネットの名前を使用して、 FTP, GOPHER, WWW といったアーカイブを提供可能です。この場合、インターネッ ト の 名前は、異なった組織に属することも可能です。 hosts_options(5) 文書の ‘twist’ オプションも参照してください。単一の物理インタフェースに 1 個以 上 の イ ン ター ネッ ト アドレスを持てるシステムがあります (Solaris や FreeBSD)。他のシステムでは、専用のネットワークアドレス空間で、 SLIP や PPP といった擬似インタフェースを使用する必要があるかもしれません。 host_pattern は、client_list の文脈におけるホストの名前およびアドレスの ものと同じ文法ルールに従います。通常、サーバ終点情報は、コネクション 指 向の (connection-oriented) サービスにおいてのみ使用可能です。 |
ク ライアントホストが RFC 931 プロトコルまたはその後継 (TAP, IDENT, RFC 1413) をサポートする場合、コネクションの所有者に関する追加の 情 報 を、 ラッ パプログラムが引き出せるようになります。クライアントのユーザ名情報 が得られると、クライアントホスト名とともに記録され、次のようなパター ン マッチに使用可能です。 |
daemon_list : ... user_pattern@host_pattern ... |
ルー ルにもとづいてユーザ名を検索 (デフォルト) するか、常にクライアント ホストに問い合わせるかの設定は、デーモンラッパのコンパイル時に設定可 能 で す。ルールにもとづいてユーザ名を検索する場合、前述のルールがユーザ名 検索を行うのは、 daemon_list と host_pattern がともにマッチする場合のみ です。 ユー ザパターンは、デーモンプロセスパターンと同じ文法であり、同じワイル ドカードが使用可能です (netgroup のメンバはサポートされませ ん)。 し か し、ユーザ名検索に夢中になって理性を失ってはなりません。 |
• |
クライアントのユーザ名情報がもっとも必要とされるとき、すなわ ちクライアントシステムが危なくなっているときこそ、クライアン ト のユーザ名情報は信用できません。一般的には、ALL と (UN)KNOWN の みが意味のあるユーザ名パターンです。 |
||
• |
TCP ベースのサービスにおいてのみ、かつクライアントホストが適 切 な デー モンを実行しているときのみ、ユーザ名検索を使用可能で す。他の場合には、結果は "unknown" になります。 |
||
• |
ユーザ名検索がファイアウォールにブロックされると、 UNIX カー ネ ルの良く知られた (well-known) バグにより、サービスを失うこと があります。カーネルにこのバグがあるかを判断するための手順 は、 ラッパの README 文書に解説しています。 |
||
• |
ユーザ名検索により、非 UNIX ユーザに対する顕著な遅延を生じる ことがあります。ユーザ名検索のデフォルトのタイムアウトは 10 秒 で す。 こ れ は、遅いネットワークに対しては短か過ぎますが、 PC ユーザをいらいらさせるには十分長いです。 |
最後の問題は、選択的なユーザ名検索により、緩和可能です。例えば、次の よ うにします。 |
daemon_list : @pcnetgroup ALL@ALL |
こ れは、ユーザ名検索を行わずに、pc netgroup のメンバにマッチします。し かし、他のシステムに対しては、ユーザ名検索を行います。 |
多くの TCP/IP 実装にあるシーケンス番号生成器の欠陥により、侵入者が信 頼 さ れたホストになりすました上で、例えばリモートシェルサービスを介して侵 入することができます。 IDENT (RFC931 等) のサービスを使用すること に よ り、このような攻撃や別のホストアドレス詐称攻撃を検知可能となります。 クライアントの要求を受け付ける前に、ラッパが IDENT サービスを使用するこ とにより、そのクライアントが要求をまったく送っていなかったことを検知 可 能です。クライアントホストが IDENT サービスを提供している場合、否定的な IDENT 検索結果 (クライアントが ‘UNKNOWN@host’ にマッチ) は、ホスト詐 称 攻撃の有力な証拠となります。 肯定的な IDENT 検索結果 (クライアントが ‘KNOWN@host’ にマッチ) は、これ より信頼性が低いです。クライアントの接続のみを詐称するよりは難しいで す が、侵入者がクライアントの接続と IDENT 検索の両方を詐称することが可能で す。クライアントの IDENT サーバが嘘をついている可能性もあります。 注: IDENT 検索は、UDP サービスでは動作しません。 |
この言語は十分柔軟性があるので、ほとんど手間もかけずに、異なったタイ プ のアクセス制御方針を表現可能です。またこの言語は 2 つのアクセス制御表を 使用しますが、一方の表は単純にしつつ、場合によっては空にしても、一般 的 な方針のほとんどを実装可能です。 次 に示す使用例を読むときには、許可表が拒否表の前にスキャンされること、 検索はマッチが検出されたときに終了すること、マッチが検出されない場合 に はアクセスが許可されることを認識することが重要です。 使 用 例 で は、 ホ ス ト と ド メ イ ン の名前を使用します。アドレスや network/netmask の情報を含めることにより、これらの例を改良して、一時 的 なネームサーバの検索失敗による影響を減じることが可能となります。 |
こ の場合、デフォルトではアクセスは拒否されます。明示的に権限を与えられ たホストのみが、アクセスを許可されます。 デフォルトの方針 (アクセスを拒否) は、簡単な拒否ファイルにより実装さ れ ます: /etc/hosts.deny: |
ALL: ALL |
こ れにより、全ホストに対する全サービスが拒否されます。ただし、許可ファ イルのエントリにより許可されたアクセスである場合は例外です。 明示的に権限を与えられるホストは、許可ファイルにリストします。例えば 次 のようにします: /etc/hosts.allow: |
ALL: LOCAL @some_netgroup |
最初のルールは、ローカルドメインの (ホスト名に ‘.´ を含まない) ホストか らのアクセスと、 some_netgroup のメンバからのアクセスを、許可します。 2 番 目のルールは、 foobar.edu ドメイン (先頭のドットに注意) の全ホストか らのアクセスを、許可します。ただし、terminalserver.foobar.edu は例外 で す。 |
今 度は、デフォルトではアクセスは許可されます。明示的に指定されたホスト のみが、サービスを拒否されます。 デフォルトの方針 (アクセスを許可) では許可ファイルは冗長であり、省略 可 能 で す。 明示的に権限を与えられないホストは、拒否ファイルにリストしま す。例えば次のようにします: /etc/hosts.deny: |
ALL: some.host.name, .some.domain |
最初のルールは、あるホストとあるドメインに対する全サービスを拒 否 し ま す。 2 番目のルールは、別のホストと別のドメインからの finger 要求は許可 しています。 |
次の使用例は、ローカルドメイン (先頭のドットに注意) からの tftp 要求 を 許 可します。他のホストからの要求は拒否されます。要求されたファイルの代 りに、 finger プローブが攻撃元ホストに対して送られます。結果 は スー パ ユーザに対してメールされます。 /etc/hosts.allow: |
in.tftpd: LOCAL, .my.domain /etc/hosts.deny: in.tftpd: ALL: (/some/where/safe_finger -l @%h | \ |
/usr/ucb/mail -s %d-%h root) & |
safe_finger は back-finger での使用を意図しており、適切な場所にインス トールすべきです。これは、リモートの finger サーバから送られるデータ に 起 因して発生し得るダメージを限定します。通常の finger コマンドよりも、 より良い防御となります。 %h (クライアントホスト) と %d (サービス名) のシーケンスの展開につ い て は、シェルコマンドの節に記述してあります。 警 告: 自己の finger デーモンをブービートラップにかけないでください。か けてしまうと、finger の無限ループになります。 ネットワークファイアウォールシステムでは、このトリックをさらに幅広く 活 用 できます。典型的なネットワークファイアウォールでは、外部の世界に対し て限定されたサービスのみを提供します。他の全サービスは、前述の tftp の 使 用例と同様の方法で「監視」可能です。その結果、素晴しい早期警戒システ ムができます。 |
次の場合、エラーが報告されます。ホストアクセス制御ルールに文法エラー が あ る場合、アクセス制御ルールが内部バッファの容量を越えた場合、アクセス 制御ルールが改行文字で終端されなかった場合、 %<letter> の展開結果が内部 バッ ファを溢れさせた場合、失敗すべきでないシステムコールが失敗した場合 です。すべての問題は、syslog デーモンを介して報告されます。 |
オペレーティングシステムによっては、 TCP Wrappers を基本システムの一 部 と して配布されているものがあります。このようなシステムでは、ネットワー クユーティリティにラッピング機能を組み込むのが一般的です。特に、シス テ ムによっては、 tcpd(8) が不要な inetd(8) を提供しているものがあります。 詳細については、システムの文書を確認してください。 |
/etc/hosts.allow, アクセスを許可された (daemon,client) のペア。 /etc/hosts.deny, アクセスを拒否された (daemon,client) のペア。 |
tcpd(8) tcp/ip デーモンラッパプログラム。 tcpdchk(8), tcpdmatch(8), テストプログラム。 |
ネームサーバの検索がタイムアウトすると、ホスト名が登録されていたとし て も、アクセス制御ソフトウェアはホスト名を使用できなくなります。 ド メインネームサーバの検索は大文字小文字を区別しません。一方、 NIS (以 前の YP) の netgroup の検索は大文字小文字を区別します。 |
Wietse Venema (wietse@wzv.win.tue.nl) Department of Mathematics and Computing Science Eindhoven University of Technology Den Dolech 2, P.O. Box 513, 5600 MB Eindhoven, The Netherlands スポンサーリンク
|