sftp+rsshでchrootする方法

ubuntu8.04サーバーのテスト環境で動くまで3時間くらいハマって発狂しかけたのでメモ。

rsshをインストール

特に難しいことはなく、

$ sudo apt-get install rssh

でインストールされる。

rsshの設定。

これも特に難しい事は無い。
/etc/rssh.confを開いて

allowscp
allowsftp
user=hoge:011:00011:/home/hoge

を設定すれば良い。
allowscpとallowsftpは行頭のコメントを外す。
user=〜の部分は新しく書き足す。
user=〜の部分は前から

  • ユーザー名
  • umask値
  • access bit(rsync,rdist,cvs,sftp,scpの順。1で許可、0で不許可)
  • chrootされるパス

chrootする為の準備

ここで長いことハマった。
まず最初に/usr/share/doc/rssh/examples/mkchroot.shの内容を変更する。
'copy SSH files'で検索をすると下記のような記述が見つかる。

# copy SSH files

scp_path="scpのパス"
sftp_server_path="sftp-serverのパス"
rssh_path="rsshのパス"
chroot_helper_path="rssh_chroot_helperのパス"

それぞれ「〜のパス」部分を正しいパスへ修正する。
最初から正しければ触る必要は無い。だけど正しくない場合のが多いと思う。
mkchroot.shを修正後、実行する必要のあるコマンドをシェルスクリプトにまとめると以下の通り(一部横着あり)。

#!/bin/sh
# スーパーユーザーで実行。
# 第一引数を対象のユーザーとする。
/usr/share/doc/rssh/examples/mkchroot.sh /home/$1
cp -f /lib/* /home/$1/lib
chmod u+s /usr/lib/rssh/rssh_chroot_helper
mknod -m 666 /home/$1/dev/null c 1 3
/etc/init.d/sysklogd stop
syslogd -a /home/$1/dev/log
cat /home/$1/etc/passwd | grep $1 | tee /home/$1/etc/passwd > /dev/null 2>&1

mkchroot.shがエラーを吐くようだったら出力を見て適宜修正。
最後にchrootをしたいユーザーのログインシェルをrsshへと変更する。
完了したらsftpで接続テストをして、繋がれば成功。
失敗するようであれば/var/log/syslogから原因分析。


なお、OpenSSHのバージョンが4.9p1以上であれば、chrootの機能が搭載されているので、chrootだけが目的ならrsshを使う必要は無い。
接続方式をsftpやscp等に限りたいという場合にはrsshは使い道がある。