rsshを使った安全なファイル転送(sshのシェル利用制限とchroot)

最終更新日:2006年11月10日

はじめに

概要

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へのフリーソフトのインストール方法』参照。
※ 依存関係のあるパッケージも入れる必要があるので、適宜対応する。

インストール

今回は、パッケージを入れるだけなので割愛。

OpenSSH の設定

sftp-serverも動くように設定しておく。
Solaris 10 標準のSSHが動いている場合はそれを止めて、CSWパッケージのOpenSSHで入れたrcスクリプトを動かすだけなので、詳細は割愛。(確認はしていないが、Solaris 10 標準のSSHでも動くものと思われる。)

rssh の設定

まずは、付属ドキュメントCHROOTの和訳『rsshでのchroot jailの設定』に目を通しておく。

rssh.conf 変更

/opt/csw/etc/rssh.conf を変更する。
今回は、とりあえず以下の行のコメントを外して、scp, sftp, rsync を利用可能にした(ユーザ毎の個別設定も出来るので、必要に応じて設定する)。
設定の詳細は、man rssh.conf の和訳を参照。
allowscp                          ← scp を利用可能にする
allowsftp                         ← sftp を利用可能にする
allowrsync                        ← rsync を利用可能にする
chrootpath = /usr/local/chroot    ← chroot先のディレクトリ

chrootに必要なファイルのコピー

以下の手順でchroot先のディレクトリに必要なファイルをコピー(または、作成)する。

mkchroot.sh でファイルをコピー

まずは、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 内でwhoamiコマンドを呼んでいるので、実行時に /usr/ucb にPATHを通しておくか、`whoami` の部分を `/usr/ucb/whoami` とフルパスに変更しておく必要がある。

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 はLinux用に作られているので、bash を使う。

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 ファイルを空にする

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
※ sftp 接続した時にグループ名も表示させたい場合は、etc/group ファイルも必要。

dev/null作成

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

rsync に必要なファイルのコピー

ここまでの作業で 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
※ CSWパッケージのrsshは、opt/csw/bin の下の rsync を見に行く。

chrootユーザ用のベースディレクトリ作成(必要に応じて)

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" 。