ホストベースのアクセス制御リスト

TCPラッパーを使用するサービスのホストベースのアクセスは、hosts.allowhosts.denyという2つのによって制御されます。これらのファイルは/etcディレクトリにあり、簡単なフォーマットを使用して、サーバー上の特定のサービスに対する特定のシステムかユーザーによるアクセスを制御します。

デフォルトの規則は、hosts.allowか、あるいはhosts.denyで規則が指定されていない場合は誰にでもアクセスを許可するというものです。hosts.allowの規則は、hosts.denyで指定される規則より優先されます。特定のサービスに対するアクセスをすべて拒否する規則がhosts.denyで定義されている場合でも、hosts.allowでサービスに対するアクセスを特に与えられているホストはアクセスが許可されます。どちらのファイルでも、すべての規則は上から影響を受けるので、規則を記述する順序が重要になります。

これらのファイルを変更すると、関連するサービスは直ちに影響を受けます。サービスを再起動する必要はありません。

規則のフォーマット

アクセス制御の規則は、すべてhosts.allowhosts.denyの行に記述します。空白の行とコメント文字(#)で始まる行は無視されます。1つの行に複数の規則を記述することはできません。

規則のフォーマットは、次のようになります。

<daemon_list>: <client_list>[: <shell_command> ]

これらのオプションは、それぞれ規則の異なる部分を表します。

パターンは、特定のサービスにアクセスするクライアントのグループやアクセスしないクライアントのグループを指定する場合に特に便利です。文字列の先頭を"."にすると、その文字列が名前の末尾となっているすべてのホストにその規則が適用されます。たとえば、.domain.comsystem1.domain.comsystem2.domain.comの両方に適用されます。文字列の最後を"."にした場合は、その文字列で始まる名前のすべてのホストに規則が適用されます。192.168.0.に対応する規則はIPアドレスのクラスCブロック全体に適用されるので、これは主としてIPアドレスに使用されます。ネットマスクの表現も、特定のIPアドレスのグループへのアクセスを制御するパターンとして使用できます。アスタリスク(*)や疑問符(?)を使用してホスト名、あるいはIPアドレスのグループ全体を選択することもできます。ただし、同じ文字列内で他のタイプのパターンと同時に使用することはできません。

特定のサービスにアクセスできるホスト名の一覧が長すぎる場合や、host.allowhosts.denyの中で制御することが困難な場合は、ファイルへのフルパス(/etc/telnet.hosts.denyなど)を指定することもできます。このファイルには、サービスへのアクセスを許可、あるいは禁止するホスト名、ホストアドレス、パターンのどれかを空白で区切って記述します。この方法は、1つのファイルを変更するだけですべてのサービスに対応できるので、複数のサービスでアクセス制御リストを共有する場合にも便利です。

特定のホストかホストのグループを使用する代わりに、以下のワイルドカードをアクセス制御規則で使用できます。

注意重要
 

名前の解決で混乱すると正当なユーザーがネットワークサービスにアクセスできなくなることがあるので、KNOWNUNKNOWNPARANOIDを使用する場合は十分に注意してください。

アクセス制御言語には、1行の規則で別々の一覧を組み合わせられるようにするEXCEPTという強力な演算子もあります。EXCEPTを2つの一覧の間で使用すると、1番目の一覧から2番目の一覧のエントリを除いたものが適用されます。EXCEPTは、デーモンあるいはクライアントの一覧に使用できます。次のhosts.allowの例を考えてみましょう。

# all domain.com hosts are allowed to connect
# to all services except cracker.domain.com
ALL: .domain.com EXCEPT cracker.domain.com

# 123.123.123.* addresses can use all services except FTP
ALL EXCEPT in.ftpd: 123.123.123.

注意注意
 

通常は、EXCEPT演算子は控えめに使用して、他のアクセス制御ファイルで規則の例外を指定する方がよいでしょう。このようにすれば、どの管理者も該当するファイルを調べるだけでサービスへのアクセスを許可するホストか、禁止するホストを知ることができ、さまざまなEXCEPT演算子を調べて該当するロジックを考えるという必要がなくなります。

hosts.allowhosts.denyでアクセス制御を管理する最適な方法は、2つのファイルを共に使用して目的の結果が得られるようにするということです。通常、特定のホストを除くすべてのホストがサービスにアクセスできないようにするには、hosts.denyALL: ALLを記述し、hosts.allowportmap, in.telnetd: 10.0.1.24in.ftpd: 10.0.1. EXCEPT 10.0.1.1などの行を記述して特定のホストのアクセスを許可します。

あるいは、管理者によっては、特定のホスト以外、誰でもネットワークサービスを使用できるようにします。このような場合は、hosts.allowには何も記述せず、in.fingerd: 192.168.0.2などの必要な制限をhosts.denyに記述します。

警告警告
 

ホスト名とドメイン名をアクセス制御ファイル、特にhosts.denyで使用する場合は十分に注意してください。アタッカーはさまざまなトリックを使用して、名前で指定した規則を出し抜くことができます。さらに、ホスト名とドメイン名の情報に基づいて選択的にアクセスを許可するシステムの場合、DNSサービスに問題が発生すると、正当なユーザーでもネットワークサービスを使用できなくなってしまいます。

アクセス制御規則、特にアクセスを拒否する規則を作成するときは、可能な限りIPアドレスを使用すると多くの問題を回避できます。

特定のホストについてサービスへのアクセスを単純に許可するか、禁止するだけでなく、アクセス制御言語では規則を適用するときにシェルコマンドを使用するよう指定することもできます。このようなシェルコマンドは、多くの場合、禁止規則で「ブービートラップ」を設定するために使用されます。通常は、このブービートラップによって、特定のファイルに対するアクセスの失敗に関する情報が記録されるか管理者に電子メールが送信されます。次に示すのはhosts.denyファイルに設定したブービートラップの例で、10.0.1.0〜10.0.1.255の範囲にあるホストがTelnetで接続しようとするたびに日付とクライアントの情報が記録されます。

in.telnetd: 10.0.1.: (/bin/echo `date` %c >> /var/log/telnet.log) &

シェルコマンドでは、関連するクライアント、サーバー、プロセスについての情報を含むさまざまな「拡張表記」を使用できます。

シェルコマンドの詳細やその他のアクセス制御の例については、hosts_access(5) manページを参照してください。

注意注意
 

portmapをホストのアクセス制御リストで使用する場合は、特に注意が必要です。ホスト名がサポートされていないので、許可するか禁止するホストを指定する場合は、IPアドレスかALLオプションしか使用できません。さらに、portmapに関するホストのアクセス制御リストを変更しても、直ちには反映されない場合があります。

NISやNFSなど幅広く使用されているサービスはportmapに依存して運用されているので、hosts.allowhosts.denyで特定のホストによるアクセスを制御する場合は、このような制限に注意してください。