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