ssh のシェル利用を制限し、chrootして安全にファイル転送を行う環境を rssh で作ってみた。
sftp や scp を使ってファイルを安全に転送したいけど、ssh接続でのシェルの利用は許可したくないし、特定の領域にしかアクセスさせたくないような場合に使う。rssh は rsync も使えるでファイルの同期に便利。
ファイル転送を安全に行う方法として、FTPS(FTP over SSL)の利用も考えられるが、FTPSについては『FTPS(FTP over SSL)環境構築』を参照。
名称 | バージョン | 備考 |
---|---|---|
Solaris x86 | 10 | |
rssh | 2.3.2 | 2006.11.09時点での最新版。 今回は、CSWパッケージを使用した。 CSWパッケージについては、『Solarisへのフリーソフトのインストール方法』参照。 |
OpenSSH | 4.3p2 | 今回は、CSWパッケージを使用した。 CSWパッケージについては、『Solarisへのフリーソフトのインストール方法』参照。 |
rsync | 2.6.8 | 今回は、Freeware for Solaris のパッケージを使用した。 Freeware for Solaris については、『Solarisへのフリーソフトのインストール方法』参照。 |
今回は、パッケージを入れるだけなので割愛。
sftp-serverも動くように設定しておく。
Solaris 10 標準のSSHが動いている場合はそれを止めて、CSWパッケージのOpenSSHで入れたrcスクリプトを動かすだけなので、詳細は割愛。(確認はしていないが、Solaris 10 標準のSSHでも動くものと思われる。)
まずは、付属ドキュメントCHROOTの和訳『rsshでのchroot jailの設定』に目を通しておく。
allowscp ← scp を利用可能にする allowsftp ← sftp を利用可能にする allowrsync ← rsync を利用可能にする chrootpath = /usr/local/chroot ← chroot先のディレクトリ
以下の手順でchroot先のディレクトリに必要なファイルをコピー(または、作成)する。
まずは、rsshのソースに付属している mkchroot.sh を利用して必要なファイルをコピーする(ソースは別途入手しておく)。
mkchroot.sh に、各コマンドへのパスが書かれている部分があるので、環境に合わせて変更する。
scp_path="/opt/csw/bin/scp" sftp_server_path="/opt/csw/libexec/sftp-server" rssh_path="/opt/csw/bin/rssh" chroot_helper_path="/opt/csw/libexec/rssh_chroot_helper"
mkchroot.sh を実行してファイルをコピーする。
# bash mkchroot.sh /usr/local/chroot ← 引数にはchroot先のディレクトリを指定する
Creating root jail directory.
NOT changing owner of root jail.
NOT changing perms of root jail.
setting up /usr/local/chroot/opt/csw/bin
setting up /usr/local/chroot/opt/csw/libexec
setting up /usr/local/chroot/opt/csw/libexec
Copying libraries for /opt/csw/bin/scp.
/opt/csw/lib/libcrypto.so.0.9.8
/lib/librt.so.1
/lib/libsocket.so.1
/lib/libc.so.1
/lib/libnsl.so.1
/lib/libdl.so.1
/lib/libaio.so.1
/lib/libmd5.so.1
/lib/libmp.so.2
/lib/libscf.so.1
/lib/libdoor.so.1
/lib/libuutil.so.1
/lib/libm.so.2
Copying libraries for /opt/csw/libexec/sftp-server.
/opt/csw/lib/libcrypto.so.0.9.8
/lib/librt.so.1
/lib/libsocket.so.1
/lib/libc.so.1
/lib/libnsl.so.1
/lib/libdl.so.1
/lib/libaio.so.1
/lib/libmd5.so.1
/lib/libmp.so.2
/lib/libscf.so.1
/lib/libdoor.so.1
/lib/libuutil.so.1
/lib/libm.so.2
Copying libraries for /opt/csw/bin/rssh.
/lib/libc.so.1
/lib/libm.so.2
Copying libraries for /opt/csw/libexec/rssh_chroot_helper.
/lib/libc.so.1
/lib/libm.so.2
copying name service resolution libraries...
tar: Removing leading `/' from member names
tar: /lib/libnss_files*: Cannot stat: ファイルもディレクトリもありません。
tar: /lib/libnss1_files*: Cannot stat: ファイルもディレクトリもありません。
tar: Error exit delayed from previous errors
Setting up /etc in the chroot jail
cp: /etc/ld.* を使用できません。
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/chroot/dev/log. In most cases,
you will need to start syslog as:
/sbin/syslogd -a /usr/local/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!
mkchroot.sh を実行してコピーされたファイルを以下に示す。
# ls -R /usr/local/chroot /usr/local/chroot: dev/ etc/ lib/ opt/ /usr/local/chroot/dev: /usr/local/chroot/etc: nsswitch.conf passwd /usr/local/chroot/lib: libaio.so.1* libdoor.so.1* libmp.so.2* libscf.so.1* libc.so.1* libm.so.2* libnsl.so.1* libsocket.so.1* libdl.so.1* libmd5.so.1* librt.so.1* libuutil.so.1* /usr/local/chroot/opt: csw/ /usr/local/chroot/opt/csw: bin/ lib/ libexec/ /usr/local/chroot/opt/csw/bin: rssh* scp* /usr/local/chroot/opt/csw/lib: libcrypto.so.0.9.8* /usr/local/chroot/opt/csw/libexec: rssh_chroot_helper* sftp-server*
etc/passwd ファイルには、rsshを使用してchrootするユーザ情報のみを入れるようにする。よって、この段階では空にしておく。
# cd /usr/local/chroot # cp /dev/null etc/passwd
次に、mkchroot.sh ではコピーできなかったファイルをコピーする。
手動でコピーするファイルを以下に示す。
bin/ksh lib/libcmd.so.1 lib/libsecdb.so.1 usr/lib/ld.so.1 usr/lib/nss_files.so.1
実行したコマンドを以下に示す。
# mkdir bin # cp /bin/ksh bin # cp /lib/libcmd.so.1 lib # cp /lib/libsecdb.so.1 lib # mkdir -p usr/lib # cp /usr/lib/ld.so.1 usr/lib # cp /usr/lib/nss_files.so.1 usr/lib
dev/null も必要なので作成する。
# ls -lL /dev/null crw-rw-rw- 1 root sys 13, 2 11月 10日 20:29 /dev/null # mknod dev/null c 13 2 # chmod 666 dev/null # ls -l dev 合計 0 crw-rw-rw- 1 root root 13, 2 11月 10日 20:29 null
ここまでの作業で scp と sftp が利用可能可能になるが、rsync も利用する場合は、rsync のバイナリファイルと必要なライブラリファイルをコピーする。
# ldd /usr/local/bin/rsync libpopt.so.0 => /usr/local/lib/libpopt.so.0 libiconv.so.2 => /usr/local/lib/libiconv.so.2 libsocket.so.1 => /usr/lib/libsocket.so.1 libnsl.so.1 => /usr/lib/libnsl.so.1 libc.so.1 => /usr/lib/libc.so.1 libgcc_s.so.1 => /usr/local/lib/libgcc_s.so.1 libmp.so.2 => /lib/libmp.so.2 libmd5.so.1 => /lib/libmd5.so.1 libscf.so.1 => /lib/libscf.so.1 libdoor.so.1 => /lib/libdoor.so.1 libuutil.so.1 => /lib/libuutil.so.1 libm.so.2 => /lib/libm.so.2 # cp /usr/local/bin/rsync opt/csw/bin # mkdir -p usr/local/lib # cp /usr/local/lib/libpopt.so.0 usr/local/lib # cp /usr/local/lib/libiconv.so.2 usr/local/lib # cp /usr/local/lib/libgcc_s.so.1 usr/local/lib
chrootするユーザ用のベースディレクトリを作成しておく。
chroot先にホームディレクトリを持たない場合は作成する必要がないが、その場合はchroot先のルートディレクトリがホームディレクトリになる。
# mkdir home
これまでの作業で作成したファイルの一覧を以下に示す。
# pwd /usr/local/chroot # ls -R hamachi{root}171# ls -R .: bin/ dev/ etc/ home/ lib/ opt/ usr/ ./bin: ksh* ./dev: null ./etc: nsswitch.conf passwd ./home: ./lib: libaio.so.1* libdl.so.1* libmd5.so.1* librt.so.1* libsocket.so.1* libc.so.1* libdoor.so.1* libmp.so.2* libscf.so.1* libuutil.so.1* libcmd.so.1* libm.so.2* libnsl.so.1* libsecdb.so.1* ./opt: csw/ ./opt/csw: bin/ lib/ libexec/ ./opt/csw/bin: rssh* rsync* scp* ./opt/csw/lib: libcrypto.so.0.9.8* ./opt/csw/libexec: rssh_chroot_helper* sftp-server* ./usr: lib/ local/ ./usr/lib: ld.so.1* nss_files.so.1* ./usr/local: lib/ ./usr/local/lib: libgcc_s.so.1 libiconv.so.2* libpopt.so.0*
rsshを使用してchrootするユーザを登録する。(必要に応じてグループも)
# groupadd rsshgrp # useradd -c "rssh user" -d /usr/local/chroot/home/rsshuser -g rsshgrp -m -s /opt/csw/bin/rssh rsshuser 64 ブロック
chroot先の etc/passwd ファイル(/usr/local/chroot/etc/passwd)にも登録したユーザ情報を書き込む。
この際、chroot先の etc/passwd ファイルのホームディレクトリの情報は使用されないので、chroot内の情報に書き換えておくと良い。
例えば以下のような感じ。
rsshuser:x:3000:2000:rssh user:/home/rsshuser:/opt/csw/bin/rssh
また、必要があれば etc/group ファイルにも情報を書き込んでおく。(etc/group ファイルは無くても良い。)
ログは、rssh.conf の "logfacility" で指定した facility に出力される。デフォルトは "LOG_USER" 。