inetd - みる会図書館


検索対象: UNIX MAGAZINE 2003年11月号
21件見つかりました。

1. UNIX MAGAZINE 2003年11月号

連載 /Red Hat Linux のツールたち 図 5 inedtconvert の基本的な書式 inetdconvert [—d dir] [——inetdfile file] service ー 図 6 inetd. confOf 列 —convertremainlng telnet she11 login echO stream tcp stream tcp stream tcp stream tcp nowait nowait nowait nowait root root root /usr/libexec/telnetd /usr/libexec/rshd /usr/libexec/rlogind internal telnetd rshd rlogind inetd では、 inetd. conf に言当したサービスごとの成疋 行をコメントアウトするかしないかによってサービスの 有効 / 無効を切り替えていたため、コメントアウトした 場合は設定がないのと同然でした。一方、 xinetd では このパラメータを利用することで、置はあるか無効 である " ことを表現できます。このため、 inetd のよう に設定行を誤って削除し、あとで復活させるのに苦労す るようなことはありません。 外部のサーバー・プログラムを起動する場合の設定例と して、前回も紹介した cups-lpd のサービス設疋ファイル (/etc/xinetd. d/cups) をみてみましよう。 service stream socket—type protocol wait disable tcp Ⅱ 0 lp /usr/lib/cups/daemon/cups-lpd Ⅱ 0 cups-lpd がイ則月するポートは従来の lpd と同し 515 番 で、 /etc/services では printer という名則で定義されて いるので、これをう頁のサービス名に指定しています。ま た、外部のサーバー・フログラムを起動するため、 type パ ラメータを省略し、 server パラメータを用いてサーバー フログラムの絶対パスを指定しています ( この例では使っ ていませんが、 server-args ノヾラメータてサーノヾー・フロ グラム起重丿時の引数を指定することもできます ) 。あとは、 user ・パラメータで cups-lpd 実イのユーサーを lp に孑旨 定しているくらいで、アクセス粥リ御などの難しいことを考 えなけれは、、この程度の設定で - 十分です。 なお、サーヒ、スに関する設定はサーヒ、ス設定ファイル の言当から判断できるため、サービス設定ファイルの名前 はどのようなものでもかまいません。ただし、サービスや 136 サーバー・プログラムの名前などを付けたはうが、人間が 見たときにどのサービスに関する設定ファイルなのかを判 断しやすいでしよう。 inetd. conf の変換 Red Hat Linux では、 xinetd を標準的に採用してい るため、 inetd からの移行を考える必要はありません。し かし、 FreeBSD などのように、標準では inetd をサホー トし、必要であれは xinetd のパッケージをインストール するものもあります。 このような場合には、 inetd で使用していたすべての サーヒ、スについて、 xinetd のサービス設疋ファイルを記 述する必要があります。移行を容易にするツールとして、 xinetd のノヾッケージには (/usr/sbin/)inetdconvert コマンドが用意されています。 inetdconvert は、 inetd の設定ファイルを翫み込み、 xinetd のサーピス設定ファイルを自動的に作成します。 基本的な式は図 5 のとおりです。 爛氏限必要な引数は、変換したいサービスの名前 (set 、 vice) だけです。あるいは、 —convertremaining ・、フ ションを指定すると、未変換の ( つまり、 /etc/xinetd. d ディレクトリにない ) サービスをすべて変換しようとしま す ( ただし、 xinetd が内部で処理する daytime や echo などのサービスは、変換の対象外になっているようです ) 。 デフォルトでは、 /etc/inetd. conf を読み込み、変換 後のサービス設疋ファイルを /etc/xinetd. d ディレクト リに出力しますが、 —inetdfile と -d オプションを使っ て読み込む設定ファイルと出力先ディレクトリを変更する こともできます。 ためしに、手許にある FreeBSD マシンの inetd. conf ファイルを変換してみましよう。今回使用した inetd. conf ファイルの中身は、図 6 のようになっています ( コメント 行は省略しています ) 。 UNIX MAGAZINE 2003.11

2. UNIX MAGAZINE 2003年11月号

0 Red Hat Linux の ツールたち 横垣駿雄 xinetd 図 1 inetd の仕糸且み クライアント 今回は、 UNIX マシンをサーバーとして運用する際に よく利用される xinetd を紹介します。 UNIX にかぎら す、ネットワークて提供される一勺なサービスは、、、サ ・クライアント " モデルにもとづいて構築されてい ます。このモデルでは、サービス窈是供者をサー 、利 用者をクライアントと呼びますが、実際に処理をおこなう のは PC などの言算機であり、それぞれ専用のプログラム を使います。 通常、サーバー・プログラムは、引算機に常駐してクラ ライアントからのアクセスを待っ」と書きました。当然の イアントからのアクセス ( 要求 ) を待ちますが、 xinetd を ことながら、数多くのネットワーク・サービスを提供する 利用すると、各種のサービスに対するアクセスを一括して 言 fr. 算機では、たくさんのサーバー・プログラムか起動され 扱えるようになります。 x ⅲ etd カ吏えるかどうかは、サー た状態になります。かっては CPU やメモリなどのハード バー・プログラムの実装によります。しかし、たとえば前 ウェアはきわめて高価で、現在のようにメモリか数百 MB 回紹介した cups-lpd のように、 xinetd の利用を前提と ~ 数 GB の PC など夢物語でした。そんな竟では、ア したサービスを使いたけれは、否応なしに xinetd の設定 クセスの頻度にかかわらすすべてのサーバー・プログラム をせざるをえません。 を起動しておくのは明らかに言算機資源の無駄です。そこ 今回は、 xinetd の概要を紹介したあと、基本的な設定 て考案されたのが inetd です。個々のサーバー・プログラ ガ去について説明します。アクセス制御を含めたより高度 ムに代わってクライアントからのアクセスを待ち受け、ア な使い方については、次回にとりあげる予定です。 クセスを受けたら、設定ファイルの言当に従って対応する サーバー・プログラムを起動します。 図 1 に、いくっかのサービスをⅲ etd か管理する例を示 xinetd は、その前身である inetd の機能孑阪といえ します。この図では、サーバーの言算機で FTP 、 Telnet 、 ます。そこでます、 inetd について簡単に説明します。 rlogin という 3 つのサービスを提供しています ( これら のサービスは、それぞれ 21 、 23 、 513 番を well-known inetd ポートとして使用します ) 。個々のサーバー・プログラム inetd は 4.3BSD のころから登場したプログラムで、 が常駐する場合は、それぞれのポートに直接サー ・プ スーノく一テ ーモンあるいはスーパーサーパーなどとも呼は ログラムが対・応づけられます。一方、 inetd を導入すると、 れます。 これらのポートに inetd カ号寸施つ、けらサーバー・プロ さきほど、「サーバー・プログラムは言 fr 機に常駐してク グラムは常駐しなくなります。そして、クライアントから サーバー ( の計算機 ) 21 - 23 rlogin “ 513 ・ xinetd の概要 131 UNIX MAGAZINE 2003 ユ 1

3. UNIX MAGAZINE 2003年11月号

連載 /Red Hat Linux のツールたち一一① 部と接続しているようなフライベート・ネットワーク内 にサーバーを設置する場合にも役立ちます。 xinetd のアクセス制御機能は、 TCP wrapper と重複 する部分カ功、なりあります。なかには、任意のコマンドを 実行することでアクセスの言当求を管理者にメールで通知で きるなど、 TCP wrapper のほうが優れている点もあり ます [ 1 ] 。しかし、 xinetd の山もをのバージョンでは、コン パイルの際に TCP wrapper のアクセス制御ライプラリ を併用するように指定できるので、両者の長所を組み合わ せたシステムも作れます。さらに、 Red Hat Linux をは じめとする Linux の数多くのディストリビューションで xinetd か標準的に使われるようになっているため、今後、 inetd から xinetd への移行が進むのではないかと思われ ます。 以降では、 Red Hat Linux 7.3 に付属する xinetd バ ージョン 2.3.4 をもとに説明します。 Red Hat Linux では、 OS のインストール時に xinetd のパッケージもイ ンストールされるので、導入手順に関する説明は省略しま す。山斤版の 1 青報については、 xinetd の Web サイトや、 各ディストリビューションのアッフデート情報などをご xinetd の言殳疋 覧ください。 UNIX MAGAZINE 2003.11 る方法を説明します。 について述べたあと、変更した内容を xinetd に反映させ 以下では、 xinetd. conf とサーヒ、ス成疋ファイルの概要 ほど簡単です。 ログラムも伺属しているため、基本さえ押さえれは意外な inetd の設疋内容を xinetd の成疋ファイルに変換するプ ているものの、構造自体はそれほど複雑ではありません。 ん。しかし、 xinetd の設定ファイルは設定項目こそ増え ていたので、 inetd に慣れている人は戸惑うかもしれませ ルにサービスごとの設定を 1 行すっ列挙するようになっ inetd の場合は、 /etc/inetd. conf という設疋ファイ を作成して言当します。 ヒ、スごとの設疋ファイル ( 以下、サーヒ、ス設定ファイル ) スについては、 /etc/xinetd. d ディレクトリ以下にサー xinetd. conf ファイルでおこないます。個々のサービ xinetd 自身およびサービス全般に関する設疋は、 /etc 図 3 xinetd. conf # SimpIe configuration file for xinetd # Some defaults , and include /etc/xinetd . d/ defaults log-type IOg_011_SUCCeSS log—on—failure CPS 60 SYSLOG authpriv HOST PID HOST 25 30 xinetd. conf 図 3 は、 Red Hat Linux 7.3 に付属する xinetd. conf です ( 見やすさを考えて、字下けなどを変更しています。 以ー - ト 1 司様 ) 。このファイルには、、、 defaults" というセクシ ョンがあり、そのなかにサービス全般に関する基本的な設 定項目が、 includedir /etc/xinetd. d パラメータ = 値 の形式で 1 行に 1 つずっ列挙されています。なお、 xinetd . conf とサービス設定ファイルでは、、、 # " で始まる行は コメントとみなされ、空行と同様に無視されます。また、 defaults セクションの下にある、、 includedir" は、サービ ス設定ファイルを置くディレクトリの指定です。 図 3 の defaults セクションに言当主されているノ、ラメー タは、それぞオリリ訃・のような意味をもっています。 ・ instances xinetd が同時にアクテイプにできるサーバー数の上限 を指定します。 TCP のサービスであ川ま、同時に扱え るコネクション数に相当します。値として、数値または UNLIMITED 仕限なし ) を記述します。パラメータ このパラメータを適切に指定しておけは、 DoS 攻撃な 自体を省略した場合は無制限になります。 を意味します。 syslog の authpriv カテゴリ は、 アクセスログの出力先を指定します。図 3 の例であれ ・ log-typ e どによる ; 閾隻のアクセスが防げます。 133 ーに出力する " こと

4. UNIX MAGAZINE 2003年11月号

連載 /Red Hat Linux のツールたち 図 7 inetdconvert の実イデ列 [root@valhalla tmp] # pwd /var/tmp [root@valhalla tmp] # 1s inetd . conf [ て oot@valhalla tmp] # ロ inetd. conf 10g 土 n shell telnet [root@valhalla tmp] # ls Converting login Converting shell Converting telnet Skipping echo [root@valhalla tmp] # inetdconvert service logill # Converted by inetdconvert 図 8 変換後のサービス言聢ファイル (login) —inetdfile . /inetd. conf —convertremaining socket—type protocol wait server disable stream tcp IIO /usr/libexec/rlogind inetd. conf の書式について簡単に説明しておきます。 第 1 フィールドがサーピス名で、第 2 フィールド以降は 順番に、 xinetd のサービス成疋ファイルの socket-type 、 protocol 、 wait 、 user 、 server 、 server_args ノヾラメーータ に対応します。なお、 echo サービスについては、 xinetd と同しく inetd 自身か処理するため、第 6 フィールドに は、、 internal" を指定し、第 7 フィールドは空となってい ます。 いきなり /etc/xinetd. d ディレクトリに出力されても 困るので、いったん /var/tmp ディレクトリにコピーし ます。そして、変換後のサービス設定ファイルを同しディ レクトリに出力します ( 図 7 ) 。 echo は xinetd 自身が処理するサービスなので変換は おこなわれす、出力先ディレクトリ (/var/tmp) にもサー ビス設定ファイルはありません。しかし、その他のサーヒ、 ス (telnet 、 shell 、 login) は変換されていることが分か ります。 たとえは、 login サービスの変換後のファイルは図 8 の ようになります。ツ頁に、 inetdconvert によって変換さ UNIX MAGAZINE 2003.11 れたことを未するコメントか書かれています。なお、ⅲー etd. conf でオプション文字列を当する第 7 フィールド は、サービス設疋ファイルの server-args ノヾラメータに 対応します。オプション文字列が記述されている場合に限 り、 server-args パラメータが出力されます。 設定の再読込み xinetd. conf やサービス設定ファイルを変更した場合 は、その変更を現在起動している xinetd に反映する必 要があります。 Red Hat Linux では、サービス起動ス クリプト (/etc/rc. d/init. d/xinetd) を使うと簡単です。 ー搬的なサービス起動スクリプトの引数である、、 start" や stop " だけでなく、 xinetd のプロセスを再起上せすに設 定ファイルを再言も囚みするための、、 reload" という引数も 指定できるので、図 9 のように実行すれはいいでしよう。 また、 xinetd のオンライン・マニュアルに書かれてい るように、 xinetd のプロセスに SIGHUP シグナルを送 ると設定の再言もムみがおこなわれます。したがって、 kill コマンドを使って、 kill —HUP ( cat /var/run/xinetd. pid' と実行しても、同じ結果が得られます 9 。 Linux 以外の UNIX では、こちらのはうが一・鍛的なガ去です。 こで、 echo サーピスを利用して、設疋の変史カ址し く反映されているかを確認してみましよう。 Red Hat Linux をインストールした直後に echo の サーピス設疋ファイルを見ると、 disable パラメータの値 9 xinetd のサービス斷カスクリプトの内容を見ると分かりますが、図 9 の ように実行した場合も、去勺には kill コマンドで SIGHUP シグナル を送っています。 137

5. UNIX MAGAZINE 2003年11月号

連載 /Red Hat Linux のツールたち 図 2 inetd と TCP wrapper 且合・せ クライアント rlogin ・ 21 サーバー ( の計算機 ) アクセス制御 テータベース ftpd ・△ tcpd 、キ〇 これらのポートにアクセスがあった場合には、 inetd がそ ” 513 ログ 132 スか許可されていれは、本来のサーバー・プログラムを起 にもとづいてアクセス制御データベースを検索し、アクセ tcpd は、クライアントの IP アドレス ( またはホスト名 ) per に含まれる tcpd というプログラムを起動します。 サーバー・フログラムを起動するのではなく、 TCP wrap- うになります。図 1 の場合とは異なり、 inetd は個々の inetd と TCP wrapper を組み合わせると、図 2 のよ ます。 決定し、さらにアクセスの言当求 ( ログ ) をファイルに残し のデータベースを検索します。そして、アクセスの刈否を ライアントの IP アドレスやホスト名などにもとづいてこ TCP wrapper はアクセス制御データベースをもち、ク wrapper が考案されました。 起測庁る点に注目し、アクセス制御牋能を追加する TCP ません。そこで、 inetd がはかのサーバー・プログラムを 利用するためのプログラムで、アクセス制御の機能はあり inetd は、 CPU やメモリなどの言 fr 算機資源を効率的に TCP wrapper ・プログラム " である点に由来します。 という名称も、、、サーバー・プログラムを起動するサーバ メモリの消費量は少なくなります。、、スーパーサーバー 駐する場合にくらべて最初の応答に時間はかかるものの、 たときに初めてサーバー・プログラムを起重丿けるため、常 このように、 inetd はクライアントからアクセスがあっ バー・プログラムも終了します。 もちろん、クライアントかサービスを使い終ったら、サー イアントとサーバー・プログラム間の通信を仲介します。 のポートに対応するサーバー・プログラムを起動し、クラ 動します。 TCP wrapper のパッケージには、 inetd と組み合わ せて利用する tcpd プログラムだけでなく、アクセス制御 データベースを用いてアクセスの司否を判断するためのラ イプラリも含まれています。したがって、このライプラリ を使うように実装されていれは、本来は inetd を利用しな いサーノヾー・プログラムについても、 TCP wrapper の アクセス制御データベースか流用できます 1 。 xinetd inetd のいわば、、外側 " にアクセス制御機能を加える TCP wrapper に対し、 xinetd は、 inetd 自体にアク セス制御などのさまざまな機能を付け加えたプログラムで す。 xinetd の Web サイト 2 には、 inetd と上交して次の ような利点があると書かれています。 ・アクセス制御 クライアントのホスト名 ( ドメイン名 ) や IP アドレス にもとづいてアクセスの可否を決められるだけでなく、 アクセス可能な時間帯なども指定できます。 ・サーヒ、ス不能 (DoS : DeniaI of Service) 攻撃からの 防御 サービスごとに起動・可能なサーバープロセスの数や、単 イ立日内に受付け可能なコネクション数など、サー 言算機の負荷に関連するパラメータに上限を設けること ができます。さらに、上限を超えた場合にはサービスを 中止するように設定しておけば、 DoS 攻撃が防げます。 ・アクセスログ 失敗したアクセスをクライアントの IP アドレスととも に記録するだけでなく、成功したアクセスについては、 アクセスの開始・終了時刻を言当求できます。また、サー ビスごとに異なるファイルにログを残すような設定も可 能です。 ・負荷分散 1 2 あるサービスに対する TCP ストリームを異なるホスト に中継することにより、負荷分散か図れます。また、最 終的な宛先となるサーバーの言算機はクライアントから 直接アクセスできなくてもよいので、 NAT を用いて外 たとえは、 OpenSSH のサーバー・プログラムである sshd も、 TCP wrapper のアクセス制御ライプラリを利用できます。 http://www.xinetd.org/ UNIX MAGAZINE 2003.11

6. UNIX MAGAZINE 2003年11月号

連載 /Red Hat Linux のツールたち一 - ⑥ この場合、セクションのサービス名は任意のものでかま す。たとえは、 echo サービスが使う well-known ホート は 7 番ですが、 /etc/services には以下のように言当され ています 5 echO echO 7/tcp 7/udp 同しポート番号で TCP と UDP のどちらも利用できる ため、別々に言当主されていますが、サービス名には /etc/ services ファイルの第 1 フィールドに指定されている文 字列 echo を使います。 各セクションでは、 xinetd. conf の defaults セクショ ンと同じく、パラメータとその値を 1 行すっ列挙します。 図 4 に書かれているパラメータの未は、それぞオ LJ ユ下の す。 ・ type とおりです。 Linux にかぎらす多くの UNIX では、 値として、サービスの不頁を示すキーワードを指定しま いくつかの単 純なサービスについては専用のサーバー・プログラムで 8 サーバー計算機における 1900 年 1 月 1 日 0 日物、らク琳少数を、機 した場合にはランダムな文字列を返します。 は、クライアントに対して特定の文・ = 簽列を繰り返し送信し、 UDP てオに 7 文字列をイ成するサーピスてす。クライアントが TCP てイ売した場合 /dev/null に出力するのと似ています。 6 クライアントから送信されたデータを単純に破棄するサーヒ・スです。 す使われないでしよう。 ルなので、 UNIX や Windows を中心としたネットワークエ竟ではま すが、これは AppleTalk のネットワークて利用される echo プロトコ 5 /etc/services の最後のほうには、 echo 4/ddp" という言当もありま 起けるサーバー・プログラムの絶対パスを指定します。 パラメータを用いて、そのサービスかイ吏うポート番号ヤ タの値に UNLISTED を指定し、 port および server 番号を使うサービスにも対応できます。 type パラメー xinetd は、 /etc/services に登録されていないポート フログラムの絶対パスを指定します。 このパラメータではなく server を使い、値にサー バー・フログラムを起動するサービスについては、 一方、 ftp や (r)login など、 (xinetd からみて ) 外部の は、キーワードとして INTERNAL を指定します。 card 、 chargen 、 time8 があります。これらの場合に れに該当するサービスとしては、 echo 、 daytime 、 dis- はなく、 xinetd ( または inetd) 自身が処理します。 UNIX MAGAZINE 2003.11 械研方にて返すサービスてす。 いません。 ・ id の id の値を、、 echo-stream ' 、後者を、、 echo-dgram ています。サービス名はいすれも、、 echo" なので、前者 echo-udp) の 2 つのサービス成疋ファイルか用意され d/echo) と、 UDP を利用するもの (/etc/xinetd. d/ echo については、 TCP を利用するもの (/etc/xinetd. に理由がなけ川ま省略してもかまいません。 セクションのサービス名がそのまま使われるため、とく 字列を指定します。このパラメータを省略した場合は、 サービスを特定するための識別 - 子で、値として任意の文 135 否されます。 no の場合は、サービスか有効になります。 応するポート番号へのクライアントからのアクセスは拒 yes の場合はそのサービスは無効となり、サービスに対 値には、 yes または no を指定します。 ・ disable 時に複数のアクセスを処理できるようになります。 ります。一方、 11 。の場合は、同しサーピスについて同 の処理を終えるまで次のアクセスは待たされることにな わち、あるサービスに対してアクセスがあったとき、そ yes の場合には、逐朝勺に処理がおこなわれます。すな 値には、 yes または no を指定します。 機に登録されているユーサーでなけれはなりません。 はユーサー名を指定します。もちろん、サーバーの言算 値には、起動するサーバープロセスのユーサー ID また ・ user か : 多くの場合は、、 tcp" か、、 udp " のどちらかです。 コル名を指定します。さまざまなプロトコルがあります 値として、 /etc/protocols に記述されているフロト ・ protocol します。 後者は UDP によるデータグラム型のサービスに相当 します。前者は TCP によるストリーム型のサービス、 値として、通常は、、 stream" または、、 dgram" を指定 ・ socket-type れます。 パラメータ id の値は、アクセスを記録する際にも使わ として区別しているようです。

7. UNIX MAGAZINE 2003年11月号

連載 /Red Hat Linux のツールたち一一① 図 9 サービス起動スクリプトによる言聢の再言ムみ [root@valhalla tmp] # /etc/rc . d/init . d/xinetd reload [root@valhalla tmp] # ロ 設定を再読み込み : 図 10 /var/log/secure に出力されたアクセスログ OK Sep 16 18 : 25 : 42 valhalla xinetd [ 790 ] : START: echo—stream pid = 4262 from = 127.0.0.1 は yes となっているはすです ( 図 4 ) 。したがって、 telnet コマンドで echo サービスのホート ( 7 番 ) にアクセスし ても、以下のように接続を拒否されてしまいます。 [root@valhalla tmp] # telnet localhost Trying : : 1 ・ Trying 127.0.0.1. telnet: connect to address 127 . 0 . 0 . 1 : refused [root@valhalla tmp] # ロ e ChO そこで、 disable ノ、ラメータの値を no に書き換えてか ら再言ムみを実行し ( 図 9 ) 、あらためて telnet コマンド を実行すると、アクセスか許可されて echo サービスの処 理がおこなわれます ( もちろん、アクセス制御の設定て拒 否している場合は、そのかぎりではありません ) 。 [root@valhalla tmp] # telnet localhost ech0 [root@valhalla tmp] # ロ Connection closed . telnet> quit ←工スケープ文字の入力 hayao ← echo によるエコーノヾック hayao ←文字列の入力 Escape character iS Connected to localhost . Trying 127 . 0 . 0.1. Trying : : 1 ・ 138 10 Control キーを押しながら、、 ] " キーを押します。 ます。 ルを参照すれはアクセスの言求をチェックすることができ /secure ファイルにログが記録されるため、このファイ す。 Red Hat Linux の標準設定では、去絲冬的に /var/log が扱うアクセスの記録は syslog を経由しておこなわれま 一方、図 3 に示した xinetd. conf の成疋では、 xinetd から、、、 quit" を入力します。 字 ( つ 10 を入力して telnet のフロンプトを表示させて なお、 telnet コマンドを終了するには、エスケーフ文 たとえは、さきはどの echo サーヒ、スの例であ川ま、ア クセス成功時に図 10 のような行が出力されます。アクセ スの開始時刻やクライアントの IP アドレス、 echo サー ビスを処理するために xinetd が生成した子プロセスのフ ロセス ID などが分かります。これはアクセスに成功した 場合の例ですが、アクセス制御の設疋によってアクセスが 拒否された場合は、、、アクセスに失敗した " という記録も 残ります。ただし、サービス設定ファイルてサービス自体 を無効にするように言当している場合は、そのサービスが 使うポートに x ⅲ etd が対応づけられていないため 11 、ア クセスの言当求は残りません。 ☆ 今回は、 xinetd の仕組みと基本的な使い方について説 明しました。 xinetd に対応したサーバー・フログラムを 追加するだけならは、それほど難しくないことが分かって いただけたのではないかと思います。 次回は、クライアントの情報 ( ホスト名や IP アドレス など ) にもとづいたアクセス制御の設疋や、アクセスログ のカスタマイズ方法など、もうすこし高度な使い方を紹介 する予定です。 ( よこがき・はやお ) [ 文献 ] [ 1 ] 山本和彦「転はぬ先のセキュリティ ( 24 ) ー TCP wrapper と xinetd 」、 UNIX MAGAZINE 1996 年 6 月号 [ 2 ] M. St. Johns, er 第 c 佖 0 れ ProtocoI, RFC1413 , February 1993 11 OS のカーネルレベルでアクセスか拒否されるので、 xinetd は関知し ません。 UNIX MAGAZINE 2003.11

8. UNIX MAGAZINE 2003年11月号

連載 /Red Hat Linux のツールたち 図 4 echo のサービス設定ファイル # default : off # description: An echO server. This is the # tcp version. serVICe echO 特定のファイルに出力したい場合は、 log—type = FILE filename 、、 FILE " というキーワードに続けてファイ のように ル名を指定します。 ・ log—on—success 成功したアクセスを言当求するときに含める情報を指定し ます。値として、言当求する・慮こ対応するキーワードを 空白で区切って列挙します。指定可能なキーワードは以 下のとおりです。 ◇ PID xinetd か起動したサーハ ・プログラムのプロセス HOST や USERID を指定した場合は、 ATTEMPT ID を言求します。ただし、 daytime サーピス 3 のよ も指定したのと同しことになります。 うに、 xinetd の内部で実行され、かっ xinetd が子 プロセスを生成せすに処理する場合には、言当求される ・ CPS 値として、 2 つの数値を空白で区切って指定します。 1 プロセス ID は、、 0 " になります。 番目は、 xinetd か扱う 1 秒あたりのコネクション数の ◇ HOST 上限値で、これを超えると一引判勺にサーピスを停止しま クライアントの IP アドレスが言求されます。 す。 2 番目は、一日亭止してから再開するまでの時間を ◇ USERID 秒単位て指定します。 IDENT フロトコル [ 2 ] でクライアントのユーサーが 特定できる場合には、そのユーサーの欝肋饂当求され なお、図 3 のパラメータのうち、 instances を除く 4 っ ます。ただし、一・般的にはクライアントが IDENT はサーヒ、ス設疋ファイルでも使えます。したがって、サー プロトコルによる間合せを正しく処理する保証はあ ビスの種類によってアクセスログの出力先を変更したり、 りません。さらに、町午迂によってサーバーの処理 当求に含める↑帯長を変更することができます。 性能が低下するため、実際にはあまり意味がありま サービス設定ファイル せん。 ◇ EXIT サーピス設定ファイルには、各サービス固有の設定を サービス終了時に、サーバーの終了ステータスまたは 記述します。基本的な例として、 Red Hat Linux に付 終了シグナルカ当求されます。 属する ech04 のサービス設定ファイル (/etc/xinetd. d/ ◇ DURATION echo) を図 4 に示します。 サービス終了時に、クライアントがそのサーピスを利 サービス設定ファイルの基本的な書式は xinetd. conf 用した時間か当求されます。 と同様ですが、セクション名に相当する部分では、 ・ log-on-failure service サービス名 log-on-success と同様に、失敗したアクセスを言求す のように、キーワード、、 service" に続けてサービス名を指 る際に含める情報を指定します。このパラメータの値 定します。 に指定可能なキーワードは、 HOST 、 USERID 、 AT- 通常、サービス名にはポート番号とサービスとをヌ寸応つ、 TEMPT の 3 つです。最後の ATTEMPT は、、、失敗 ける /etc/services ファイルに書かれている名則を使いま したアクセスを記録する " ことを明示するだけなので、 4 クライアントから送られてきた文字列を単純にエコーバックするサービス 3 サーバーの日付と日寺刻をノ調か読める形式て返すサーピスてす。 工 NTERNAL echo—stream stream tcp root Ⅱ 0 yes type id socket—type protocol wait disable = 一 1 ロ 134 UNIX MAGAZINE 2003 ユ 1

9. UNIX MAGAZINE 2003年11月号

ー② 連載 / Perl 活用のヒント リスト 1 mini-relaytcp 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 2 2 23 24 25 26 2 7 28 29 30 31 32 33 34 # !perl use StriCt ; use 工 0 : :Socket: :INET; @ARGV ; my ($relaytarget , $localport) @ARGV 2 or die "arg count. \ Ⅱ " ) IGNORE' ・ $SIG{CHLD} my $listen = 工 0 : :Socket : : lNET—>new(LocaIPort ReuseAddr = > 1 , Proto Listen die "failed to open a listening port : $localport : $ ! \ Ⅱ " = > $ 10Ca1P0 て t , = > "tcp = > 5 ) or for ( ; if die "failed t0 connect : $relaytarget : $ ! \n" my $target 工 0 : : Socket : : INET—>new($re1aytarget) or ( fork() $listen—>accept or next ; my $client exit 0 ; shutdown($client , 1 ) ; print while く $target> ; select($client) ; else { shutdown($target , 1 ) ; print while く $client>; select($target) ; if ( fork() ) { close($client) ; います。以ード同様 ) 。 relaytcp —target TARGET-HOST : TARGET—PORT - —localport LOCAL-PORT 以下、 mini-relaytcp のコードを説明する。コードを上 から順番に説明しているわけではないが、書いてある順に 読めはコードを理解できるようになっている。 8 ~ 12 行目 クライアントからの接続を受け付けるソケットを作成し ている。ソケットは IO::Socket::INET クラスのインス タンスとして作成される。以ード、この部分て指定されてい るコンストラクタのオフションの働きを説明する。 UNIX MAGAZINE 2003.11 LocalPort ソケットの自研則のポート番号を指定する。 ReuseAddr このオプションがないか、 0 を指定すると、以前に mini-relaytcp を起動したときに使われたポート番号 が、接続を受け付けるポート番号として使えなくなる。 サーバーが要求を受け付けるソケットの場合は、通常 は 1 あるいはその他の真を表す値を指定する。 P roto 、、 tcp" や、、 udp" などのプロトコルを指定する。 Listen このオプションがあると、接続を受け付けるソケットが 59 作成される。このオフションがなけれは、 PeerHost オ

10. UNIX MAGAZINE 2003年11月号

連載 / Perl 活用のヒント - ② リスト 4 select を使用した mini-relaytcp 彦正版 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 # ! /usr/bin/perl use StriCt ; use 工 0 : :Socket: :INET; use IO: :Se1ect; 2 or die " arg count . \n' @ARGV my ($relaytarget, $ 10Ca1P0 て t ) = @ARGV; my $listen = 工 0 : : Socket : : INET->new(Loca1Port = > $localport , ReuseAddr = > 1 , Proto Listen = > "tcp = > 5 ) 0 て die "failed t0 open a listening port : $localport : $ ! \ Ⅱ” $SIG{CHLD} 'IGNORE' ・ for ( ; my $client $listen—>accept or next ; if ( fork() 工 0 : : Socket : : INET—>new($re1aytarget) or my $target die "failed t0 connect : $relaytarget : $ ! \ Ⅱ " IO: :Se1ect—>new($cIient, $target) ; my $select ($client = > $target , my %dest $target = > $client) ; while ( my @ready = $select->can—read ) { foreach my $src ( @ready ) { $dest{$src}; my $dest my $block; sysread($src , $block, 8192 ) or d0 { close($client) ; exit 0 ; print $dest $block; shutdown($dest , 1 ) ; $select—>remove($src) ; 合と同しである。以ード、リスト 4 のコードをかいつまんで 説明する。見てのとおり、大枠はリスト 1 と同しである。 22 行目 このプログラムでは、糸目込み関数 select を直接使うよ り、 IO::Select モジュールを使ったほうが簡単なのでそ のようにしている。 22 行目で select を実行するために IO::Select クラスのインスタンスを作成し、対象としてク ライアントおよび中継先向けのソケットをイ求している。 25 行目 待たすに読み込めるソケット、つまりデータか届いてい るものの一覧が@ready に入るので、 26 行目以降でその 66 内容を順に処理している。 29 行目 こで、 read でもく $src 〉でもなく、 sysread を使っ ていることには意味がある。 sysread を使えは、 I/O 待ち を発生させすに読み込めるぶんだけを読み込むことができ 、、 $block = る ( 8 , 192 バイトを上限としてではあるか ) 。 く $src 〉 " とすると、行単位で読み込むことになって動作し ない。改行がくるかファイルの最後まで読もうとするから である。 34 行目 こで、 syswrite ではなく print を使っていることに も意味がある。 syswrite だと $block 全体か書き込まれる とはかぎらないが、 print ならエラーが発生しないかぎり UNIX MAGAZINE 2003.11