• rssh完全インストール – SCP/SFTPをchrootしよう!part3 chroot用意

    << | 1 | 2 | 3 | 4 | >>

    今回はchrootディレクトリを用意していきます。

    chrootを用意すると言ってもディレクトリを作成するだけではありません。
    rsshは、サーバーに接続した後にいくつかのコマンドを実行します。SCPを利用する場合はscpコマンドが、SFTPを利用する場合はsftp-serverコマンドがそれぞれ必要になります。rsyncやその他の機能を使う場合はそれらのコマンドも必要になります。しかし、chrootするとそのディレクトリより下層しか参照できず、
    scpコマンドやsftp-serverコマンドが実行できなくなります。したがって必要なコマンドやファイルをchrootされたディレクトリに設置してやる必要があります。注意点は、ノーマル時と chroot時でディレクトリの構成が変わらないように設置しなければなりません。

    ■ chrootスケルトンディレクトリの作成

    chroot ユーザーを追加する度にコマンド/ファイルをコピーするのは面倒なので、あらかじめ必要なものを詰め込んだ スケルトンディレクトリ を作成します。

    # mkdir /usr/local/rsshchrootskel/
    

    とします。

    そしてchrootに必要なファイルは、ディレクトリ構成を変えずにスケルトンディレクトリにコピーします。
    例) # cp /usr/bin/scp /usr/local/rsshchrootskel/usr/bin/scp

    しかし実際にはcpコマンドでコピーはせずrsshに付属のchrootを作成するためにmkchroot.shというシェルスクリプトを使います。
    <path to script>/mkchroot.sh

    mkchroot.sh で必要なファイルを指定したディレクトリにコピーしてくれます。しかし、configure等によって動的に作成されたスクリプトではありませんので、 –prefix等のオプションを意識していません。何ヶ所か修正が必要になります。

    それぞれのパスを正しく設定します。

    修正前
    ・mkchroot.sh

    scp_path="/usr/bin/scp"
    sftp_server_path="/usr/libexec/openssh/sftp-server"
    rssh_path="/usr/bin/rssh"
    chroot_helper_path="/usr/libexec/rssh_chroot_helper"
    

    ↓修正

    scp_path="/usr/bin/scp"
    sftp_server_path="/usr/libexec/openssh/sftp-server"
    rssh_path="/usr/local/bin/rssh"
    chroot_helper_path="/usr/local/libexec/rssh_chroot_helper"
    

    私の環境の場合、パスの修正は2ヶ所の修正でした。
    scp_path と sftp_server_path が正しくない場合は、そちらも正しいパスに修正します。

    そして、これは多分バグです。ここを修正しないと mkchroot.sh を実行したときにエラーで止まります。
    $rssh_pathを作成するロジックを追加します。

    修正前
    ・mkchroot.sh 103行目

    for jail_path in `dirname "$jail_dir$scp_path"` `dirname "$jail_dir$sftp_server_path"` `dirname "$jail_dir$chroot_helper_path"`; do
    

    ↓修正

    for jail_path in `dirname "$jail_dir$scp_path"` `dirname "$jail_dir$sftp_server_path"` `dirname "$jail_dir$rssh_path"` `dirname "$jail_dir$chroot_helper_path"`; do
    

    mkchroot.sh は完成です。さっそくスケルトンディレクトリを作成してみます。
    mkchroot.sh でコピーされるファイルは、コマンドが4つとそれらに必要なライブラリ、あとは/etc/passwd等のファイルです。

    # bash mkchroot.sh /usr/local/rsshchrootskel
    
    NOT changing owner of root jail.
    NOT changing perms of root jail.
    setting up /usr/local/rsshchrootskel/usr/bin
    setting up /usr/local/rsshchrootskel/usr/libexec/openssh
    setting up /usr/local/rsshchrootskel/usr/local/bin
    setting up /usr/local/rsshchrootskel/usr/local/libexec
    Copying libraries for /usr/bin/scp.
    (0x00284000)
    cp: cannot stat `(0x00284000)': そのようなファイルやディレクトリはありません
    /lib/libresolv.so.2
    /lib/libcrypto.so.6
    /lib/libutil.so.1
    /usr/lib/libz.so.1
    /lib/libnsl.so.1
    /lib/libcrypt.so.1
    /usr/lib/libgssapi_krb5.so.2
    /usr/lib/libkrb5.so.3
    /usr/lib/libk5crypto.so.3
    /lib/libcom_err.so.2
    /usr/lib/libnss3.so
    /lib/i686/nosegneg/libc.so.6
    /lib/libdl.so.2
    /usr/lib/libkrb5support.so.0
    /lib/libkeyutils.so.1
    /usr/lib/libnssutil3.so
    /usr/lib/libplc4.so
    /usr/lib/libplds4.so
    /usr/lib/libnspr4.so
    /lib/i686/nosegneg/libpthread.so.0
    /lib/libselinux.so.1
    /lib/libsepol.so.1
    Copying libraries for /usr/libexec/openssh/sftp-server.
    (0x0015b000)
    cp: cannot stat `(0x0015b000)': そのようなファイルやディレクトリはありません
    /lib/libresolv.so.2
    /lib/libcrypto.so.6
    /lib/libutil.so.1
    /usr/lib/libz.so.1
    /lib/libnsl.so.1
    /lib/libcrypt.so.1
    /usr/lib/libgssapi_krb5.so.2
    /usr/lib/libkrb5.so.3
    /usr/lib/libk5crypto.so.3
    /lib/libcom_err.so.2
    /usr/lib/libnss3.so
    /lib/i686/nosegneg/libc.so.6
    /lib/libdl.so.2
    /usr/lib/libkrb5support.so.0
    /lib/libkeyutils.so.1
    /usr/lib/libnssutil3.so
    /usr/lib/libplc4.so
    /usr/lib/libplds4.so
    /usr/lib/libnspr4.so
    /lib/i686/nosegneg/libpthread.so.0
    /lib/libselinux.so.1
    /lib/libsepol.so.1
    Copying libraries for /usr/local/bin/rssh.
    (0x0091d000)
    cp: cannot stat `(0x0091d000)': そのようなファイルやディレクトリはありません
    /lib/i686/nosegneg/libc.so.6
    Copying libraries for /usr/local/libexec/rssh_chroot_helper.
    (0x0085e000)
    cp: cannot stat `(0x0085e000)': そのようなファイルやディレクトリはありません
    /lib/i686/nosegneg/libc.so.6
    copying name service resolution libraries...
    tar: メンバ名から先頭の `/' を取り除きます
    tar: /lib/libnss1_files*: stat 不能: そのようなファイルやディレクトリはありません
    tar: 処理中にエラーが起きましたが、最後まで処理してからエラー終了させました
    lib/libnss_files-2.5.so
    lib/libnss_files.so.2
    Setting up /etc in the chroot jail
    cp: omitting directory `/etc/ld.so.conf.d'
    Chroot jail configuration completed.
    
    NOTE: if you are not using the passwd file for authentication,
    you may need to copy some of the /lib/libnss_* files into the jail.
    
    NOTE: you must MANUALLY edit your syslog rc script to start syslogd
    with appropriate options to log to /usr/local/rsshchrootskel/dev/log. In most cases,
    you will need to start syslog as:
    
    /sbin/syslogd -a /usr/local/rsshchrootskel/dev/log
    
    NOTE: we make no guarantee that ANY of this will work for you... if it
    doesn't, you're on your own. Sorry!
    
    

    4つほどエラーが発生しています。mkchroot.shではchrootに必要なコマンドをコピーしていますが、それらのコマンドに必要なライブラリ一式も同様にコピーしています。
    このエラーの後始末をしないとSCP/SFTPでログインしても直ぐに切断されてしまう挙動になります。

    運良くエラーが発生しなかった方は「■テストユーザーでデバッグ」まで読み飛ばしてしまってください。

    ■ chrootスケルトンディレクトリの作成 – いくつかのエラーが出た場合

    いくつかのエラーが発生した場合、手動で処理しないと
    クライアント側でこんなエラー

    $ scp test.txt hogea@hostname:.
    hogea@hostname password:
    lost connection
    

    とか、
    サーバー側でこんなエラー

    # grep rssh /var/log/messages
    Jan 9 12:41:04 web00 rssh[10757]: setting log facility to LOG_USER
    Jan 9 12:41:04 web00 rssh[10757]: allowing scp to all users
    Jan 9 03:41:04 web00 rssh_chroot_helper[10757]: new session for hoge, UID=1002
    Jan 9 12:41:04 web00 rssh[10757]: allowing sftp to all users
    Jan 9 03:41:04 web00 rssh_chroot_helper[10757]: user's home dir is /home/hoge
    Jan 9 12:41:04 web00 rssh[10757]: setting umask to 022
    Jan 9 03:41:04 web00 rssh_chroot_helper[10757]: couldn't find /home/hoge in chroot jail
    Jan 9 12:41:04 web00 rssh[10757]: line 54: configuring user hoge
    Jan 9 03:41:04 web00 rssh_chroot_helper[10757]: chrooted to /home/hoge
    Jan 9 12:41:04 web00 rssh[10757]: setting hoge's umask to 022
    Jan 9 03:41:04 web00 rssh_chroot_helper[10757]: changing working directory to / (inside jail)
    Jan 9 12:41:04 web00 rssh[10757]: allowing scp to user hoge
    Jan 9 03:41:04 web00 rssh_chroot_helper[10757]: execv() failed, /usr/bin/scp: No such file or directory
    Jan 9 12:41:04 web00 rssh[10757]: allowing sftp to user hoge
    Jan 9 12:41:04 web00 rssh[10757]: chrooting hoge to /home/hoge
    Jan 9 12:41:04 web00 rssh[10757]: chroot cmd line: /usr/local/libexec/rssh_chroot_helper 1 "scp -t ."
    

    とか言われて後で苦しむことになります。
    今のうちに片付けておきましょう。

    すべてのファイルがコピーされたかを確認していきます。
    では、1つ1つ確認していきます。
    まずは、mkchrootによってコピーされなければならないファイルです。

    ———- コピーされるファイル ———-
    —– コマンド —–
    ・/usr/bin/scp
    ・/usr/libexec/openssh/sftp-server
    ・/usr/local/bin/rssh
    ・/usr/local/libexec/rssh_chroot_helper
    —– ライブラリ —–
    コマンドに必要なライブラリ
    # ldd コマンドのフルパス
    で確認できます。
    —– ファイル —–
    ・/etc/passwd
    ・/etc/nsswitch.conf
    ・/etc/ld.so.conf
    ・/etc/ld.so.cache
    ——————–

    ■ chrootスケルトンディレクトリの作成 – コマンドの有無

    まずはコマンドの有無から確認していきます。

    # ls /usr/local/rsshchrootskel/usr/bin/scp
    /usr/local/rsshchrootskel/usr/bin/scp
    
    # ls /usr/local/rsshchrootskel/usr/libexec/openssh/sftp-server
    /usr/local/rsshchrootskel/usr/libexec/openssh/sftp-server
    
    # ls /usr/local/rsshchrootskel/usr/local/bin/rssh
    /usr/local/rsshchrootskel/usr/local/bin/rssh
    
    # ls /usr/local/rsshchrootskel/usr/local/libexec/rssh_chroot_helper
    /usr/local/rsshchrootskel/usr/local/libexec/rssh_chroot_helper
    

    私の環境ではすべてコピーされていました。
    (CentOS 5.2)
    存在しなかった場合は、手動でスケルトンディレクトリにコピーしてください。
    例)# cp /usr/bin/scp /usr/local/rsshchrootskel/usr/bin/scp

    ■ chrootスケルトンディレクトリの作成 – ライブラリの有無

    次は、ライブラリを確認していきます。

    # ldd /usr/bin/scp
    linux-gate.so.1 => (0x00198000)
    libresolv.so.2 => /lib/libresolv.so.2 (0x00341000)
    libcrypto.so.6 => /lib/libcrypto.so.6 (0x007ba000)
    libutil.so.1 => /lib/libutil.so.1 (0x00459000)
    libz.so.1 => /usr/lib/libz.so.1 (0x00110000)
    libnsl.so.1 => /lib/libnsl.so.1 (0x006f1000)
    libcrypt.so.1 => /lib/libcrypt.so.1 (0x00259000)
    libgssapi_krb5.so.2 => /usr/lib/libgssapi_krb5.so.2 (0x00d63000)
    libkrb5.so.3 => /usr/lib/libkrb5.so.3 (0x00659000)
    libk5crypto.so.3 => /usr/lib/libk5crypto.so.3 (0x005fb000)
    libcom_err.so.2 => /lib/libcom_err.so.2 (0x0036e000)
    libnss3.so => /usr/lib/libnss3.so (0x0045d000)
    libc.so.6 => /lib/i686/nosegneg/libc.so.6 (0x008ed000)
    libdl.so.2 => /lib/libdl.so.2 (0x00123000)
    libkrb5support.so.0 => /usr/lib/libkrb5support.so.0 (0x00127000)
    libkeyutils.so.1 => /lib/libkeyutils.so.1 (0x00130000)
    libnssutil3.so => /usr/lib/libnssutil3.so (0x00133000)
    libplc4.so => /usr/lib/libplc4.so (0x0014b000)
    libplds4.so => /usr/lib/libplds4.so (0x0014f000)
    libnspr4.so => /usr/lib/libnspr4.so (0x00152000)
    libpthread.so.0 => /lib/i686/nosegneg/libpthread.so.0 (0x00199000)
    /lib/ld-linux.so.2 (0x00b8d000)
    libselinux.so.1 => /lib/libselinux.so.1 (0x001b0000)
    libsepol.so.1 => /lib/libsepol.so.1 (0x001c8000)
    

    「=>」の右に表示されたライブラリが、そのコマンドに必要なものです。コピーされたかを確認していきます。

    # ls /usr/local/rsshchrootskel/lib/libresolv.so.2
    /usr/local/rsshchrootskel/lib/libresolv.so.2 (存在します
    # ls /usr/local/rsshchrootskel/lib/libcrypto.so.6
    /usr/local/rsshchrootskel/lib/libcrypto.so.6 (存在します
    ...
    ...
    

    このようにしてすべてのライブラリに対して存在を確認していきます。
    存在しないものがあれば、こちらもまたディレクトリ構成を壊さないようにchrootディレクトリにコピーします。
    私の環境の場合、「=>」の右側に/lib/**とか /usr/lib/** と、パスが表示されているライブラリに関しては問題なくコピーされていましたが、「=>」が表示されていないものに関してはコピーされていませんでした。1行目や、最後から3行前の赤い行です。その為にmkchroot.shもコピーに失敗していたようです。これらのライブラリもchrootに必要ですから手動でコピーします。

    # find / -name 'linux-gate.so.1'
    # find / -name 'ld-linux.so.2'
    /lib/ld-linux.so.2
    

    「linux-gate.so.1」の方は存在していなかったのでコピーしなくても問題ありません。
    「ld-linux.so.2」の方はコピーします。
    ディレクトリ構成を壊さないように注意。

    # mkdir -p /usr/local/rsshchrootskel/lib
    # cp /lib/ld-linux.so.2 /usr/local/rsshchrootskel/lib/
    

    この様にして、他3つのコマンドすべてのライブラリを確認してください。コピーされていなければコピーしてください。
    私の環境では、足りないライブラリは「ld-linux.so.2」のみでした。

    コピーも一通り完了したらテストにはいります。

    ■ テストユーザーでデバッグ

    ユーザーを追加してテストを行います。

    # adduser -s /usr/local/bin/rssh -d /home/hoge hoge
    # passwd hoge
    Changing password for user hoge.
    New UNIX password: hogehoge
    Retype new UNIX password: hogehoge
    passwd: all authentication tokens updated successfully.
    

    chrootスケルトンディレクトリをユーザーのホームディレクトリにコピーします。

    # cp -Rp /usr/local/rsshchrootskel/* /home/hoge/
    

    ここまで来たらほぼ完了です。リモートのクライアントから接続ができるかを確かめましょう。

    $ scp scptest.txt hoge@hogename:.
    hoge@hostname's password: ← パスワードを入力
    Couldn't open /dev/null: No such file or directorylost connection
    

    このエラーが表示されたらchrootは成功です。ファイルの転送はされてはいないものの chroot/dev/null を設置すれば動作するようになります。
    残念ながら「lost connection」というエラーメッセージが表示されてしまった場合は、chrootに何らかのファイルが足りない可能性が高いです。必要なコマンドやライブラリ、ファイルがコピーされているかをもう一度お確かめください。

    << | 1 | 2 | 3 | 4 | >>


  • rssh完全インストール – SCP/SFTPをchrootしよう!part.2 基本設定

    << | 1 | 2 | 3 | 4 | >>

    今回は、rssh の設定に入ります。
    rssh の設定はやや複雑です。

    まずは、設定ファイルの修正から。

    # vi /usr/local/etc/rssh.conf
    

    ■ 提供する機能の選定
    使いたい機能からコメントアウトを外します。

    ・rssh.conf

    allowscp
    allowsftp
    #allowcvs
    #allowrdist
    #allowrsync
    

    今回はSCPとSFTPを使う。

    ■ umaskの設定

    ・rssh.conf

    umask = 022
    

    アップロード後のパーミッション。
    通常は 022で問題ありません。

    ■ chrootpathの設定
    ここで指定したパスは、SCP/SFTPで接続された時のルートディレクトリとなります。
    クライアントはこのディレクトリより上層へ移動できません。

    ・rssh.conf

    chrootpath = /usr/local/chroot
    

    パスにスペースが含まれる場合はクォートで囲みます。

    ・rssh.conf

    chrootpath = "/usr/local/my chroot"
    

    chrootpath では、すべてのユーザーで共通で使われる設定です。
    ユーザーごとにchrootディレクトリや提供コマンドを変えたい場合は、次のような行を追加します。

    ・rssh.conf

    user=hoge:022:00011:/home/webusers/hoge
    user=hogehoge:022:00011:/home/webusers/hogehoge
    

    フォーマット: user=username:umask:access bit:chrootpath

    1ユーザーにつき1行追加します。

    アクセスビットは5個の 0/1 で、1 はコマンドが許可され、0 は許可されないことを意味します。
    左から、rsync, rdist, cvs, sftp, scp の順です。

    設定ファイルの修正は以上です。

    rssh.confの詳細は、man rssh.conf をご参照ください。

    ■ ログインシェルの変更/設定

    そして適用するユーザーのログインシェルを rssh 設定する必要があります。
    rsshは、サーバーデーモンとしてではなくログインシェルとして動作しますので、対象のユーザーのログインシェルを /usr/local/bin/rssh に変更する必要があります。

    その前に rssh を利用可能なログインシェルとしてOSに登録します。

    # echo "/usr/local/bin/rssh" >> /etc/shells
    

    *)CentOS/Fedora/RH/*BSD でも同じです。

    新しくユーザーを追加する場合は adduser に -s オプションでログインシェルを指定します。

    # adduser -s /usr/local/bin/rssh hoge
    

    (ユーザー追加コマンドはプラットフォーム毎に異なります)

    既存のユーザーに適用する場合は chsh を使います。

    # chsh -s /usr/local/bin/rssh hoge
    

    次回は chroot 必要なファイルを用意します。

    << | 1 | 2 | 3 | 4 | >>


  • rssh完全インストール – SCP/SFTPをchrootしよう!part.1 インストール

    OS : CentOS 5.2 i386 (Fedora / RH* / *BSD でもいけるはず)

    | 1 | 2 | 3 | 4 | >>

    rsshとは。

    ネットワークを介してファイル転送をしたい。
    しかし、FTPだとセキュリティに問題があるし、SSHのSCP/SFTPだとリモートシェルまで許してしまう。
    そんな時に使うものが rssh です。

    次のような要件の時に使います。

    ・FTPではセキュリティ面で問題がある。
    ・SCP/SFTPを使いたいがSSHではリモートシェルまで提供してしまう。

    rsshは、これらの要件を満たしてくれます。
    SSHのSCP/SFTPの機能、そしてOpenSSLで暗号さされたrsync, rdist, cvsを実装したもので、SSHのリモートシェルは許しません。
    更にchrootまで設定できます。
    (chroot:特定のディレクトリをルートディレクトリと見せる)

    セキュアなサーバーを構築したい時には便利です。

    ■ インストール

    # wget http://www.pizzashack.org/rssh/src/rssh-2.3.0.tar.gz
    # tar zxvf rssh-2.3.0.tar.gz
    # cd rssh-2.3.0
    # ./configure
    

    (–prefix=/usr/local/rssh を指定すると、後で mkchroot.sh を修正しなければならなくなる。)

    成功すると /usr/local にインストールされます。

    次回は、設定に入ります!

    | 1 | 2 | 3 | 4 | >>


  • configureでコケる

    configureがエラーを吐き停止する。

    # ./configure --prefix=****
    ...
    ...
    checking build system type... Invalid configuration `i686-pc-linux-': machine `i686-pc-linux' not recognized
    
    

    –build オプションにアーキテクチャを指定すると回避できる事がある。

    # ./configure --build=i686 --prefix=****
    

    もちろんアーキテクチャによって値を変える。


  • Apache2.2+PHP5.2 完全インストール – part2 – PHPインストール

    今回は PHP5.2 系列のインストールです。

    対象OS : CentOS, RH*, Fedora, FreeBSD, NetBSD, OpenBSD

    ※)途中 yum コマンドを使います。*BSD系OSの場合は yumの変わりにPortsツリーを使いインストールしてください。

    Apacheのインストール は 前回で済んでいるものとします。

    ■準備

    # cd /usr/local/src/web
    # tar zxvf php-5.2.8.tar.gz
    ...
    ...
    ...
    # cd php-5.2.8
    

    ■インストール

    # ./configure \
    --prefix=/usr/local/php5 \
    --with-apxs2=/usr/local/apache2/bin/apxs \
    --without-sqlite \
    --enable-mbstring \
    --enable-zend-multibyte \
    --enable-ftp \
    --enable-sockets \
    --with-mysql=/usr/local/mysql5 \
    --with-gd \
    --with-jpeg-dir \
    --with-png-dir \
    --with-freetype-dir \
    --with-zlib \
    --with-openssl
    

    ===============configureオプションの解説===============
    –prefix=/usr/local/php5 : インストール場所を指定
    –with-apxs2=/usr/local/apache2/bin/apxs :インストール済みのApacheと連動させる。
    (DSOもジュールを作成する)
    –without-sqlite :SQLiteを使わない
    –enable-mbstring :マルチバイト関数をインストールする
    –enable-zend-multibyte :Zendのマルチバイトエンジンを有効にする
    –enable-ftp :FTPプロトコルをサポートする
    –enable-sockets :socketをサポートする(HTTPとか)
    –with-mysql=/usr/local/mysql5 :MySQLをサポートする
    –with-gd :DBエンジンをサポートする
    –with-jpeg-dir :Jpegライブラリをサポートする
    –with-png-dir :pngライブラリをサポートする
    –with-freetype-dir :FreeTypeをサポートする
    –with-zlib :zLibをサポートする
    –with-openssl :SSLをサポートする (HTTPSとか)
    ==============================

    ■エラー:その1

    ...
    checkig libxml2 install dir... no
    checking for xml2-config path...
    configure: error: xml2-config not found. Please check your libxml2 installation.
    #
    

    PHP5のインストールには xml2ライブラリが必要です。 libxml2のライブラリとソースファイルをインストールします。

    # yum install -y libxml2 libxml2-devel
    

    ■エラー:その2

    ...
    checking for fabsf... yes
    checking for floorf... yes
    configure: error: libjpeg.(a|so) not found.
    #
    

    libjpegライブラリが見つかりません。インストールします。

    # yum install -y libjpeg libjpeg-devel
    

    ■エラー:その3

    ...
    checking for floorf... yes
    checking for jpeg_read_header in -ljpeg... yes
    configure: error: libpng.(a|so) not found.
    #
    

    libpngライブラリが見つかりません。インストールします。

    # yum install -y libpng libpng-devel
    

    ■エラー:その4

    ...
    checking for jpeg_read_header in -ljpeg... yes
    checking for png_write_image in -lpng... yes
    If configure fails try --with-xpm-dir=<DIR>
    configure: error: freetype.h not found.
    #
    

    freetype.h が見つかりません、FreeTypeのライブラリ+ヘッダファイルをインストールします。

    # yum install -y freetype freetype-devel
    
    ...
    checking for MySQL support... yes
    checking for specified location of the MySQL UNIX socket... no
    checking for MySQL UNIX socket location... no
    configure: error: Cannot find MySQL header files under /usr/local/mysql5.
    Note that the MySQL client library is not bundled anymore!
    #
    

    MySQL clientのヘッダファイルが見つかりません。–with-mysql で指定したディレクトリにMySQLがインストールされていない可能性があります。

    ※)MySQL は、内容が複雑ですので ソースからインストールする事が多くなっています。ソースからインストールされた場合は、MySQLのconfigureに指定した –prefix を –with-mysql= に指定してください。

    一応 yum からインストールする方法を記載します。

    # yum install mysql mysql-server mysql-devel
    

    ■コンパイル/インストール

    # make
    # make test
    # make install
    

    ・設定ファイルを設置

    # cp php.ini-dist /usr/local/php5/lib/php.ini
    

    ■設定

    ・AddTypeの追記

    インストールが完了すると、Apacheの httpd.conf に一行の記述が追加されます。

    ・httpd.conf

    LoadModule php5_module modules/libphp5.so
    

    ↓手動で1行追加

    LoadModule php5_module modules/libphp5.so
    AddType application/x-httpd-php .php .phtml
    

    この AddType では、どのような拡張子をPHPとして扱うかを指定します。
    .php という拡張子のファイルを PHPで処理させたければ、ここに .php と指定します。

    ・SELinux の設定

    そのままでは、Apache が libphp5.so を読み込む処理が SELinux によって抑制されてしまい、起動できません。

    # service httpd start
    
    httpd を起動中: httpd: Syntax error on line 53 of /usr/local/apache2/conf/httpd.conf: Cannot load /usr/local/apache2/modules/libphp5.so into server: /usr/local/apache2/modules/libphp5.so: cannot restore segment prot after reloc: Permission denied
    [失敗]
    #
    

    libphp5.so に対してのアクセスを許可します。

    # chcon -c -v -R -u system_u -r object_r -t textrel_shlib_t /usr/local/apache2/modules/libphp5.so
    

    後は、サーバー固有の設定になりますので、 httpd.conf や php.ini などを用途に見合った設定にすれば終了です。
    お疲れ様でした。

    << | 1 | 2 |


  • Apache2.2+PHP5.2 完全インストール – part1 – Apacheインストール

    さて今回は、サーバー構築のメジャーどころ。ウェブサーバーを構築します。

    対象OS : CentOS, RH*, Fedora, FreeBSD, NetBSD, OpenBSD

    ※)途中 yum コマンドを使います。*BSD系OSの場合は yumの変わりにPortsツリーを使いインストールしてください。

    ウェブサーバーの構築には、Apache 2.2 系列と、今をときめく PHP 5.2 系列を導入します。

    ■準備

    ・作業ディレクトリ作成

    # mkdir -p /usr/local/src/web
    # cd /usr/local/src/web
    

    ・httpd-2.2.11.tar.gz をダウンロード

    # wget http://ftp.riken.jp/net/apache/httpd/httpd-2.2.11.tar.gz
    

    ・php-5.2.8.tar.gz をダウンロード

    # wget http://jp.php.net/get/php-5.2.8.tar.gz/from/jp2.php.net/mirror
    

    ■Apache2.2.*のインストール

    ・Apacheを展開

    # tar zxvf httpd-2.2.11.tar.gz
    # cd httpd-2.2.11
    

    ・コンフィギュア

    # ./configure --prefix=/usr/local/apache2/ --enable-so --enable-rewrite --enable-ssl
    

    =====configure オプション詳細=====
    –prefix=/usr/local/apache2/ : インストール場所を /usr/local/apache2
    –enable-so : DSOモジュールを有効化
    –enable-rewrite : Rewriteを有効化。(リダイレクトなど)
    –enable-ssl : SSLを有効にする。
    ======================

    ■エラーがでたら・その1

    ...
    ...
    configure: error: in `/usr/local/src/web/httpd-2.2.11/srclib/apr':
    configure: error: no acceptable C compiler found in $PATH
    See `config.log' for more details.
    configure failed for srclib/apr
    #
    

    このエラーが出たら Cコンパイラが見当たらないという事なので、C コンパイラがインストールされていない可能性があります。CentOSを含む RHのクローンOS であれば、次のようにして Cコンパイラをインストールします。

    # yum install -y gcc gcc-c++
    

    インストールが完了したら、再度 configure。

    ■エラーがでたら・その2

    ...
    ...
    checking for openssl/ssl.h... no
    no OpenSSL headers found
    checking for SSL-C version... checking sslc.h usability... no
    checking sslc.h presence... no
    checking for sslc.h... no
    no SSL-C headers found
    configure: error: ...No recognized SSL/TLS toolkit detected
    #
    

    このエラーは、OpenSSLのヘッダファイルが見つからない事を意味します。OpenSSLのヘッダファイルをインストールします。

    # yum install -y openssl-devel
    

    インストールが完了したら、再度 configure。

    では、コンパイルします。

    ・コンパイル

    # make
    

    ・インストール

    # make install
    

    ■設定

    ・iptablesで80番ポートを開放 (RHのクローンの場合のみ)

    # vi /etc/sysconfig/iptables
    

    ・/etc/sysconfig/iptables

    # vi /etc/sysconfig/iptables
    
    ...
    -A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
    ...
    

    ↓追加

    ...
    -A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
    -A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
    ...
    

    ・iptables を再起動

    # service iptables restart
    

    ここまで進んだら、一度動作確認を行っておきます。
    ・Apacheの動作確認。

    # /usr/local/apache2/bin/apachectl start
    

    ブラウザを使い、http://IPアドレス/ にアクセスしてください。
    Apacheが正常に動作している事を示す「It works!」と表示されるハズです。

    確認できたらプロセスを一度終了させておきます。

    # /usr/local/apache2/bin/apachectl stop
    

    ・自動起動設定 – RHクローンの場合

    # cp build/rpm/httpd.init /etc/rc.d/init.d/httpd
    # chkconfig --add httpd
    # chkconfig httpd on
    

    そして、この httpd というファイルですが、$PREFIXを指定した構成でインストールした場合、httpd.conf のパスがデフォルトではなくなっているので、httpd内に記述された httpd.conf のパスがずれてしまいます。
    そのせいで、「設定ファイルがありません」などとエラーを吐きますので、正確なパスへと修正してください。

    このサイトページ通りにインストールした場合、httpd.conf のパスは /usr/local/apache2/conf/httpd.conf となります。

    同じように httpd コマンドへのパスも修正します。
    /usr/local/apache2/bin/httpd

    ・自動起動設定 – FreeBSD、NetBSD、OpenBSDの場合
    /etc/rc.local に次の行を追加します。

    # vi /etc/rc.local
    

    ========== /etc/rc.local (SSLなし) ==========

    # Apache
    if [ -x /usr/local/apache2/bin/apachectl ]; then
    echo -n ' Apache start\n';
    /usr/local/apache2/bin/apachectl start
    fi
    

    ========== /etc/rc.local (SSLあり) ==========

    # Apache
    if [ -x /usr/local/apache2/bin/apachectl ]; then
    echo -n ' Apache start\n';
    /usr/local/apache2/bin/apachectl startssl
    fi
    

    ■Apacheサーバー設定

    Apache2.2から設定ファイルの配置が変わりました。
    ベースの設定ファイルが $PREFIX/conf/httpd.conf というファイルで、種別ごとの詳細設定は $PREFIX/conf/extra/httpd-*.conf といったように、分割されました。

    ■Apacheサーバー設定 – CGIの利用
    CGIを利用する場合は、httpd.conf にあります。
    ・httpd.conf

    #AddHandler cgi-script .cgi
    

    という行の先頭のコメントアウトを外し、有効にします。

    ※)この場合、Perl以外にも /bin/sh や C言語で作成したCGIも実行されます。
    Perlのみに抑制したい場合は、mod_perl や File ディレクティブなどで制御してください。

    ■Apacheサーバー設定 – 最低限のセキュア設定。

    ・conf/extra/httpd-default.conf

    ServerSignature Off
    

    conf/extra/httpd-default.conf にあります、ServerSignature ディレクティブを On から Off に設定します。この ServerSignature では、404やディレクトリのインデックスを表示するページで、ApacheやOSのバージョンを出力するかを設定できます。Off とすることで出力を抑制できます。

    ServerTokens ProductOnly
    

    conf/extra/httpd-default.conf にあります、ServerTokens ディレクティブを Full から ProductOnly に設定します。 ServerTokens では、HTTPヘッダにApacheのバージョン番号を含めるかを指定します。Apacheのバージョンはセキュリティの為に、公開しない方が望ましいでしょう。

    次回は、PHPをインストールします。

    | 1 | 2 | >>


  • Xen – ゲストOSに複数のNICを認識させる

    今回は、XenのゲストOSに eth0、eth1 などの複数のネットワークインターフェイスを割り当てます。

    (まだ Xen のインストールもご紹介いていませんが・・・)

    次のような要件の時に必要になります。

    ・ゲストOSを 複数のネットワークセグメントに参加させたい場合。
    ・限りあるグローバルIPアドレスを、サービスを提供するゲストOSだけに割り当てたい場合。

    では、どのようにして追加するのでしょうか。
    まずは、大まかな流れから。

    1. ホストOSに2枚目以降のブリッジデバイスを追加。
    2. xend 再起動。
    3. ゲストOSのインストール、または再設定。

    このような流れになります。
    次は、実際にやってみます。

    ■ 1.ホストOSに2枚目以降のブリッジデバイスを追加

    通常、Xenを起動する時は、/etc/xen/scripts/network-bridge というスクリプトが走ります。network-bridgeは、xenbr0 というブリッジデバイをOSにエントリします。デフォルトでは network-bridge は、xenbr0 というブリッジデバイスを1つだけ登録します。このブリッジデバイスは、ホストOSが接続されている物理ネットワークセグメントに ゲストOSを参加させ るのに必要です。ホストOSとゲストOSのブリッジのような働きをします。

    そして、ゲストOSで複数のNICを利用したい場合は、ネットワークインターフェイス分だけ ブリッジデバイスを用意します。

    まずは、ブリッジデバイスの用意。
    ブリッジデバイス制御スクリプトを /etc/xen/scripts/network-bridge から /etc/xen/scripts/network-bridge.multi に変更します。

    
    # vi /etc/xen/xend-config.sxp
    
    
    
    ...
    (network-script network-bridge)
    ...
    

    ↓修正

    
    ...
    (network-script network-bridge.multi)
    ...
    
    

    そして、 /etc/xen/scripts/network-bridge.multi を用意します。

    # vi /etc/xen/scripts/network-bridge.multi
    
    
     #!/bin/sh
     set -e
    
    OP=$1
     shift
    
    script=/etc/xen/scripts/network-bridge
    
    case ${OP} in
     start)
     $script start vifnum=0 bridge=xenbr0 netdev=eth0
     $script start vifnum=1 bridge=xenbr1 netdev=eth1
     $script start vifnum=2 bridge=xenbr2 netdev=eth2
     ;;
    
    stop)
     $script stop vifnum=0 bridge=xenbr0 netdev=eth0
     $script stop vifnum=1 bridge=xenbr1 netdev=eth1
     $script stop vifnum=2 bridge=xenbr2 netdev=eth2
     ;;
    
    status)
     $script status vifnum=0 bridge=xenbr0 netdev=eth0
     $script status vifnum=1 bridge=xenbr1 netdev=eth1
     $script status vifnum=2 bridge=xenbr2 netdev=eth2
     ;;
    
    *)
     echo 'Unknown command: ' ${OP}
     echo 'Valid commands are: start, stop, status'
     exit 1
     esac
    

    実行権限を付与。

    
    # chmod +x /etc/xen/scripts/network-bridge.multi
    
    

    ■ 2. xend 再起動

    そして、xend を再起動します。

    
    # service xend restart
    
    

    これで、xenbr0、xenbr1、xenbr2 という3つのブリッジデバイスが用意できました。
    ifconfig で確認できます。

    
    # ifconfig
    
    

    ■ 3. ゲストOSのインストール、または再設定

    次は、ゲストOSのインストールです。

    
    # virt-install -n guestos01 -r 500 --vcpus=1 \
      -f /dev/VolGroup00/guestos01 --nographics \
      -l http://ftp.riken.jp/Linux/centos/5.2/os/i386/ \
      -m 00:16:3e:51:59:f2 -b xenbr0 \
      -m 00:16:3e:51:59:f3 -b xenbr1
    

    この様に「-m」オプションと「-b」オプションで、MACアドレスとブリッジデバイスを2つずつ指定します。

    これで、ゲストOSがNIC2毎を認識してくれるので、あとは、通常のNIC2枚刺しの時のようにインストール作業を進めることができます。

    既存のゲストOSにNICを追加する場合は、xm console <name> などとして、コンソールから作業をした方が、ネットワークの設定を安全に行えます。

    ちなみに、「-m」 で指定する仮想NICのMACアドレスは、割り当てるIPv4アドレスの 下8ビットを16進数に変換して割り当ててます。そうする事でMACアドレスのバッディングを防げます。


  • ファイルディスクリプタの上限管理

    Apache on CentOS で大量のバーチャルホストを設定したら次の様なエラーが出ました。

     [Fri Sep 04 23:17:11 2009] [error] (24)Too many open files: could not open transfer log file /var/log/httpd/aaaaaaaaaauo-access_log.
     [Fri Sep 04 23:18:18 2009] [error] (24)Too many open files: could not open transfer log file /var/log/httpd/aaaaaaaaaauo-access_log.
     

    「開くファイルが多すぎるてこれ以上開けない」という内容っぽいです。どうやらCentOSが同時に開けるファイル数を越えてしまったようです。

     # cat /proc/sys/fs/file-nr
     1728    0    22560
     

    左から、現在割り当てられているディスクリプタ数、使用中のディスクリプタ数、OSの上限ディスクリプタ数。

     # vi /etc/sysctl.conf
    
     -----sysctl.conf-----
     fs.file-max = 45120
     ---------------
     

    と設定し、

    # sysctl -p

    で適用。
    再度確認。

     # cat /proc/sys/fs/file-nr
     1728    0    45120
     

    ■ユーザごとのディスクリプタの上限

     # ulimit -n
     1024
     

    増やす。
    最終行に追記。

     # vi /etc/security/limits.conf
     -----limits.conf-----
     root    soft    nofile  44769
     root    hard    nofile  44769
     ----------------------
     

    再ログインして確認。

     # ulimit -n
     44769
     

  • 続・自前でRBLのDBを作ってみました。

    「<a href=”http://dage.jp/diary/2009/07/16/16/”>自前でRBLのDBを作ってみました。</a>」 という前回の記事で独自RBLを作っているとお伝えしました。

    その後、IPAddressのマッチングパターンによるバグを修正し、正しいIPAddressを抜けるようになりました。
    1日で 54件 でした。

    ---------- 昨日1日の収穫 ----------
    41.117.184.xxx
    41.178.237.xxx
    58.42.167.xxx
    59.96.209.xxx
    60.166.179.xxx
    69.51.103.xxx
    72.24.65.xxx
    75.208.188.xxx
    76.73.235.xxx
    78.160.99.xxx
    78.183.69.xxx
    79.103.201.xxx
    79.20.137.xxx
    83.31.46.xxx
    84.30.132.xxx
    85.107.132.xxx
    85.110.142.xxx
    85.160.29.xxx
    85.247.32.xxx
    88.233.171.xxx
    88.241.237.xxx
    88.78.30.xxx
    92.49.160.xxx
    94.99.225.xxx
    95.135.205.xxx
    95.52.69.xxx
    110.37.12.xxx
    113.53.170.xxx
    115.171.185.xxx
    116.121.203.xxx
    123.18.156.xxx
    123.20.0.xxx
    123.24.92.xxx
    123.245.196.xxx
    186.12.61.xxx
    187.13.199.xxx
    189.105.132.xxx
    189.11.98.xxx
    189.143.79.xxx
    189.78.37.xxx
    189.97.12.xxx
    189.99.59.xxx
    190.134.153.xxx
    190.253.242.xxx
    190.51.80.xxx
    190.66.187.xxx
    190.67.212.xxx
    200.163.62.xxx
    201.137.190.xxx
    201.240.235.xxx
    201.78.222.xxx
    201.8.253.xxx
    201.86.243.xxx
    218.64.142.xxx
    --------------------
    

    以上、規模を大きくすればもっと多くのブラックリストが作成出来そうです。


  • 自前でRBLのDBを作ってみました。

    自前でRBLのDBを作ってみました。

    自分が管理している複数のドメインに<strong>仕掛け</strong>となるメールアドレスを作成し、HTMLでも表示されない箇所にメールアドレスを記載して、ネット上にアップロードしておきます。このメールアドレス宛にメッセージが送信された場合、それは自動巡回プログラムがメールアドレスを自動的に拾い送信された未承諾広告である事を意味します。いわゆるスパムです。

    一方メールサーバーの方では、仕掛けアドレスに送信された場合、ブラックリストDBに送信元のメールサーバーのIPアドレスを保存しておくという仕組み。新しいIPアドレスがブラックリストに追加されたタイミングでDNSサーバー(Bind)のゾーンファイルを書き換えてリロードする。

    これでRBLのデータベースが完成~!
    同時にホワイトリストを管理するためのインターフェイスも用意して運用開始!

    2日間で収集したIPアドレス、107件。

    --------------------
    41.214.69.xxx
    41.251.4.xxx
    58.11.86.xxx
    58.243.90.xxx
    58.247.28.xxx
    58.46.6.xxx
    70.216.147.xxx
    77.35.179.xxx
    78.132.173.xxx
    78.134.84.xxx
    78.145.49.xxx
    78.160.151.xxx
    78.168.121.xxx
    79.119.19.xxx
    79.186.38.xxx
    79.46.231.xxx
    82.101.147.xxx
    82.56.79.xxx
    83.10.108.xxx
    83.11.107.xxx
    83.26.235.xxx
    83.52.171.xxx
    84.126.22.xxx
    85.108.77.xxx
    85.108.78.xxx
    85.84.208.xxx
    85.98.80.xxx
    86.70.45.xxx
    87.70.186.xxx
    87.8.50.xxx
    89.123.152.xxx
    89.132.53.xxx
    90.151.135.xxx
    91.164.100.xxx
    93.94.179.xxx
    94.122.245.xxx
    94.179.7.xxx
    94.181.56.xxx
    94.250.79.xxx
    95.132.131.xxx
    95.132.155.xxx
    98.150.154.xxx
    113.112.57.xxx
    113.88.170.xxx
    114.236.80.xxx
    115.184.137.xxx
    115.240.179.xxx
    115.60.174.xxx
    115.75.16.xxx
    115.75.29.xxx
    118.68.45.xxx
    119.176.3.xxx
    119.7.140.xxx
    120.10.154.xxx
    121.121.62.xxx
    121.230.202.xxx
    121.247.230.xxx
    121.247.48.xxx
    122.139.132.xxx
    122.167.97.xxx
    123.168.176.xxx
    123.18.124.xxx
    123.18.96.xxx
    123.19.122.xxx
    123.19.183.xxx
    123.20.239.xxx
    123.22.21.xxx
    123.24.159.xxx
    123.7.117.xxx
    124.161.168.xxx
    124.72.42.xxx
    125.126.202.xxx
    125.161.8.xxx
    125.167.97.xxx
    151.53.184.xxx
    187.10.170.xxx
    187.35.250.xxx
    188.48.72.xxx
    189.104.180.xxx
    189.135.219.xxx
    189.15.119.xxx
    189.15.141.xxx
    189.15.148.xxx
    189.15.243.xxx
    189.47.43.xxx
    189.7.45.xxx
    189.71.199.xxx
    189.81.186.xxx
    189.83.55.xxx
    190.149.9.xxx
    190.208.92.xxx
    190.42.38.xxx
    190.49.102.xxx
    190.71.179.xxx
    196.207.248.xxx
    200.243.7.xxx
    201.11.100.xxx
    201.236.117.xxx
    201.236.127.xxx
    201.68.30.xxx
    201.68.32.xxx
    213.55.71.xxx
    218.58.17.xxx
    220.184.193.xxx
    222.124.190.xxx
    222.131.236.xxx
    222.208.79.xxx
    --------------------
    

    ■今後の改善、修正案。
    現時点ではメールヘッダからIPアドレスを取得していますが、IPアドレスを抽出するパターンのマッチングがおかしくてIPアドレスの末尾に改行が入ったり、数字が入ったりしてます。
    これを改善したら運用後、RBLを一般公開もするかも知れません。

    規模を拡大すればある程度信頼のありそうなRDBサーバーが作れそうです。