22.14. inetd “スーパサーバ”

寄稿: Chern Lee.

22.14.1. 概観

inetd(8) は複数のデーモンに対する接続を制御するので、 “インターネットスーパサーバ” と呼ばれます。 ネットワークサービスを提供するプログラムは、 一般的にデーモン呼ばれます。inetd は他のデーモンを管理するサーバを努めます。 接続が inetd によって受け付けられると、 inetd は接続がどのデーモンに対するものか判断して、 そのデーモンを起動し、ソケットを渡します。 inetd を 1 つ実行することにより、 それぞれのデーモンをスタンドアロンモードで実行することに比べ、 全体としてのシステム負荷を減らします。

基本的に、inetd は他のデーモンを起動するために使用されます。しかし、 chargen, auth および daytime のようなささいなプロトコルは直接扱われます。

この節ではコマンドラインオプションおよび設定ファイル /etc/inetd.conf による inetd の設定の基本を説明します。

22.14.2. 設定

inetd/etc/rc.conf の仕組によって初期化されます。 デフォルトでは inetd_enable オプションは “NO” に設定されています。 しかし多くの場合、sysinstall でセキュリティプロファイルを medium に設定することにより、有効化されます。

inetd_enable="YES"
または
inetd_enable="NO"
/etc/rc.conf に置くことで、起動時に inetd を有効または無効にできます。

さらに inetd_flags オプションによって、 いろいろなコマンドラインオプションを inetd に渡すことができます。

22.14.3. コマンドラインオプション

inetd 書式

inetd [-d] [-l] [-w] [-W] [-c maximum] [-C rate] [-a address | hostname] [-p filename] [-R rate] [configuration file]

-d

デバッグモードにします。

-l

成功した接続のログをとります。

-w

外部サービスに対して TCP Wrapper を有効にします (デフォルト)。

-W

inetd 組み込みの内部サービスに対して TCP Wrapper を有効にします (デフォルト)。

-c maximum

サービス毎に同時に起動可能な最大値のデフォルトを指定します。 デフォルトでは無制限です。サービスごとに指定する max-child パラメータで上書きできます。

-C rate

1 分間にひとつの IP アドレスから起動されるサービスの、 最大値のデフォルトを指定します。デフォルトは無制限です。 サービスごとに指定する max-connections-per-ip-per-minute パラメータで上書きできます。

-R rate

あるサービスを 1 分間に起動できる最大の数を指定します。 デフォルトは 256 です。rate に 0 を指定すると、 起動可能な数は無制限になります。

-a

バインドする IP アドレスを一つ指定します。 代わりにホスト名も指定できます。この場合、ホスト名に対応する IPv4 または IPv6 アドレスが使用されます。通常 inetdjail(8) 内で起動される時点で、ホスト名が指定されます。この場合、 ホスト名は jail(8) 環境に対応するものです。

ホスト名指定が使用され、 IPv4 および IPv6 両方にバインドしたい場合、 /etc/inetd.conf の各サービスに対して、 各バインドに対する適切なプロトコルのエントリが必要です。 たとえば TCP ベースのサービスは、 ひとつはプロトコルに “tcp4” を使用し、 もう一つは “tcp6” を使用する、 2 つのエントリが必要です。

-p

デフォルトとは異なる PID を保持するファイルを指定します。

/etc/rc.conf 内の inetd_flags オプションを用いて、これらのオプションを inetd に渡すことができます。デフォルトでは inetd_flags は “-wW” に設定されており、 これは inetd の内部および外部サービスに対して TCP wrapper を有効にします。 初心者ユーザはこれらのパラメータを変更する必要は通常ありませんし、 /etc/rc.conf に入力する必要もありません。

注意: 外部サービスは、接続を受け取ったときに起動される inetd の外部にあるデーモンで、 それに対して、内部サービスは inetd 自身が提供する内部のデーモンです。

22.14.4. inetd.conf

inetd の設定は /etc/inetd.conf ファイルによって制御されます。

/etc/inetd.conf が変更されたときは、 以下のように inetd プロセスに HangUP シグナルを送ることにより、inetd に設定ファイルを再読み込みさせられます。

例 22-4. inetd への HangUP シグナル送付

# kill -HUP `cat /var/run/inetd.pid`

設定ファイルのそれぞれの行は、 個々のデーモンについての指示になります。 ファイル内のコメントは “#” が先頭につきます。 /etc/inetd.conf の書式は以下のとおりです。

service-name
socket-type
protocol
{wait|nowait}[/max-child[/max-connections-per-ip-per-minute]]
user[:group][/login-class]
server-program
server-program-arguments

IPv4 を利用する ftpd デーモンのエントリの例です。

ftp     stream  tcp     nowait  root    /usr/libexec/ftpd       ftpd -l
service-name

これは特定のデーモンのサービス名です。 これは /etc/services 内のサービスリストに対応していなければなりません。 これは inetd がどのポートで受け付けなければならないかを決定します。 新しいサービスが作成された場合、まずはじめに /etc/services 内に記載しなければなりません。

socket-type

stream, dgram, raw または seqpacket のどれかを指定します。 stream はコネクションに基づいた TCP デーモンに使用しなければならず、 一方で dgram は UDP 転送プロトコルを利用したデーモンに対して使用されます。

protocol

次のうちのどれか 1 つを指定します。

プロトコル 説明
tcp, tcp4 TCP IPv4
udp, udp4 UDP IPv4
tcp6 TCP IPv6
udp6 UDP IPv6
tcp46 TCP IPv4 および v6 の両方
udp46 UDP IPv4 および v6 の両方
{wait|nowait}[/max-child[/max-connections-per-ip-per-minute]]

wait|nowaitinetd から起動したデーモンが、 自分のソケットを管理できるかどうかを示します。 通常マルチスレッド化されている stream ソケットデーモンは nowait を使用するべきである一方、 dgram ソケットタイプは wait オプションを使用しなければなりません。 nowait は新しいソケット毎に子のデーモンを起動する一方で、 wait は通常複数のソケットを 1 つのデーモンに渡します。

inetd が起動できる子のデーモンの最大数は max-child オプションで設定できます。 特定のデーモンに対して、起動する数が 10 までという制限が必要な場合、 nowait の後に /10 を置きます。

max-child に加えて、他にある 1 つの場所から特定のデーモンへの最大接続数を制限するオプションが利用できます。 max-connections-per-ip-per-minute がそれです。ここに 10 を指定すると、特定の IP アドレスからの特定のサービスへの接続を 1 分間につき 10 回に制限します。 これは故意または故意でない資源の浪費および、 マシンへのサービス不能 (DoS) 攻撃を防ぐのに有用です。

wait または nowait はこの欄に必ず必要です。 max-child および max-connections-per-ip-per-minute は任意です。

max-child または max-connections-per-ip-per-minute 制限をかけない stream タイプのマルチスレッドデーモンの設定は nowait になります。

作成できる子プロセスの上限が 10 である同じデーモンの設定は nowait/10 になります。

さらに、 1 分間に IP アドレスあたりの接続制限が 20、 子プロセスの上限が 10 である同じデーモンの設定は nowait/10/20 になります。

以下のように、これらのオプションはすべて fingerd デーモンのデフォルト設定に使われています。

finger stream  tcp     nowait/3/10 nobody /usr/libexec/fingerd fingerd -s
user

user はあるデーモンが実行するときのユーザ名を指定します。 一般的にデーモンは root ユーザとして実行します。セキュリティを考慮して、 いくつかのサーバは daemon ユーザ、 または最低の権限が与えられている nobody ユーザとして実行することも多く見られます。

server-program

接続を受け取ったときに実行するデーモンのフルパスです。 デーモンが inetd によって内部的に提供されるサービスの場合 internal を使用します。

server-program-arguments

ここには、起動するときにデーモンに渡される、 argv[0] から始まる引数を指定して、 server-program と協調して動作します。 mydaemon -d がコマンドラインの場合、 server program arguments の値に mydaemon -d を指定します。 また、デーモンが内部サービスの場合、ここに internal を指定します。

22.14.5. セキュリティ

インストールの時に選択したセキュリティプロファイルによっては、 多くの inetd のデーモンがデフォルトで有効になっているかもしれません。 あるデーモンが特に必要でない場合には、それを無効にしてください! 問題となっているデーモンが記述されている行の先頭に “#” をおいて inetd にハングアップシグナルを送ってください。 fingerd のようないくつかのデーモンは、 動かそうとすべきではないかもしれません。なぜなら、 それらは攻撃者に対してあまりにも多くの情報を与えるからです。

セキュリティをあまり考慮せず、 接続試行に対してタイムアウトまでの時間が長いか、 タイムアウトしないデーモンもあります。 これは、特定のデーモンに攻撃者がゆっくり接続要求を送ることによって、 利用可能なリソースを飽和させることを可能にします。ある種のデーモンに ip-per-minute および max-child 制限を設けることはよい考えかもしれません。

TCP wrapper はデフォルトで有効です。 inetd から起動されるさまざまなデーモンに対して TCP 制限を設けることの詳細については hosts_access(5) マニュアルページを参照してください。

22.14.6. その他

daytime, time, echo, discard, chargen および auth はすべて inetd が内部的に提供するサービスです。

auth サービスは identity (ident, identd) ネットワークサービスを提供し、 ある程度設定可能です。

詳細については inetd(8) マニュアルを参照してください。

本文書、および他の文書は ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/ からダウンロードできます。

FreeBSD に関する質問がある場合には、ドキュメント を読んだ上で <questions@FreeBSD.org> まで (英語で) 連絡してください。
本文書に関する質問については、<doc@FreeBSD.org> まで電子メールを (英語で) 送ってください。