• 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 | >>