rssh は ssh (1)を利用したアクセスのうち scp (1)や sftp (1)といった特定のコマンドのみの実行を許可したり chroot 環境を提供するログインシェルで、セキュアなファイル転送は提供したいがシェルアカウントへのログインを拒否したい場合などに非常に有効なログインシェルです。
scp (1)や sftp (1)のみの実行を許可する場合はアカウントのログインシェルを rssh に変更して設定ファイルで実行を許可するコマンドを指定するだけで設定は完了します。
しかし chroot 環境を提供する場合はそのための環境設定が必要なのでその手順です。
ここでは chroot するディレクトリを /path/to/chroot として記述しています。
rssh のインストール
CentOS 6 では yum (1)から導入可能です。
$ sudo yum -y install rssh
:
:
インストール:
rssh.x86_64 0:2.3.4-1.el6
完了しました!
設定ファイルの編集
ssp (1)、 sftp (1)のアクセスを許可し chroot するディレクトリを指定します。
# This is the default rssh config file
# set the log facility. "LOG_USER" and "user" are equivalent.
logfacility = LOG_USER
# Leave these all commented out to make the default action for rssh to lock
# users out completely...
allowscp # scpを許可
allowsftp # sftpを許可
#allowcvs
#allowrdist
#allowrsync
# set the default umask
umask = 022
# If you want to chroot users, use this to set the directory where the root of
# the chroot jail will be located.
#
# if you DO NOT want to chroot users, LEAVE THIS COMMENTED OUT.
chrootpath = /path/to/chroot # chroot先ディレクトリ
# You can quote anywhere, but quotes not required unless the path contains a
# space... as in this example.
#chrootpath = "/usr/local/my chroot"
##########################################
# EXAMPLES of configuring per-user options
:
:
:
chroot 環境の初期設定
rssh に附属のスクリプトで chroot 環境の初期構築を行います。
いくつかエラーが表示されますがここでは気にしなくても大丈夫です。
$ sudo sh /usr/share/doc/rssh-2.3.4/mkchroot.sh /path/to/chroot
NOT changing owner of root jail.
NOT changing perms of root jail.
setting up /opt/chroot/usr/bin
setting up /opt/chroot/usr/libexec/openssh
setting up /opt/chroot/usr/libexec
Copying libraries for /usr/bin/scp.
(0x00007fff541ff000)
cp: cannot stat `(0x00007fff541ff000)': そのようなファイルやディレクトリはありません
:
:
Copying libraries for /usr/libexec/openssh/sftp-server.
(0x00007fff577f1000)
cp: cannot stat `(0x00007fff577f1000)': そのようなファイルやディレクトリはありません
:
:
Copying libraries for /usr/bin/rssh.
(0x00007fff00bff000)
cp: cannot stat `(0x00007fff00bff000)': そのようなファイルやディレクトリはありません
/lib64/libc.so.6
Copying libraries for /usr/libexec/rssh_chroot_helper.
(0x00007fff3e152000)
cp: cannot stat `(0x00007fff3e152000)': そのようなファイルやディレクトリはありません
/lib64/libc.so.6
copying name service resolution libraries...
tar: メンバ名から先頭の `/' を取り除きます
tar: /lib/libnss_files*: stat 不能: そのようなファイルやディレクトリはありません
tar: /lib/libnss1_files*: stat 不能: そのようなファイルやディレクトリはありません
tar: 前のエラーにより失敗ステータスで終了します
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 /opt/chroot/dev/log. In most cases,
you will need to start syslog as:
/sbin/syslogd -a /opt/chroot/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!
環境構築の続き
附属のスクリプトでメッセージに表示されている処理やエラーで完結できなかった処理などを実行して環境を構築します。
/dev/null の作成
まず chroot 環境に /dev/null を作成します。
$ ls -l /dev/null
crw-rw-rw-. 1 root root 1, 3 8月 26 10:58 2015 /dev/null
$ sudo mknod /path/to/chroot/dev/null c 1 3
$ sudo chmod 666 /path/to/chroot/dev/null
$ ls -l /path/to/chroot/dev/null
crw-rw-rw-. 1 root root 1, 3 8月 26 11:59 2015 /opt/chroot/dev/null
ライブラリのコピー
次にライブラリをコピーします。
附属のスクリプトのエラーメッセージから ldd (1)で参照されたライブラリのうちいくつかがコピーできていない事が確認できるので手動でコピーします。
chroot 環境にコピーされるのは以下のコマンドなので、それぞれのコマンドの ldd (1)の結果を参照して不足しているライブラリをコピーします。
- /usr/bin/scp
- /usr/libexec/openssh/sftp-server
- /usr/bin/rssh
- /usr/libexec/rssh_chroot_helper
ldd (1)の出力結果からコピーが必要なライブラリを決定しているのですが linux-vdso.so.1 と ld-linux-x86-64.so.2 は表示形式が通常と異なっているためにコピーできていない様です。
$ ldd /usr/bin/scp
linux-vdso.so.1 => (0x00007ffef53f0000)
libcrypto.so.10 => /usr/lib64/libcrypto.so.10 (0x00007fbd8e06a000)
libutil.so.1 => /lib64/libutil.so.1 (0x00007fbd8de67000)
libz.so.1 => /lib64/libz.so.1 (0x00007fbd8dc50000)
libnsl.so.1 => /lib64/libnsl.so.1 (0x00007fbd8da37000)
libcrypt.so.1 => /lib64/libcrypt.so.1 (0x00007fbd8d800000)
libresolv.so.2 => /lib64/libresolv.so.2 (0x00007fbd8d5e5000)
libgssapi_krb5.so.2 => /lib64/libgssapi_krb5.so.2 (0x00007fbd8d3a1000)
libkrb5.so.3 => /lib64/libkrb5.so.3 (0x00007fbd8d0ba000)
libk5crypto.so.3 => /lib64/libk5crypto.so.3 (0x00007fbd8ce8d000)
libcom_err.so.2 => /lib64/libcom_err.so.2 (0x00007fbd8cc89000)
libnss3.so => /usr/lib64/libnss3.so (0x00007fbd8c94a000)
libc.so.6 => /lib64/libc.so.6 (0x00007fbd8c5b5000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007fbd8c3b1000)
libfreebl3.so => /lib64/libfreebl3.so (0x00007fbd8c1ae000)
libkrb5support.so.0 => /lib64/libkrb5support.so.0 (0x00007fbd8bfa2000)
libkeyutils.so.1 => /lib64/libkeyutils.so.1 (0x00007fbd8bd9f000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007fbd8bb82000)
/lib64/ld-linux-x86-64.so.2 (0x00007fbd8e662000)
libnssutil3.so => /usr/lib64/libnssutil3.so (0x00007fbd8b955000)
libplc4.so => /lib64/libplc4.so (0x00007fbd8b750000)
libplds4.so => /lib64/libplds4.so (0x00007fbd8b54c000)
libnspr4.so => /lib64/libnspr4.so (0x00007fbd8b30d000)
libselinux.so.1 => /lib64/libselinux.so.1 (0x00007fbd8b0ee000)
librt.so.1 => /lib64/librt.so.1 (0x00007fbd8aee5000)
$ ldd /usr/libexec/openssh/sftp-server
:
:
$ ldd /usr/bin/rssh
:
:
$ ldd /usr/libexec/rssh_chroot_helper
:
:
linux-vdso.so.1 は各プログラムのアドレス空間のみに常駐する Virtual Dynamic Shared Object なので実体は存在しなくて問題ありません。
それ以外に不足しているライブラリ(今回は ld-linux-x86-64.so.2 )を chroot 環境にコピーします。
$ sudo cp /lib64/ld-linux-x86-64.so.2 /path/to/chroot/lib64
認証関係のファイルコピー
附属のスクリプトでメッセージに表示されてる様に認証処理で必要な libnss_* をコピーします。
$ sudo cp -p /lib64/libnss_files.so.2 /path/to/chroot/lib64
これで chroot された環境に scp (1)、 sftp (1) での アクセスが可能となります。
動作確認
ログインシェルの変更
chroot するユーザのログインシェルを rssh (1)に変更します。
$ sudo chsh -s /usr/bin/rssh ユーザーID
sftp でアクセス確認
sftp (1)でアクセスして確認します。
sftp ユーザID@localhost
Connecting to localhost...
ユーザID@localhost's password:
sftp> pwd
Remote working directory: /
sftp> exit