スーパーサーバー(xinetd)の設定

 スーパーサーバーとは、サーバーはクライアントからのサービスの要求を常に受付けれるように、ポートの監視する為プロセスがメモリーとCPUの中に常駐しておかないといけません。 なのでCPUとメモリーが常に消費されていると効率悪いので、ポートの監視を一括で行い必要に応じてデーモンを起動する役割をしてくれるのがスーパーサーバーです。(デーモンのためのデーモンって感じです。)
 ここでは”xinetd”のソースからコンパイルしたプログラムを使用します。

 Plamo Linux で使用されていたため、inetd の設定ファイルの覚書を追加しました。

≪ 項目 ≫
1.xinetdとは
2.xinetdのインストール
3.xinetdの設定
4.xinetdの補足
5.inetdの設定
6.inetdの補足

 1.xinetdとは

 上でも少し記述しましたが、xinetd とは、各デーモンを監視してCPUとメモリーの消費を抑え、セキュリティとアクセス制御のプログラムです。以下に主な機能を説明します。

  クライアントからのコネクションの要求を受けて、それに対応したデーモンを起動し、コネクションが無い時は停止させる為、CPUとメモリーに無駄が無くなる。 ただし、要求を受けたあとそのつど初期処理が必要なため、スタンドアロンプロセス( xinetd 経由で動作せず、CPUとメモリーに常駐しているプロセス)に比べると処理は遅くなります。

  xinetd 経由でデーモンを起動していた場合、何らかの理由でそのプロセスが落ちてしまっても、 xinetd が再起動してくれます。

  IPアドレスによる制御。各デーモンごとにIPアドレスによるアクセス制御ができます。

  運用上の問題として、xinetd は、管理者が知らないうちに不必要なサービスを起動している場合があります。


 2.xinetdのインストール

 ◆ インストール

 まずは xinetd をインストールします。
 使用するパッケージとプログラムです。

 tcp_wrappers-7.6-18.i586.rpm ( xinetd をインストールする際必要です。)
 xinetd-2.3.13.tar.gz
   2004/10/03 時点での最新のVersionです。

 ”xinetd”のソースは以下の xinetd のホームページからダウンロードしてきてください。

 http://www.xinetd.org/

 ダウンロードしてきたソースを”/usr/local/src”のディレクトリィにコピーして解凍します。

[root@localhost /usr/local/src]# tar zxvf xinetd-2.3.13.tar.gz

 解凍したら”/usr/local/src/xinetd-2.3.13”というディレクトリィが作成されますので、カレントを移動してコンパイルします。
 configure を使用しますが以下の様なオプションがあります。
  --with-libwrap:tcpdの設定ファイル”/etc/hosts.allow”と”/etc/hosts.deny”を参照するようになります。
  --with-loadavg:DoS攻撃を堰き止めるようになります。
  --with-inet6:IPv4とIPv6の両方に対応できます。

このサイトでは”--with-libwrap”と”--with-loadavg”に対応させてコンパイルをします。
以下の様にコマンドを実行していきます。

[root@localhost /usr/local/src/xinetd-2.3.13]# ./configure --with-libwrap --with-loadavg
[root@localhost /usr/local/src/xinetd-2.3.13]# make
[root@localhost /usr/local/src/xinetd-2.3.13]# make install

 これで”/usr/local/sbin/xinetd”というプログラムがインストールされていますので以下の様にして起動します。

[root@localhost /usr/local/sbin/]# ./xinetd &

 終了する時は”kill”コマンドで終了します。(ps コマンドでPIDを確認して kill します。)


 3.xinetdの設定

 xinetd の設定ファイルは標準では”/etc/xinted.conf”というファイルと”/etc/xinted/”のディレクトリィ直下になります。  ”/etc/xinted.conf”がメインの設定ファイルです。以下が”/etc/xinted.conf”の初期の内容です。

#
# Simple configuration file for xinetd
#
# Some defaults, and include /etc/xinetd.d/

defaults <<--(1)
{
 instances = 40 <<--(2)
 log_type = SYSLOG authpriv
 log_on_success = HOST USERID PID
 log_on_failure = HOST USERID
}

# Don't remove following line. The directory "/etc/xinetd.d" includes
# configuration files controlled by /sbin/chkconfig .

includedir /etc/xinetd.d <<--(3)


 書式としては

<< サービス名 Or defaults >> {
  << 設定項目 >> = << 項目の値 >>
  ・・・・
}


 となっています。 (1) の部分で何のサービスに対して設定かを宣言し、 (2) の部分の { 〜 } の中で各のサービスに対してのオプションを設定します。 この xinetd.conf では defaults となっていますが、defaults { 〜 } の中で定義しているの部分は全てのサービスに対して基本設定となります。
 (1) のサービス名は何でも良いのですが、基本は”/etc/services”に書かれているサービスを使用します。書かれていないサービスを使用する場合は、必須となる設定項目がでてきます。
 (3) の様に includedir << パス >> とすると、指定したパスの直下が xinetd の設定ファイルとしてインクルードされます。


主なオプション(設定項目及び項目の値)の説明は下に掲載します。

設定項目説明
必須項目
socket_type  stream(TCP)、dgram(UDP) など指定します。
user  サービスを動作する実効ユーザーを指定します。ただし”/etc/passwd”に実在する必要があります。
server  起動するサービスのプログラム名をフルパスで指定します。
(引数を指定する場合は server_arg で指定します。)
wait  シングルスレッド/マルチスレッド を yes / no 選択します。
(yes シングルスレッド、no マルチスレッド)
 一般的には socket_type が stream の場合はマルチスレッドが可能で、dgram の場合はシングルスレッド動作のみです。
protocol  使用するプロトコルを指定します。”/etc/services”に無いサービスの場合のみ必須になります。
 省略した場合”/etc/services”から参照します。
port  使用する TCP、UDP のポートを指定します。”/etc/services”に無いサービスの場合のみ必須になります。省略した場合”/etc/services”から参照します。
ログ出力系(defaultsの中で設定すると全サービスに反映しますので便利です。)
log_type  ログの出力タイプを指定します。SYSLOG か FILE か指定できます。書式は以下の通りです。
 SYSLOG を指定した場合 syslog を通してログを出力します。
 FILE 指定したファイルにログを出力します。ただし該当するファイルはあらかじめ作成しておく必要があります。
 各書式は以下の通りです。

log_type = SYSLOG << ファシリティ >> << レベル >>
 ファシリティ及びレベルは syslogd(システムロガー)と同じ値です。レベルは省略すると info に設定されます。
log_type = FILE << ファイル名 >> << 最大サイズ >> << 絶対最大サイズ >>
 最大サイズ、絶対最大サイズの省略は可能です。ログファイルのサイズが最大サイズに達した場合、メッセージを記録し、絶対最大サイズを超えてしまった場合はログ出力をしなくなります。
log_on_success  デーモンの起動に成功した場合、ログの出力を指定を行います。
 出力する項目は以下の通りです。(複数指定の場合はスペースで区切ります。)
    PID: サービスのプロセスID
    HOST: リモートホストのIPアドレス
    USERID: ユーザー名
    EXIT: サービス終了のシグナルの記録
    DURATION: セッション周期(秒)
log_on_failure  デーモンの起動に失敗した場合、ログの出力を指定を行います。
    HOST: リモートホストのIPアドレス
    USERID: ユーザー名
    ATTEMPT: サービス起動を試した記録
    RECORD: リモートホストから送られてくるデータレコードの内容
サービス起動系
nice  ジョブの優先順位を指定します。(-20 〜 19 の整数)値が低い程、優先順位が高くなります。
server_arg  サービス起動時に渡す引数を指定します。
(起動するサービスの指定は server で指定します。)
アクセス制御系
disabled  yes か no で指定します。yes をサービスの起動をしません。xinetd 経由でサービス起動する場合は no にします。
only_from  そのサービスにアクセス可能なリモートホストをIPアドレスまたはホスト名で指定します。
以下が書式の例です。
 only_from = 192.168.1.10 (IPアドレスのみ)
 only_from = 192.168.1.{1, 20, 150} (192.168.1.1 と 192.168.1.20 と 192.168.1.150 が可能)
 only_from = 192.168.1.0/255.255.255.0 (サブネットマスク付で指定)
 only_from = lab-kage.plala.jp (ホスト名を指定)
no_access  そのサービスにアクセスを拒否するリモートホストをIPアドレスまたはホスト名で指定します。
書式は only_from と同じです。
access_time  アクセス可能な時間帯を指定します。書式は以下の通りです。
 access_time = 6:00-18:00 ( 6:00 から 18:00 までアクセスできるようになります。)
cps  コネクションのレート制限を指定します。DoS攻撃対策などに有効です。書式は以下の通りです。
cps << 引数1 >> << 引数2 >>
 引数1に1秒あたりに処理できるコネクション数を指定します。この値を超えると一時的にサービスが利用できなくなります。
 引数2に一時的にサービスが利用できなくなってから再び利用できるまでの時間です。
instances  同時に動作可能な子サービスの最大数(整数)を指定します。UNLIMITED で制限がなくなります。
per_source  そのサービスに同時にアクセスできるリモートホストの最大数(整数)を指定します。UNLIMITED で制限がなくなります。


 例として、proftpd を xinetd 経由で起動するようにします。
 includedir /etc/xinetd.d と設定していたとすると、”/etc/xinetd/ftp”というファイルを新規で作成して、以下の様な内容を記述します。

service ftp <<--(1)
{
  disable = no <<--(2)
  socket_type = stream
  protocol = tcp
  wait = no
  user = root
  server = /usr/sbin/in.proftpd <<--(3)
  pre_source = 1
  instances = 10
}

 まず ftp は”/etc/services”の中に定義されているので、(1) の様に記述します。 xinetd 経由で起動させるので、(2) の様に disable = no します。 (3) で起動するサービスを記述します。今回は proftpd を使用しますので、このパスを設定します。引数は無いので server_arg は不要です。
 次に proftpd の設定をします。”/etc/proftpd/proftpd.conf”の内容の1行を以下の様に変更してください。

 ServerType standalone
     ↓
 ServerType inetd

 以上で設定は終わりです。 proftpd を停止して xinetd を再起動します。FFFTPなどでリモートホストからアクセスをして動作確認をしてください。


 4.xinetdの補足

 ◆ DoS攻撃対策

 一般的には市販ルーターとかがやってくれますが、xinetd でもできます。上記でも記述しましたが設定項目でもある cps で対応すれば良いです。

 ◆ 補足

 2004/10/6 時点での xinetd の最新のパッケージである”xinetd-2.3.11-2.i586.rpm”は今回は使用しませんでした。 xinetd経由でプログラムを起動させようと設定しても動作しなかったからです。(設定ファイルをいろいろいじったら動作しましたが、何が悪かったのかは・・・) インストール時にある初期の設定ファイルにミスがあったのか、結局原因が分からなったのでソースからコンパイルしてます。

 5.inetdの設定

 xinetd の前身である inetd の設定についてです。こちらも tcpwrapper と併用して使用するので”/etc/host.allow”と”/etc/host.deny”の設定が必要です。
 Plamo Linux で標準で設定されていたので  設定ファイルは、”/etc/inetd.conf”です。 xinetd の様に、ディレクトリィを作成して各サービス毎に設定ファイルあるわけではなく、1つのファイルのみです。
 以下が設定ファイルの例です。(抜粋)

ftp stream tcp nowait root /usr/sbin/tcpd in.ftpd
shell stream tcp nowait root /usr/sbin/tcpd in.rshd -L

以下の順番で横に記述していきます。
< service_name > < sock_type > < protocol > < flags > < user > < server_path > < args >
(各項目の区切りとして、tab が入ってます。)
下記がその内容です。

項目名 説明
service_name サービス名(ポート名?)を指定します。
要は、”/etc/service”に記述しているサービスの事
sock_type stream ・・・ TCPベース(下のプロトコルがTCPの場合選択?)
dgram ・・・ UDPベース(下のプロトコルがUCPの場合選択?)
protocol TCP か UDP
flags wait / nowait のどちらかを指定する タイプが stream の場合 nowait 指定する。
wait は指定されたポートで1つのサーバーを起動する。
user 起動するユーザーを指定する。 (デーモンなので通常は root のはず)
server_path 起動するデーモンのパスを指定。
上記の例でいうなら、”/usr/sbin/tcpd”までの部分。
args デーモンを起動する際のプログラム(引数が必要なら記述する)
上記の例でいうなら、”in.rshd -L”


 Plamo Linux の場合は、何故か smtp とか telnet が動作しているので、必要が無ければコメント化して止めてしまいましょう。


 Plamo Linux だったので、パッケージではなく、起動、終了のシェルは見つからなかったので、ps -aef で該当プロセスIDを見つけて kill しましょう。 inetd 起動したい場合は、Plamo Linux の場合は”/usr/sbin”の中にプログラムがあるので以下の様にして起動しましょう。

 /usr/sbin/inetd &

 6.inetdの補足

 inetd で設定が正しいかどうかをチェックするコマンドがあるようです。 (私のインストールの仕方が悪いのか、Plamo Linux では、そのコマンドは確認できませんでした。)  以下がそのコマンドです。参考までに・・・

 /usr/sbin/tcpdchk

 上記は inetd の設定ファイルが正しいかチェックをします。

 /usr/sbin/tcpdmatch < サービス名 > < ホスト名(IPアドレス) >

 上記は正しく記述されてても接続できるかどうかをチェックします。



先頭に戻る  TOPページに戻る