xinetd FAQ

著者: Rob Braun

日本語訳: yomoyomo


xinetd って何?
僕はシステム管理者じゃないんだけど、inetd の代わりになるものについて、僕が何か注意することってあるの?
それ inetd と互換性あるの?
なぜ僕がそれを使うべきなの?
誰に対してこのプログラムの感謝/文句を言うべきなのかな?
xinetd のバージョン 2.2.1 はどうしたのですか?
どこで、最新で最高のバージョンを入手できるの?
qmail を xinetd と協調して動かすことは可能なの?
xinetd ってどのプラットフォーム上で動くの?
あるサービスについて、chroot 環境を設定する方法はある?
itox ってどのように使うの?
xinetd は libwrap (tcpwrappers) をサポートしているの?
xinetd は IPv6 をサポートしてる?
どのサービスも IPv6 では動かないぞ! どうしてなの?
setgroups(0, NULL) エラーって何?
どうして Linux だと普通、telnetd が起動しないわけ?
xinetd を使って、SSL でサービスを包むにはどうするの?
xinetd で CVS サーバを立ち上げるにはどうするの?

Q. xinetd って何?

A. xinetd は inetd の代わりになるもので、インターネットサービスのデーモンです。

Q. 僕はシステム管理者じゃないんだけど、inetd の代わりになるものについて、僕が何か注意することってあるの?

A. xinetd は、単なる inetd の代わりではありません。xinetd だと、設定ファイルで指定するサービスが、/etc/services のリストにあるものである必要がないので、誰もが xinetd を利用して、特権ポート(privileged port)を必要としないサーバを起動することができるようになります。

Q. それ inetd と互換性あるの?

A. いいえ、設定ファイルは inetd の設定ファイルとフォーマットが違いますし、異なる命令を扱います。しかし、命令と動作の割り当ては変更可能ですし、inetd.conf を xinetd.conf に変換するプログラムが収録されています。

Q. なぜ僕がそれを使うべきなの?

A. なぜってそれが inetd よりもかなり優れものだから(私見によれば)。以下に根拠を挙げておきます。

1) xinetd は、全サービスについて、以下の項目の内容を基にアクセス制御を行える。
a. リモートホストのアドレス
b. アクセスする時間帯
c. リモートホストの名前
d. リモートホストのドメイン名
2) アクセス制御が、マルチスレッドでもシングルスレッドでも、また TCP と UDP のいずれに関わらず、全てのサービスについて機能します。すべての UDP パケットを、あらゆる TCP コネクションと同じ様に検査することが可能です。
3) xinetd は強力な再読みこみ機能を提供します。
a. 設定ファイルから削除したサービスについて、接続中のサーバを kill する
b. アクセス制御基準に満たなくなったサーバを kill する
4) xinetdは、以下の手段によりサービス拒否攻撃を防ぐことが可能。
a. 各サービスについて、起動するサーバの上限数を指定(プロセステーブルのオーバーフローを回避)
b. fork 可能なプロセスの上限を指定
c. xinetd が作成するログファイルのサイズの上限を指定
d. 一つのホストで開始可能なコネクションの数の上限を指定
e. 1秒間に許容できるコネクションの上限を指定
f. 負荷が指定された上限を越える場合には、サービスを中止
5) 広範囲にわたるロギング機能
a. 起動したどのサーバについてもロギング可能な項目
i) そのサーバが起動した時間
ii) リモートホストのアドレス
iii) リモートユーザの識別(相手がRFC-931/RFC-1413サーバ(訳注:Identプロトコルサーバ)を動かしている場合)
iv) サーバが稼働していた期間

(i、ii、そして iii については、失敗したログインアクセスについても記録可能)

b. 一部のサービスについては、アクセス制御が失敗する場合、そのアクセス試行についての情報をロギング可能(例えば、そのユーザ名や rsh サービスに関しては、試行されたユーザ名やコマンドをロギング可能)
6) サーバ引数の数に制限がない
7) 特定のサービスを、あなたのホストマシン上の特定IPアドレスに割り当て可能

Q. 誰に対してこのプログラムの感謝/文句を言うべきなのかな?

A. 元々は panos@cs.colorado.edu がこのプログラムを書いたのですが、現時点では僕がバグレポートをさばいています。

Q. xinetd のバージョン 2.2.1 はどうしたのですか?

A. xinetd の最も最近に出たオリジナルバージョンは、2.1.1で、これにパッチをあてて2.1.8に上げることができました。Nick Hilliard が、Panos により作られたが公開されなかった xinetd 2.2.0 を基にせずに 2.2.1 を作りました。xinetd に関する著作権は、xinetd の公式リリース版(この場合、2.1.8)であるのに必要なバージョンを特定し、四番目のバージョン番号が修正レベルを示すために付くことになりました。これは僕が採用したバージョン表記法です。ここで入手可能な xinetd 2.1.8.X は、xinetd 2.2.0 やそれ以降のバージョンのものを基にしていません。僕は xinetd-2.2.1 に入っている機能の一部を再実装はしていますが、xinetd 2.1.8.X は、xinetd 2.1.8 のコードベースから作られたものです。

Q. どこで、最新で最高のバージョンを入手できるの?

A. xinetd のソースは、http://www.synack.net/xinetd から入手可能。

Q. qmail を xinetd と協調して動かすことは可能なの?

A. はい、以下に qmail 用のエントリ情報を書いておきます

service smtp
{
        flags           = REUSE NAMEINARGS
        socket_type     = stream
        protocol        = tcp
        wait            = no
        user            = qmaild
        server          = /usr/sbin/tcpd
        server_args     = /var/qmail/bin/tcp-env -R /var/qmail/bin/qmail-smtpd
}

Contributed by: Anthony Abby

この手法により、環境変数やその他もろもろを /etc/hosts.allow に設定できます。xinetd は libwrap と一緒にコンパイルできますが、それは xinetd が tcpd の機能を完全に置き換えることが可能であるということではありません。xinetd は host_access() をコールしますが、これは host_access(5) の man ページに記述されているアクセス制御を実行するものです。これは tcpd により提供される機能のサブセットです。

Q. xinetd ってどのプラットフォーム上で動くの?

A. 僕が動かした分では、Solaris 2.6 (sparc と x86)、Linux、BSDi、そして IRIX 5.3 と 6.2。オリジナルのパッケージは、SunOS 4 と Ultrix 上で動きました。

Q. あるサービスについて、chroot 環境を設定する方法はある?

A. 以下に設定ファイルに入れるエントリ情報を示しておきます。

service telnet_chroot
{
        log_on_success  = HOST PID DURATION USERID
        log_on_failure  = HOST RECORD USERID
        no_access       = 152.30.11.93
        socket_type     = stream
        protocol        = tcp
        port            = 8000
        wait            = no
        user            = root
        server          = /usr/sbin/chroot
        server_args     = /var/public/servers /usr/libexec/telnetd
}

Contributed by: lburns@sasquatch.com

Q. itox ってどのように使うの?

itox は標準入力から普段使用している inetd.conf を読みこみ、標準出力に xinetd.conf を吐き出します。通常、以下のようにコマンドを使用します。

itox < /etc/inetd.conf > /etc/xinetd.conf

もしあなたのところの inetd.conf が各デーモンの明示的なパスを設定してないなら、-daemon_dir オプションを利用しないといけません。全てのデーモンが /usr/sbin にあると仮定すると、コマンドは以下のようになります。

itox -daemon_dir=/usr/sbin < /etc/inetd.conf > /etc/xinetd.conf

itox はやや古く、しばらくアップデートされていません。xconv.pl が、より最近の inetd.conf ファイルを変換するのに良い perl スクリプトです。その使い方は、itox と同様です。

Q. xinetd は libwrap (tcpwrappers) をサポートしているの?

A. はい、xinetd は configure スクリプトを --with-libwrap をオプションにして走らせることで、libwrap をサポートするようにコンパイルできます。xinetd が libwrap をサポートするようにコンパイルされる場合、全てのサービスで /etc/hosts.allow と /etc/hosts.deny によるアクセス制御を利用できます。xinetd はまた、伝統的な inetd スタイルで tcpd を利用するよう設定することも可能です。それには NAMEINARGS フラグの利用する必要があって、実際のデーモンの名前は、server_args パラメータにより渡されます。以下に tcpd から telnet を利用する場合の例を示しておきます。

service telnet
{
        flags       = REUSE NAMEINARGS
        protocol    = tcp
        socket_type = stream
        wait        = no
        user        = telnetd
        server      = /usr/sbin/tcpd
        server_args = /usr/sbin/in.telnetd
}

Q. xinetd は IPv6 をサポートしてる?

A. はい、xinetd は configure スクリプトに --with-inet6 オプションを付けて走らせてからコンパイルすることで、IPv6 をサポートするようにできます。その場合アクセス制御が IPv6 で機能します。あなたはアクセス制御をするのに ipv4 にマッピングされたアドレスを利用するか、通常のドットで区切られた IPv4 アドレスを与えることができ、またそうすれば、xinetd はそのアドレスを IPv6 アドレスにマッピングします。

Q. どのサービスも IPv6 では動かないぞ! どうしてなの?

A. IPv6 サポートを入れるようにコンパイルする場合、全てのソケットは IPv6 用ソケットになります。もしあなたのカーネルが、IPv6 ソケットの何たるかを理解しなければ、ソケットを作成しようとすると全て失敗してしまいますので、どのサービスも起動しません。つまり、あなたの利用しているカーネルが IPv6 をサポートしている場合にだけ、IPv6 サポートをオンにして xinetd をコンパイルするようにしてください。

Q. setgroups(0, NULL) エラーって何?

A. デフォルトでは、xinetd はグループのパーミッションをサーバのプロセスに対して許可せず、子プロセスのグループを nothing にすることでパーミッションを許可します。一部の BSD では、これで問題が発生します。このエラーを回避するには、「groups = yes」というディレクティブをあなたが利用したいサービスに入れてください。これにより、サーバプロセスは、全てのグループ特権を、サーバプロセスが稼動しているユーザに与えます。

Q. どうして Linux だと普通、telnetd が起動しないわけ?

A. 一部の Linux ディストリビューションでは、telnet デーモンは非特権ユーザとして起動しますが、そのユーザは telnet デーモンが新しい tty を開き、utmp を更新することができるグループに属します。デフォルトでは、xinetd はグループパーミッションをサーバプロセスに許可しないので、telnetd は当然起動に失敗することになります。サーバプロセスが適当なグループを持つようにさせるには、telnet サービスについては、「groups = yes」というディレクティブを利用してください。これは、xinetd にサーバプロセスが、ユーザが利用するすべてのグループで起動できるように指定します。

Q. xinetd を使って、SSL でサービスを包むにはどうするの?

A. stunnel プログラムを利用して、SSL でサービスを包んでください。これは実際には、inetd を利用することも可能です。

Q. xinetd で CVS サーバを立ち上げるにはどうするの?

A. あるユーザが、以下の書き方を提案してくれました。

cvspserver  stream tcp nowait root /usr/bin/cvs cvs --allow-root=/home/pauljohn/cvsroot  --allow-root=/home/pauljohn/cvsmisc pserver

もしあなたが xinetd の元で同じ動作を実現したいなら、/etc/xinetd.d の中に cvspserver という名前の設定ファイルをセーブすることになります(最後の行で、あなたのレポジトリの名前を指定します)。

service cvspserver
{
        socket_type         = stream
        protocol            = tcp
        wait                = no
        user                = root
        passenv             =
        server              = /usr/bin/cvs
        server_args         = --allow-root=/home/pauljohn/cvsroot --allow-root=/home/pauljohn/cvsmisc pserver
}

他の CVS 設定もすべて同様になります。僕の知る限り、これで動いてくれるようです。


以上の文章は、Rob Braun による xinetd FAQ の日本語訳である。


[翻訳文書 Index] [TOPページ]


初出公開: 2002年03月18日、 最終更新日: 2002年04月01日
著者: Rob Braun
日本語訳: yomoyomo (E-mail: ymgrtq at yamdas dot org)