chrootとは特定のディレクトリをルートディレクトリに変更しちゃうことです。プロバイダのwebサーバにftpで接続したときにpublic_htmlより上が見えなくなってるのはftpのchrootの仕業です。特定のユーザにサーバでの作業を制限したい時に有効なのでchroot版のopenssh(目的はsftp)をインストールした。ただ、いかんせん罠がいっぱいありすぎて苦労した。
chroot掛かってるユーザからは当然/binやら/devもみえなくなってるわけですが、ftpで接続した時はlsやらmkdirは実行できる。これはproftpdがほげほげと頑張ってくれてるからそうです。
しかし、opensshはそんなことしてくれない。なので/bin/lsとか必要なコマンド等をコピーする必要があって、その辺の処理をやってくれるchroot用ユーザ作成スクリプトが配布されてます。・・・が、このスクリプトだけでは不十分で大変だった('A`) というわけで今後のためにメモメモ。
まずはopensslインストール
# wget http://www.openssl.org/source/openssl-0.9.8d.tar.gz # tar zxvf openssl-0.9.8d.tar.gz # cd openssl-0.9.8d # ./config # make && make install
次にzlibインストール (別にいらない?)
# wget http://www.zlib.net/zlib-1.2.3.tar.gz # tar zxvf zlib-1.2.3.tar.gz # cd zlib-1.2.3 # ./condigure # make && make install
chroot用opensshインストール
# wget http://chrootssh.sourceforge.net/download/openssh-4.5p1-chroot.tar.bz2 # tar zxvf openssh-4.5p1-chroot.tar.bz2 # cd openssh-4.5p1-chroot # ./configure --prefix=/usr --sysconfdir=/etc/ssh \ --with-ssl-dir=/usr/local/src/openssl/openssl-0.9.8d --with-tcp-wrappers # make && make install
chroot-useradd スクリプト
useraddと違って、ホームディレクトリを以下をchrootして、いくつかのコマンドと、それに依存するライブラリ*1をユーザのホームディレクトリ以下にコピーするスクリプト。
オリジナルはhttp://fedorasrv.com/chroot-useradd
このスクリプトのgrep関連のところは修正したほうが良いです。
HOMEDIR=`grep /etc/passwd -e "^$CHROOT_USERNAME" | cut -d':' -f 6` # 修正前 HOMEDIR=`grep /etc/passwd -e "^$CHROOT_USERNAME:" | cut -d':' -f 6` # 修正後
一目見ただけでわかると思いますが、ユーザhogehogeが存在してる状態で、ユーザhogeを追加しようとすると、
27行目のHOMEDIRは/home/hogehoge/./"/home/hogehoge/ /home/hoge/./"というようにおかしくなってしまいます。
他にも、
CMD="bash ls mkdir mv pwd rm chmod vi cat id rsync ssh scp ping ssh-keygen perl"
ここに書き足していけば、コピーするコマンド追加できますが、それらのPATHが
# Create Directories no one will do it for you mkdir -p etc mkdir bin mkdir -p usr/bin mkdir -p usr/local/bin
これ以外の場合は、mkdirの行を書き足さないと必要なライブラリがコピーされなくなってしまう。
(例) sftp-serverのフルパスは/usr/libexec/sftp-server だった
ここまで来れば
./chroot-useradd hoge
とやればchroot用ユーザが出来上がり。
chroot用ユーザのデバイスファイルの作成
これでユーザ出来て終わった〜〜と安心してたら、まだまだ罠がありました。chrootユーザでsftpで接続が出来ない。
通常のユーザなら出来る。他にも、chrootユーザがsshでログインした後、そのサーバからsshが実行出来ないという事態に。
/usr/sbin/sshd -ddd
とsshdをデバッグモードで見てたら、chrootユーザは/dev/null、/dev/random等のデバイスファイルが使えないことが原因のよう。
- サーバのオリジナルのファイルの属性等を調べる
# ls -l /dev/null crw-rw-rw- 1 root root 1, 3 12月 19 15:43 /dev/null # パーミッション 666 # file /dev/null /dev/null: character special (1/3) # メジャー1、マイナー3
これを同じファイルをユーザhogeの/に作成
# mknod -m 666 /home/hoge/dev/null c 1 3
同様の操作で/dev/randomも作成。/dev/tty /dev/pts/*も作成したほうが良いかも。ディストリによってはMAKEDEV nullとかだけでいい。