Hosts.allow - Linuxコマンド - Unixコマンド

hosts_access - ホストアクセス制御ファイルの形式

DESCRIPTION

このマニュアルページで 、クライアント(ホスト名/アドレス、ユーザー名)、およびサーバー(プロセス名、ホスト名/アドレス)のパターンに基づいた単純なアクセス制御言語について説明します。 例は最後に記載されています。 アクセス制御言語の拡張バージョンは、 hosts_options (5)のドキュメントで説明されています。 拡張機能は、プログラムのビルド時に-DPROCESS_OPTIONSを使用してビルドすることで有効になります。

次のテキストでは、 daemonネットワークデーモンプロセスのプロセス名であり、 clientはサービスを要求しているホストの名前またはアドレスです。 ネットワークデーモンのプロセス名は、inetd構成ファイルで指定されます。

アクセス制御ファイル

アクセス制御ソフトウェアは2つのファイルを参照します 。 最初の試合で検索が停止します。

アクセスは、(デーモン、クライアント)のペアが/etc/hosts.allowファイル内のエントリと一致するときに許可されます。

そうしないと、(デーモン、クライアント)のペアが/etc/hosts.denyファイルのエントリと一致すると、アクセスは拒否されます。

それ以外の場合は、アクセスが許可されます。

存在しないアクセス制御ファイルは、空のファイルであるかのように扱われます。 したがって、アクセス制御ファイルを提供しないことによって、アクセス制御をオフにすることができます。

アクセス制御規則

各アクセス制御ファイルは、0行以上のテキスト行から構成されています。 これらの行は、外観順に処理されます。 一致が見つかると検索が終了します。

改行文字の前にバックスラッシュ文字がある場合、改行文字は無視されます。 これにより、長い行を分割して編集しやすくなります。

空行または `# '文字で始まる行は無視されます。 これにより、コメントと空白を挿入してテーブルを読みやすくすることができます。

他のすべての行は、次の形式を満たす必要があります。[]間のものはオプションです。

daemon_list:client_list [:shell_command]

daemon_listは、1つ以上のデーモンプロセス名(argv [0]値)またはワイルドカード(下記参照)のリストです。

client_listは、クライアントホスト名またはアドレスと照合される1つ以上のホスト名、ホストアドレス、パターン、またはワイルドカード(下記参照)のリストです。

より複雑な形式のdaemon @ hostuser @ hostについては、それぞれサーバーエンドポイントパターンとクライアントユーザー名参照のセクションで説明しています。

リストの要素は空白および/またはコンマで区切る必要があります。

NIS(YP)ネットグループルックアップを除き、すべてのアクセス制御チェックでは大文字と小文字が区別されません。

パターン

アクセス制御言語は、次のパターンを実装します。

`。 'で始まる文字列。 キャラクター。 ホスト名は、その名前の最後の構成要素が指定されたパターンと一致する場合にマッチします。 たとえば、パターン `.tue.nl 'はホスト名` wzv.win.tue.nl'と一致します。

`。 'で終わる文字列。 キャラクター。 最初の数値フィールドが指定された文字列と一致する場合、ホストアドレスは一致します。 たとえば、パターン「131.155」。 アイントホーフェン大学のネットワーク(131.155.xx)のすべてのホスト(ほとんど)のアドレスと一致します。

`@ '文字で始まる文字列はNIS(以前のYP)ネットグループ名として扱われます。 指定されたネットグループのホストメンバーである場合、ホスト名は一致します。 デーモンプロセス名またはクライアントユーザー名では、Netgroup一致はサポートされていません。

`nnnn / mmmm 'という形式の式は` net / mask'の対として解釈されます。 `net 'がアドレスと` mask'のビット単位の論理積と等しい場合、IPv4ホストアドレスはマッチします。 たとえば、ネット/マスクパターン `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ホストアドレスはマッチします。 たとえば、[3ffe:505:2:1 ::] / 64の[net] / prefixlenパターンは、3ffe:505:2:1 ::〜3ffe:505:2: 1:ffff:ffff:ffff:ffff '。

`/ '文字で始まる文字列はファイル名として扱われます 。 ホスト名またはアドレスは、指定されたファイルにリストされているホスト名またはアドレスパターンと一致する場合に一致します。 ファイル形式は0個以上の行で、0個以上のホスト名またはアドレスパターンが空白で区切られています。 ファイル名パターンは、ホスト名またはアドレスパターンを使用できる場所であればどこでも使用できます。

ワイルドカード `* 'と`?' ホスト名またはIPアドレスの照合に使用できます 。 このマッチングの方法は `net / mask 'のマッチング、`。'で始まるホスト名マッチングと組み合わせて使うことはできません。 IPアドレスのマッチングは `。 'で終わります。

ワイルドカード

アクセス制御言語は、明示的なワイルドカードをサポートしています。

すべて

ユニバーサルワイルドカードは常に一致します。

地元

名前にドット文字が含まれていないホストに一致します。

未知の

名前が不明で、名前またはアドレスが不明なホストと一致するすべてのユーザーと一致します。 このパターンは注意して使用する必要があります。一時的なネームサーバーの問題のために、ホスト名を使用できない可能性があります。 ネットワークアドレスは、ソフトウェアがどのタイプのネットワークと通信しているのか把握できない場合は使用できません。

知られている

名前がわかっているすべてのユーザーに一致し、名前住所がわかっているホストに一致します。 このパターンは注意して使用する必要があります。一時的なネームサーバーの問題のために、ホスト名を使用できない可能性があります。 ネットワークアドレスは、ソフトウェアがどのタイプのネットワークと通信しているのか把握できない場合は使用できません。

パラノッド

名前がアドレスと一致しないホストに一致します。 tcpdが-DPARANOID(デフォルトモード)で構築されると、アクセス制御テーブルを調べる前にそのようなクライアントからの要求を削除します。 このような要求をより詳細に制御したい場合は、-DPARANOIDなしでビルドします。

オペレーター

例外

意図された使用の形式は `list_1 EXCEPT list_2 '; list_2にマッチしない限り、 list_1と一致するものにマッチします 。 EXCEPT演算子は、daemon_listsとclient_listsで使用できます。 EXCEPT演算子は入れ子にすることができます。制御言語がかっこの使用を許可する場合、 `EXCEPT b EXCEPT c 'は`(EXCEPT(b EXCEPT c))'として解析されます。

シェルコマンド

最初に一致したアクセス制御ルールにシェルコマンドが含まれている場合、そのコマンドには%置換が適用されます(次のセクションを参照)。 結果は、 / dev / nullに接続された標準入力、出力、エラーを持つ/ bin / sh子プロセスによって実行されます 。 コマンドが完了するまで待たない場合は、コマンドの最後に `& 'を指定してください。

シェルコマンドは、inetdのPATH設定に依存してはいけません。 代わりに、絶対パス名を使用するか、明示的なPATH = whateverステートメントで始める必要があります。

hosts_options (5)のドキュメントでは、シェルコマンドフィールドを異なる互換性のない方法で使用する代替言語について説明しています。

%EXPANSIONS

シェルコマンドでは、次の拡張が利用できます。

%a(%A)

クライアント(サーバー)のホストアドレス。

%c

クライアント情報:利用可能な情報の量に応じて、user @ host、user @ address、ホスト名、またはアドレスのみ。

%d

デーモンプロセス名(argv [0]値)。

%h(%H)

ホスト名が使用できない場合は、クライアント(サーバー)のホスト名またはアドレス。

%n(%N)

クライアント(サーバー)ホスト名(または「不明」または「パラノイド」)。

%p

デーモンプロセスID。

%s

サーバー情報:利用可能な情報の量に応じて、daemon @ host、daemon @ address、または単にデーモン名。

%u

クライアントユーザー名(または「不明」)。

%%

単一の `% '文字に展開されます。

シェルを混乱させる可能性のある%拡張の文字は、アンダースコアで置き換えられます。

サーバーのエンドポイントパターン

接続先のネットワークアドレスでクライアントを区別するには、次の形式のパターンを使用します。

process_name @ host_pattern:client_list ...

マシンが異なるインターネットホスト名を持つ異なるインターネットアドレスを持つ場合、これらのパターンを使用できます。 サービスプロバイダは、この機能を使用して、FTP、GOPHERまたはWWWアーカイブを提供することができます。 hosts_options (5)ドキュメントの `twist 'オプションも参照してください。 いくつかのシステム(Solaris、FreeBSD)は、1つの物理インタフェース上に複数のインターネットアドレスを持つことができます。 他のシステムでは、専用のネットワークアドレス空間に存在するSLIPまたはPPP疑似インターフェイスに頼らざるを得なくなる可能性があります。

host_patternは、client_listコンテキスト内のホスト名およびアドレスと同じ構文規則に従います。 通常、サーバーのエンドポイント情報は、接続指向のサービスでのみ使用できます。

クライアントユーザ名ルックアップ

クライアントホストがRFC 931プロトコルまたはその子孫(TAP、IDENT、RFC 1413)のいずれかをサポートする場合、ラッパープログラムは接続の所有者に関する追加情報を取得できます。 利用可能な場合、クライアントのユーザー名情報は、クライアントのホスト名と一緒に記録され、次のようなパターンの照合に使用できます。

daemon_list:... user_pattern @ host_pattern ...

コンパイル時にデーモンラッパーを設定して、ルール駆動型のユーザー名検索(デフォルト)を実行したり、クライアントホストに常に問い合せたりすることができます。 ルール駆動型のユーザー名検索の場合、上記のルールは、 daemon_listhost_patternの両方が一致した場合にのみユーザー名検索を行います。

ユーザーパターンはデーモンプロセスパターンと同じ構文を持つので、同じワイルドカードが適用されます(netgroupメンバシップはサポートされていません)。 しかし、ユーザー名検索で怒られるべきではありません。

クライアントのユーザー名情報は、最も必要とされるとき、つまりクライアントシステムが侵害されたときに信頼されることはできません。 一般的には、ALLと(UN)KNOWNは理にかなっている唯一のユーザー名パターンです。

ユーザー名の検索は、TCPベースのサービスでのみ可能で、クライアントホストが適切なデーモンを実行している場合にのみ可能です。 それ以外の場合は「不明」となります。

よく知られているUNIXカーネルのバグは、ユーザー名の参照がファイアウォールによってブロックされていると、サービスが失われる可能性があります。 ラッパーのREADME文書には、カーネルにこのバグがあるかどうかを調べるための手順が記載されています。

ユーザー名の参照は、UNIX以外のユーザーに顕著な遅延を引き起こす可能性があります。 ユーザー名参照のデフォルトのタイムアウトは10秒です。遅いネットワークには対応するには時間がかかりませんが、PCユーザーを苛立たせるほど長くなります。

選択的なユーザー名検索は、最後の問題を緩和することができます。 たとえば、次のようなルールがあります。


daemon_list:@pcnetgroup ALL @ ALL

ユーザ名検索を行わずにpcネットグループのメンバーに一致しますが、他のすべてのシステムでユーザ名検索を実行します。

スパミング攻撃を検出する

多くのTCP / IP実装のシーケンス番号ジェネレータの欠陥により、侵入者は信頼できるホストを偽装したり、リモートシェルサービスなどを介して侵入したりすることが容易になります。 IDENT(RFC931など)サービスは、そのようなホストアドレススプーフィング攻撃を検出するために使用できます。

ラッパーは、クライアント要求を受け入れる前に、IDENTサービスを使用して、クライアントが要求をまったく送信しなかったことを知ることができます。 クライアントホストがIDENTサービスを提供する場合、ネガティブIDENT検索結果(クライアントは `UNKNOWN @ host 'と一致します)は、ホストスプーフィング攻撃の強力な証拠です。

正のIDENT検索結果(クライアントは `KNOWN @ host 'にマッチします)は信頼性が低くなります。 侵入者がクライアント接続とIDENTルックアップの両方を偽装する可能性はありますが、クライアント接続だけをスプーフィングするよりもはるかに難しくなります。 また、クライアントのIDENTサーバーが横たわっていることもあります。

注:IDENTルックアップはUDPサービスでは機能しません。

使用例

この言語は柔軟性があり、さまざまなタイプのアクセス制御ポリシーを最小限に抑えることができます。 言語は2つのアクセス制御テーブルを使用しますが、最も一般的なポリシーは、テーブルの1つを些細なもの、または空のもので実装することができます。

以下の例を読むときには、許可テーブルが拒否テーブルの前でスキャンされ、一致が検出されたときに検索が終了し、一致が全く見つからない場合にそのアクセスが許可されることに気づくことが重要です。

例では、ホスト名とドメイン名を使用しています。 アドレスやネットワーク/ネットマスクの情報を含めることで、一時的なネームサーバー検索の失敗の影響を減らすことができます。

ほとんど閉鎖

この場合、アクセスはデフォルトで拒否されます。 明示的に許可されたホストだけがアクセスを許可されます。

デフォルトポリシー(アクセスなし)は、些細な拒否ファイルで実装されています:

/etc/hosts.deny:ALL:ALL

これにより、allowファイルのエントリによるアクセスが許可されていない限り、すべてのホストに対するすべてのサービスが拒否されます。

明示的に許可されたホストは、許可ファイルにリストされます。 例えば:

/etc/hosts.allow:ALL:ローカル@some_netgroup
ALL:.foobar.eduを除いてterminalerver.foobar.edu

最初のルールは、ローカルドメインのホスト(ホスト名の `。 ')とsome_netgroupネットグループのメンバーからのアクセスを許可します。 2番目のルールは、 foob​​ar.eduドメイン内のすべてのホストからのアクセスを許可します(先頭のドットに注意してください)。ただし、 terminalserver.foobar.eduは例外です。

ほとんどオープン

ここでは、デフォルトでアクセスが許可されます。 明示的に指定されたホストだけがサービスを拒否されます。

既定のポリシー(アクセスが許可されている)では、許可ファイルを冗長にして省略することができます。 明示的に許可されていないホストは、拒否ファイルにリストされます。 例えば:

/etc/hosts.deny:ALL:some.host.name、.some.domain
ALL以外のin.fingerd:other.host.name、.other.domain

第1のルールは、いくつかのホストとドメインすべてのサービスを拒否します。 第2のルールは依然として他のホストおよびドメインからのフィンガー要求を許可する。

ブーレー・トラップ

次の例では、ローカルドメインのホストからのtftp要求を許可しています(先頭のドットに注意してください)。 他のホストからの要求は拒否されます。 要求されたファイルの代わりに、フィンガープローブが問題のホストに送信されます。 結果はスーパーユーザーに郵送されます。

/etc/hosts.allow:

in.tftpd:LOCAL、.my.domain /etc/hosts.deny:in.tftpd:ALL:spawn(/ some / where / safe_finger -l @%h | \ / usr / ucb / mail -s%d-% hルート)&

safe_fingerコマンドにはtcpdラッパーが付属しており、適切な場所にインストールする必要があります。 これは、リモートフィンガーサーバによって送信されるデータから起こりうる損傷を制限します。 これは、標準的なfingerコマンドより優れた保護を提供します。

%h(クライアントホスト)と%d(サービス名)シーケンスの拡張については、シェルコマンドのセクションで説明しています。

警告:あなたが無限の指のループの準備ができていない限り、指デーモンをブービートラップしないでください。

ネットワーク・ファイアウォール・システムでは、このトリックをさらに実行することができます。 典型的なネットワークファイアウォールは、外界に対して限られたサービスしか提供しません。 他のすべてのサービスは、上記のtftpの例のように "盗聴"することができます。 結果は、優れた早期警告システムです。

関連項目

tcpd(8)tcp / ipデーモンラッパープログラム。 tcpdchk(8)、tcpdmatch(8)、テストプログラム。

重要: manコマンド( %man )を使用して、特定のコンピュータでコマンドがどのように使用されているかを確認してください。