Last Modiffied: 11 Mar 2002
xinetd の設定方法

1.はじめに

■はじめに

今回は、スーパーサーバーと呼ばれる xinetd の設定方法について説明していきます。スーパーサーバーとは、ポート監視用のデーモンプログラムで、あるポートに対してアクセスがあると、設定ファイル (/etc/xinetd.d/ 等) を元にポートに対応したサービス (ftp 等) を起動します。この際、ポートとサービスの関係は、/etc/services によって導かれます。

そして、Linuxでは、以前は、inetd と TCP wrapper(tcpd) の組合せによるアクセス制限が一般的に行なわれてきました。しかし、RedHat Linux 7Jより、inetd の上位互換性を持つ xinetd が標準となり、最近では、多くのディストリビューターが採用するようになりました。

xinetd は、単体で inetd + TCP wrapper(tcpd) の機能を持っているだけでなく、よりきめ細かで自由度の高い設定を行なうことができます。inetd + TCP wrapper(tcpd) と xinetd をおおまかに比較すると、以下の表のようになります。

  TCP wrapper xinetd
ログ 固定 細かく設定可
メール通知 不可
アドレス制御 可変長マスク 固定長マスク
時間による制御 不可
アクセス回数制限 不可
サービスとインターフェイス 切り分け不可 切り分け可
フォワード機能 不可

そこで、今回は、上記のように様々な設定を行なうことが出来る、xinetd の設定方法について説明していきたいと思います。なお、2.1.8.8p3、2.1.8.9pre6、xinetd-2.3.1には、セキュリティホールがあるので、必ず、xinetd-2.3.3 (2002.3.11 現在) にバージョンアップして使用して下さい。セキュリティホールの詳細については、 http://www.xinetd.org を参照して下さい。



2.xinetd の設定ファイル

■xinetd の設定方法

xinetd サービスは、以下の2種類の方法で、設定することが可能です。
  1. /etc/xinetd.conf に全ての設定を記述する。
  2. /etc/xinetd.conf にデフォルトの設定を記述して、個々のサービスの設定ファイルをサブディレクトリ以下に用意し、インクルードする。

■xinetd 設定ファイルの書式

xinetd.conf または、xinetd.d ディレクトリ以下に作成する設定ファイルは、全て、以下のフォーマットで記述します。
service <service_name>
{
    attribute  operator  value
    attribute  operator  value
    ・・・・・・
}
各サーバアプリケーションごとにエントリを作成し、個々のサービスは {  } でくくって、その中にアトリビュート(attribute)を記述します。


■xinetd.conf

xinetd.conf ファイルでの指定は、全てのサービスのデフォルトの設定になり、各サービスでの設定は、このファイルでの設定にオプションを追加、または、削除する形で行ないます。

以下は、RedHat Linux 7.2の xinetd.conf ファイルになります。
defaults
{
    instances              = 60
    log_type               = SYSLOG authpriv
    log_on_success         = HOST PID
    log_on_failure         = HOST
    cps                    = 25 30
}

includedir /etc/xinetd.d
この設定ファイルの内容について説明します。
instances 起動できるデーモンの数を60に指定。
log_type syslogのファシリティレベルで、authpriv を使用するように指定。
log_on_success 接続に成功した場合に、リモートホストのIPアドレスと、リクエストを処理するサーバーのプロセスIDを記録するように指定。
log_on_failure 接続に失敗した場合、または、接続が許可されていない場合に、リモートホストのIPアドレスを記録するように指定。
cps 毎秒ごとに可能な接続数の上限を設定します。最初の引数は、1秒あたりに処理可能なコネクション数を、後の引数は、サービス利用不能となってから、再び利用可能になるまでの時間(秒)を指定。
includedir 指定したディレクトリをインクルードするように設定。

■インクルードファイルの設定

例として、RedHat Linux 7.2 のFTPの設定ファイル(デフォルト)を記述します。なお、アトリビュートについては、必須のものがあるので、必須のものについては必ず記述しなければなりません。
service ftp
{
    socket_type            = stream
    wait                   = no
    user                   = root
    server                 = /usr/sbin/in.ftpd
    server_args            = -l -a
    log_on_success         += DURATION USERID
    log_on_failure         += USERID
    nice                   = 10
    disable                = yes
}
この設定ファイルの内容について説明します。
service 設定するサービスの名前を ftp に指定。
(/etc/services ファイルに定義されたサービス名を指定。)
socket_type サービスが使用するソケットタイプを stream に指定。
wait マルチスレッド no を指定。
user サービスを実行するユーザ名を root に指定。
server 起動するサービスを絶対パスで /usr/sbin/in.ftpd に指定。
server_args サービスに渡す引数に -l と -a を指定。
log_on_success 接続に成功した場合に記録するログの種類を指定。
(xinetd.conf で指定したデフォルトのログ情報に加え、DURATION(周期)、USERID(リモートホストの認証ユーザ名)を指定。)
log_on_failure 接続に失敗した場合に記録するログの種類を指定。
(xinetd.conf で指定したデフォルトのログ情報に加え、USERID(リモートホストの認証ユーザ名)を指定。)
nice ジョブの優先順位を10に指定。
disable サービスの停止を指定。
また、アトリビュートを指定する時に使用する、operator(「=」、「+=」、「-=」)は、以下の意味を表しています。
= 通常使用
+= デフォルトの設定に追加する場合に使用。
-= デフォルトの設定から削除する場合に使用。
なお、記述が必須となっているアトリビュートは以下の通りです。
socket_type
user (/etc/services に記述がない場合のみ)
server (内部サービス以外)
wait
protocol (RPC サービスと /etc/services に記述がない場合のみ)
rpc_version (RPC サービスのみ)
rpc_number (/etc/rpc に記述のないRPC サービスのみ)
port (RPC 以外で、/etc/services に記述がない場合のみ)
<<参考>>
内部サービスとは、echo、time、daytime、chargen、discard といったサービスを指します。なお、type属性は、INTERNALとなります。

■xinetd の起動

xinetd の設定を変更した場合、変更を反映させるためには、xinetd サービスと、変更の影響を受けるサービスを再起動する必要があります。
例えば、FTP の設定を変更した場合には、xinetd サービスを再起動することで変更が反映され、変更後の環境を使用することができるようになります。
# /etc/init.d/xinetd restart
Stopping xinetd:                             [  OK  ]
Starting xinetd:                             [  OK  ]


3.ログに関するアトリビュート

■はじめに

ここからは、指定可能なアトリビュートについて、「ログ」「アクセス制御」「サービス」「その他」に分類して、説明します。この章では、「ログ」に関するアトリビュートの説明をします。

■log_type

ログの出力方法を定義します。「SYSLOG」と「FILE」の2通りの指定をすることが可能です。

SYSLOG  ファシリティ  [レベル]
ファシリティ deamon、auth、authpriv、user、local0-7 のいずれかを指定可能。
レベル emerg、alert、crit、err、warning、notice、info、debug を指定可能。レベルを指定しない場合には、デフォルトで info が摘要される。

なお、SYSLOG の詳細については、http://www.linux.or.jp/JM/html/sysklogd/man5/syslog.conf.5.html を参照して下さい。
FILE  ファイル名  [最大サイズ]  [絶対最大サイズ]
ファイル名で指定するファイルをあらかじめ作成しておく必要があります。

[最大サイズ]に達すると、xinetd は、リミットを越えたというメッセージを記録します。また、SYSLOGにも記録するように設定してある場合には、alert レベルでログに記録します。

[絶対最大サイズ]に達すると、リミットに達したというメッセージを記録して、ロギングを停止します。もし、/var/log/ 配下の他のサービスと共通のログファイルを指定していると、それらのロギングにも影響を与える可能性があります。また、[絶対最大サイズ]を指定しない場合には、デフォルトで[最大サイズ]の1%増しのサイズが適用されます。

また、サービスごとにFILEを作成することで、サービスごとのログファイルを作成することが可能となります。

■log_on_success

サービスが起動した時と、終了した時にログに記録します。以下のオプションをスペースで区切って指定することができます。

PID サービスのプロセスID。
HOST リモートホストのIPアドレス。
USERID リモートホストの認証ユーザ名。このオプションは、マルチスレッドTCPサービスでのみ有効。
EXIT サービスが終了したのか、終了シグナルを受けたのかを記録する。
(PIDオプションと併用すると、プロセスIDも記録される。)
DURATION セッション周期(秒)。

■log_on_failure

サービスが起動しなかった場合に、ログに記録します。サービスのプロセスIDと起動しなかった理由は、常に記録されますが、その他に、以下のオプションをスペースで区切って指定することができます。

HOST リモートホストのIPアドレス。
USERID リモートホストの認証ユーザ名。このオプションは、マルチスレッドTCPサービスでのみ有効。
ATTEMPT 起動に失敗した場合の記録。
RECORD サービスが起動しなかった場合の諸情報を記録。


4.アクセス制御に関するアトリビュート

■disabled

「yes」か「no」を指定します。サービスを起動する場合には、「no」を選択します。

■enabled

引数に指定したサービスのみ使用を可能にします。

■only_from

サービスにアクセス可能なホストを指定します。以下のいずれかの方法で指定が可能です。

192.168.1.0 IPアドレス。最後の8ビットに0を指定して、サブネット全てを指定することも可能。また、0.0.0.0と指定すると、全てのIPアドレスからのアクセスが可能になる。
192.168.1.{1,10} 最後の8ビット目のアドレスを{ } 内にカンマで区切って、一度に複数のIPアドレスを指定できる。
ネットワーク名 /etc/networks に記述されているネットワーク名を指定。
ホスト名 逆引きが可能なホスト名を指定。また、.domain.com と指定すると、ドメインで指定することも可能。
192.168.1.0/28 IPアドレス/ネットマスクの組合せで指定。

■no_access

サービスへのアクセスを許可しないホストを指定します。only_from の場合と同じ方法で指定することが可能です。

■access_times

アクセス可能な時間帯を指定します。8:30-18:00 と指定した場合、8時30分から18時までのアクセスが可能になります。

■cps
毎秒ごとに可能な接続数の上限を設定します。最初の引数は、1秒あたりに処理可能なコネクション数を、後の引数は、サービス利用不能となってから、再び利用可能になるまでの時間(秒)を指定します。
例えば、cps = 10 60 の場合、1秒間の接続数が10を超えると、一度サービスが停止し、60秒後に再開されます。

■instances

同時に動作可能なサービスの最大数を数値で指定します。UNLIMITED を指定すると、制限なしとなります。

■max_load

CPU使用率のしきい値を浮動小数点値で指定します。上限値を上回った場合、サーバーに対する接続要求が拒否されるようになり、一時的にサービスの利用が不可となりますが、DoS攻撃などにより、システム全体がダウンすることを防ぐことができます。

■per_source

同じクライアントからの接続数を制限するために、数値(整数)または、UNLIMITEDを指定します。



5.サービスに関するアトリビュート

■id

同じサービスを違うプロトコルで使用する場合にサービスの名前を定義します。デフォルトは、サービス名と同じ名前が定義されています。

■flags

下記の値を指定することができます。

REUSE ポートが使用中(TIME_WAIT)の場合でも、再利用できるようにします。
INTERCEPT パケット転送を中断し、許可された発信先からきているのかを調べます(マルチスレッド、内部サービスでは使用不可)。
IDONLY リモートホストの認証で、ユーザー名が引ける場合のみ接続を許可します。ログオプションの USERID と併用する必要があります。
NORETRY 認証に失敗した場合、同じサービスへの接続を許可しません。
NAMEINARGS tcpdを使用する場合に、server_arg で指定する変数がサービス(service)へ引数(argv[0]) として渡されます。
NODELAY TCPコネクションの場合、TCP_NODELAY フラグをセットします。
DISABLE enable の設定を上書きして、サービスを使用不可にします。
KEEPALIVE TCPコネクションの場合、キープアライブを適用します。
NOLIBWRAP libwrap を使用しません。

■port

サービスが使用するポート番号を指定します。

■protocol

サービスが使用するプロトコルを指定します。/etc/protocols ファイル内に記述されたプロトコルを指定しますが、この属性の指定がない場合、デフォルトのプロトコルが使用されます。

■server

起動するサービスを絶対パスで指定します。

■server_arg

server が使用する引数を指定します。

■socket_type

ソケットの種類を指定します。指定の際には、下記の値を指定することができます。

stream TCP
dgram UDP
raw IPダイレクトアクセス
seqpacket sequenced packet

■wait

シングルスレッド/マルチスレッドによって「yes」か「no」を選択します。

yes シングルスレッドサービス(サービスを起動したら、プロセスを終了するまで次の接続を受付けない)。
no マルチスレッドサービス(サービスを起動したら、リミットに達するまで次の接続を待つ)。

■nice

ジョブの優先順位を指定します。値が小さいほど優先順位が高くなります。
Linuxでは、最高:-20、最低:19の範囲で指定可能です。



6.その他のアトリビュート

■type

以下の3つのタイプを指定できます。

RPC /etc/rpc ファイル用
INTERNAL 内部向けサービス
UNLISTED /etc/rpc、/etc/services ファイルに記述のないサービスを扱う。

■env

"name=value" の形式で、サービスを起動する前に読み込ませる環境変数を指定します。サービスに特に必要なライブラリなどを絶対パスで指定して、xinetd で指定した環境変数に、ここで設定した環境変数を追加することができます。

■passenv

サーバに渡される環境変数をリストします。この値が空だとサーバには何も渡されません。

■redirect

TCPサービスを他のホストにリダイレクトすることができます。指定したポートへのTCPサービス要求を受けると、指定するホストへ接続してデータを転送します。書式は、以下の通りです。
redirect = (IP address) (Port)
なお、このオプションを使う場合、「server」オプションを指定すると、「server」オプションが優先されるので、指定する必要はありません。

■bind

複数のIPアドレスを持つホスト上で、各IPアドレスごとにサービスを提供できるように指定できます。この設定により、例えば、グローバルIPとプライベートIPを持つサーバで、同じサービスを異なるIPアドレスで提供できるようになります。
bind = (IP address)

■interface

bindと同意です。

■banner

リモートホストから接続要求があった場合に表示するバナーファイルをフルパスで指定します。
このオプションでは、許可・拒否の場合ともに同じファイルを表示します。

■banner_success

リモートホストからの接続要求が許可された場合に表示するバナーファイルをフルパスで指定します。

■banner_fail

リモートホストからの接続要求が拒否された場合に表示するバナーファイルをフルパスで指定します。

■user

サービスが実行されるときのUIDを指定します。ユーザーは、/etc/passwd に登録されていなくてはいけません。また、xinetd のUIDがスーパーユーザーでないと指定は無効になります。

■group

サービスが実行されるときのGIDを指定します。グループは、/etc/group に登録されていなくてはいけません。なお、GIDを指定しないと、ユーザが属するグループが適用されます。

■include

新しい設定ファイルをインクルードすることができます。ただし、このオプションは、個々のサービスの中で指定することはできません。

■includedir

サービスごとの xinetd の設定ファイルを置くディレクトリをインクルードします。

■rlimit_as

サービスごとの最大アドレス空間をバイト値で指定します(Linuxのみ)。
設定には、K(=KB)、M(=MB)、UNLIMITEDも指定可能です。

■rlimit_cpu

サービスが使用可能なCPU の最大時間を秒で指定します。
設定には、UNLIMITEDも使用可能です。

■rlimit_data

サービスの最大データサイズをバイト値で指定します。

■rlimit_rss

サービスの最大常駐可能数をバイト値で指定します。搭載しているメモリが少なく、スワップが発生しやすい場合などに有効な設定です。
設定には、UNLIMITEDも使用可能です。

■rlimit_stack

サービスの最大スタックサイズをバイト値で指定します。
設定には、UNLIMITEDも使用可能です。

■rpc_version

RPCのバージョンを指定します。

■rpc_number

サービスにないRPCサービスナンバーを指定します。



7.bind と redirect アトリビュートについて

■はじめに

xinetd の設定ファイルでは、特定のIPアドレスにサービスをバインドすることや、受信したリクエストを別のIPアドレスや、ホスト、ポートにリダイレクトすることができます。

そこで、最後に、bindアトリビュート、redirectアトリビュート、両者を組み合わせた場合と、それぞれの簡単な設定例を紹介したいと思います。


■bind アトリビュート

ネットワークカードを2枚挿入したサーバ上で、FTPなどのサービスを提供する場合、bindアトリビュートを使用して、異なるIPアドレスを1つのサービスに結びつけることができます。ここでは、idアトリビュートを使用して、各ネットワークカードごとに異なったサービスを提供する場合の設定例を紹介します。
service ftp
{
  id                = ftp-public
  socket_type       = stream
  wait              = no
  user              = root
  server            = /usr/sbin/in.ftpd
  server_args       = -l -a
  log_on_success    += DURATION USERID
  log_on_failure    += USERID
  instances         = 4
  only_from         = 0.0.0.0/0
  bind              = 10.0.0.1
  access_times      = 9:00-17:30
}

service ftp
{
  id                = ftp-local
  socket_type       = stream
  wait              = no
  user              = root
  server            = /usr/sbin/in.ftpd
  server_args       = -l -a
  log_on_success    += DURATION USERID
  log_on_failure    += USERID
  only_from         = 192.168.0.1/24
  bind              = 192.168.0.1
}

■redirect アトリビュート

redirectアトリビュートを指定すると、xinetd を透過プロキシのようにして、サービスに対する要求を同じサーバー上の別のポート、同じサーバー上の別のIPアドレス、または、他のホストの特定のポートに送ることが可能となります。ここでは、FTPサービスをリダイレクトする場合の具体例を以下に示します。
service ftp
{
  socket_type       = stream
  wait              = no
  user              = root
  server            = /usr/sbin/in.ftpd
  server_args       = -l -a
  log_on_success    += DURATION USERID
  log_on_failure    += USERID
  only_from         = 192.168.0.0/24
  redirect          = 192.168.0.100 21
}

■bind、redirect アトリビュート

bindアトリビュートと、redirectアトリビュートは、両者を組み合わせて指定することで、その長所を十分に発揮できるようになります。
ここでは、FTPサービスを、特定のIPアドレス (10.0.0.1) で提供(バインド)し、ローカル環境にあるFTPサーバ (192.168.0.1) にサービスを転送(リダイレクト)する場合の、設定例を紹介します。
service ftp
{
  socket_type       = stream
  wait              = no
  user              = root
  server            = /usr/sbin/in.ftpd
  server_args       = -l -a
  log_on_success    += DURATION USERID
  log_on_failure    += USERID
  bind              = 10.0.0.1
  redirect          = 192.168.0.1
}



8.改版履歴

■改版履歴

2002/03/11 初版作成

BACKUP