スーパーサーバ

June 10, 2018

スーパーサーバの設定と管理

デーモンプロセスは常時メモリ上に待機し、クライアントからの要求を監視している。そのため、使用されていない時も、メモリなどのリソースを消費している。
常駐するデーモンの数が多くなると、待機中のデーモンが消費するシステムリソースもそれだけ大きくなる。
これを解決するために、サーバプロセスを管理するスーパーサーバが開発された。inetd や xinetd といったスーパーサーバは、他のサーバプロセスに変わってサービス要求を監視し、接続が確立した時点で本来のサーバプロセスに要求を引き渡す。
必要な時だけ個々のサーバプロセスを起動することで、システムリソーソを効率的に使用することができる。
また、TCP Wrapper という仕組みと合わせることで、アクセス制御を集中的に管理できる。

デメリットとして、レスポンスが遅れるという点があり、Web サーバなど、クライアントのサービス要求にすぐに応じる必要のあるものはスーパサーバ経由で動作するべきではない。
逆に FTP や Telnet など接続の頻度が高くないサーバはスーパーサーバ経由の接続に適している。

TCP Wrapper によるアクセス制御

ネットワークサービスのアクセス制御を集中的に行うには、TCP Wrapper を使う。
TCP Wrapper である tcpd デーモンは、telnetd や ftpd などのサーバプログラムに変わってサービス要求を受け取った後、設定に基づいてチェックを行い、接続が許可された場合はそれぞれのサーバプログラムに処理を引き渡す。
設定ファイルは /etc/hosts.allow 及び /etc/hosts.deny となる。inetd 自体はアクセス制御機能を持っておらず、inetd は tcpd と連携し、inetd がサービス要求を受け取るとそれを tcpd に渡し、tcpd がアクセス制御の設定ファイルである /etc/hosts.allow と /etc/hosts.deny を調べ、サービス要求の拒否* 許可を決定する。

/etc/hosts.allow は以下のように設定する。この例では .example.com ドメインからの ssh アクセスを許可し、また、192.168.100.0/24 のネットワークからのアクセスを全て許可する。

sshd: .example.com  
ALL: 192.168.100.  

なお、/etc/hosts.allow の設定は /etc/hosts.deny よりも先に評価されるため、/etc/hosts.deny で全てのアクセスを「ALL: ALL」で禁止した上で、/etc/hosts.allow に許可対象だけ記述する方法が一般的。

xinetd の設定

近年では inetd よりもきめ細かい設定が可能なスーパーサーバとして xinetd が使われることが多くなっている。xinetd ではサービスごとのアクセス制御を細かく設定できる。
xinetd の設定は全体的な設定を行う /etc/xinetd.conf ファイルと xinetd.d ディレクトリ以下にあるサービスごとの設定ファイルから構成される。
xinetd.conf では以下のようなパラメータが用いられる。

パラメータ 説明
instances 各サービスの最大デーモン数
log_type ログの出力方法
logonsuccess 接続を許可した時にログに記録する内容
logonfailure 接続を拒否した時にログに記録する内容
cps 1 秒間に接続できる最大コネクション数と、限度に達した場合にサービスを休止させる秒数
includedir サービスごとの設定ファイルを収めるディレクトリ
defaults  
{  
	cps		  = 50 10  
	instances	  = 50  
	per_source	  = 10  
	log_on_success	  = HOST PID  
	log_on_failure	  = HOST  
	log_type	  = SYSLOG authpriv  
}  
  
includedir /etc/xinetd.d  

また、/etc/xinetd.d/ 配下の設定ファイルでは以下のパラメータが使用できる。

パラメータ 説明
disable サービスの有効/無効
socket_type 通信のタイプ (TCP は stream、UDP は dgram)
wait ウェイトタイム
user サービスを実行できるユーザー名
server サーバプログラムへのフルパス
server_args サーバプログラムに渡す引数
logonfailure 接続を拒否した時にログに記録する内容
nice 実行優先度
only_from 接続を許可する接続元
no_access 接続を拒否する接続元
access_times アクセスを許可する時間帯

もっとも重要なパラメータは disable であり、サービスを利用したくない場合は yes と記述する。


 © 2023, Dealing with Ambiguity