日本語 man コマンド類 (ja-man-1.1j_5) と日本語 man ドキュメント (ja-man-doc-5.4 (5.4-RELEASE 用) など) をインストールすると、以下のような man コマンド閲覧、キーワード検索が コンソールからできるようになります。
4.11-RELEASE-K, 5.4-RELEASE-K, 5.5-RELEASE-K, 6.0-RELEASE-K から 6.4-RELEASE-K, 7.0-RELEASE-K から 7.2-RELEASE-K, 8.0-RELEASE-K は、プライベート版 (小金丸が編集してまとめたもの) ですが、 より多くの翻訳したファイルが含まれています。 (5.4-RELEASE-K から 6.4-RELEASE-K, 7.0-RELEASE-K から 7.2-RELEASE-K, 8.0-RELEASE-K は、全翻訳済み)
6.4-STABLE-K, 7.2-STABLE-K, 8.0-STABLE-K は現在、 作成中で日々更新されています。 最新の snapshots を元に作成しています。
HOSTS_ACCESS(5) HOSTS_ACCESS(5)
名称
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' ビットが、アドレスの `pre
fixlen' ビットと等しい場合、 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 (デフォルトモードです) 付きで構築された場合、アク
セス制御表を検索する前に、このようなクライアントからの要求を落と
し ま す。このような要求に対して更に制御を行いたい場合、 -DPARA
NOID なしで構築してください。
オペレータ
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/net
mask の情報を含めることにより、これらの例を改良して、一時的なネームサー
バの検索失敗による影響を減じることが可能となります。
ほとんど閉じている状態
こ の場合、デフォルトではアクセスは拒否されます。明示的に権限を与えられ
たホストのみが、アクセスを許可されます。
デフォルトの方針 (アクセスを拒否) は、簡単な拒否ファイルにより実装さ れ
ます:
/etc/hosts.deny:
ALL: ALL
こ れにより、全ホストに対する全サービスが拒否されます。ただし、許可ファ
イルのエントリにより許可されたアクセスである場合は例外です。
明示的に権限を与えられるホストは、許可ファイルにリストします。例えば 次
のようにします:
/etc/hosts.allow:
ALL: LOCAL @some_netgroup
ALL: .foobar.edu EXCEPT terminalserver.foobar.edu
最初のルールは、ローカルドメインの (ホスト名に `.' を含まない) ホストか
らのアクセスと、 some_netgroup のメンバからのアクセスを、許可します。 2
番 目のルールは、 foobar.edu ドメイン (先頭のドットに注意) の全ホストか
らのアクセスを、許可します。ただし、terminalserver.foobar.edu は例外 で
す。
ほとんど開いている状態
今 度は、デフォルトではアクセスは許可されます。明示的に指定されたホスト
のみが、サービスを拒否されます。
デフォルトの方針 (アクセスを許可) では許可ファイルは冗長であり、省略 可
能 で す。 明示的に権限を与えられないホストは、拒否ファイルにリストしま
す。例えば次のようにします:
/etc/hosts.deny:
ALL: some.host.name, .some.domain
ALL EXCEPT in.fingerd: other.host.name, .other.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
HOSTS_ACCESS(5)