Bloody Mary  

First Creation : 2006/11/08

Last Update : 2006/11/08

Bloody Mary > Technical Notes > Plamo Linux 覚書 2.2 - xinetd

Plamo Linux 覚書 2.2

xinetd は、サービス・ポートに要求があったとき、特定の条件をクリアするかどうか判定し、問題なければそのサービスを立ち上げてくれると言う daemon である。この言い回しに自信はないが、だいたいそんなカンジ。

設定ファイルの変更を行ったら、 xinetd の再起動を行わないといけないので注意が必要だろう。

xinetd の設定

1. インストール

せっかく Plamo を使っているのだから、ソースから最新版をインストールしてみよう。最新版は http://www.xinetd.org/ にある。

% cd /usr/local/src
% wget http://www.xinetd.org/xinetd-2.3.14.tar.gz
$ tar zxvf xinetd-2.3.14.tar.gz
$ cd xinetd-2.3.14

configure するときに --with-libwrap=/usr/lib/libwrap.a は必ずつけること。
でないと TCP WRAPPER の機能が有効にならないようで、 IP アドレスとかホストで
制限かけることができなくなってしまう。
$ ./configure --prefix=/usr --with-libwrap=/usr/lib/libwrap.a
$ make

もし tcpd.h がないとか怒られたら、一応 root になって、 tcpd.h を /usr/include に移動させる。
$ su
root のパスワード入力 ( 以下 root で作業 )
# wget http://www.page.sannet.ne.jp/kanachin/ppp/tcpd.h.gz
# gzip -d tcpd.h.gz
# mv tcpd.h /usr/include

上の make でエラーが出た人は再度 make する
# make

もし xinetd が既に立ち上がっている ( バージョンアップしたとか ) ひとは、
一応 xinetd は止めた方がいいかもしれない。
# ps aux | grep xinetd
# kill xinetd のプロセス番号

# make install 

おまじない 
# cd /usr/sbin 
# strip -p itox xinetd
2. inetd 自動起動 STOP 、 xinetd 自動起動
# vi /etc/rc.d/rc.inet2
以下の部分をコメントアウトして、その下のやつを追加。

コメントアウト
 
# Start the INET superserver.
#if [ -x $NET/inetd ]; then
#    echo -n " inetd"
#    $NET/inetd
#else
#    echo "no INETD found.  INET cancelled!"
#    exit 1
#fi


追加

# Start the XINETD.
if [ -x $NET/xinetd ]; then
    echo -n " xinetd"
    $NET/xinetd -pidfile /var/run/xinetd.pid
else
    echo "no XINETD found.  XINET cancelled!"
    exit 1
fi

シンボリックリンクも張っておく。

# ln -s /usr/local/sbin/xinetd /usr/sbin/xinetd
3. xinetd の設定ファイル

設定ファイルがいろいろあって面倒だが、まず /etc/hosts.allow と /etc/hosts.deny からやってしまおう。

# vi /etc/hosts.allow
    # LOCAL からの接続は全て許可する
    ALL : LOCAL
    ALL : 192.168.1.0/255.255.255.0
    # ホスト制限は /etc/xinetd.d/ のファイルで行う
    sshd : ALL


# vi /etc/hosts.deny
    ALL : ALL EXCEPT LOCAL

お次はコンフィグファイル。

# vi /etc/xinetd.conf
    defaults
    {
        instances      = 25
        log_type       = SYSLOG authpriv
        log_on_success = HOST PID
        log_on_failure = HOST
        per_source     = 5
    }

    includedir /etc/xinetd.d

もし、/etc/xinetd.d というディレクトリがなければ、 # mkdir /etc/xinetd.d で作ること。/etc/xinetd.d には、ftp や ssh などの名前でそれぞれのサービスに適した設定ファイルを置く。すると xinetd が起動するときにそれぞれの内容を全部読み込んでくれる。ここに各サービスごとの設定ファイルを置いたほうが、/etc/xinetd.conf にまとめて書くより断然分かりやすい。

さて、いよいよ ssh に特化した xinetd の設定ファイル。

# vi /etc/xinetd.d/sshd
    service ssh
    {
        disable         = no
        socket_type     = stream
        wait            = no
        user            = root
        server          = /usr/sbin/sshd
        server_args     = -i
        log_on_success += HOST PID
        log_on_failure += HOST
        only_from       = 192.168.1.0/24 .jp .net .com .org
        no_access       = .kr
        nice            = 10
    }

まあこんなカンジで、only_from に接続 OK なドメイン、 no_access に拒否りたいドメインを書いていく。

log_on_success と log_on_failure はこの値にしておいた方が無難。でないとアクセスがもたついてイライラすることになるだろう。

あとは xinetd を再起動すれば、設定が有効になる。

具体的には、 こんな感じだろう。

  1. xinetd を再起動後、 xinetd は 22 ポートからの要求を待つ
  2. もし要求があったときは、 xinetd は only_from 等の条件をクリアするかどうか調べる
  3. 問題なければ /usr/sbin/sshd を起動させる
  4. sshd は sshd_config の設定に従って動作し、鍵を持っていないヤツは大統領であろうとお断りする

ここまでやっても、インターネット上にサーバとして公開するには安全とはいいがたい。

Plamo Linux 覚書 2.1 - sshd を xinetd 経由で立ち上げる設定で少し触れたが、サーバを公開して、インターネット経由での sshd アクセスを考えているなら iptables によるパケットフィルタをかける必要がある。例えば、 1 分間に同じ IP アドレスから 5 回もアクセスがあれば、辞書攻撃をされていると予想がつく。 xinetd で IP アドレス規制をすることもできるけど、それだとログを見てからの対処となって後手に回ってしまう。

だが、前述の方法ならば、見知らぬ IP アドレスからの攻撃であっても 5 回までしか試せなくなる。これは攻撃者にとってものすごく効率的が悪いし、時間的に辞書攻撃はほぼ不可能になるだろう。

このように、なるべく複数のセキュリティをかけておくと安心なわけだ。

なお、 5 回というのはものの例えで、詳しくは iptables のところで説明するつもりだが、ページがなくなってきたので今回はここまで。

前へ上へ次へ