うまいぼうぶろぐ

linuxとhttpdとperlのメモ

chroot対応opensshのインストールmemo

chrootとは特定のディレクトリをルートディレクトリに変更しちゃうことです。プロバイダのwebサーバにftpで接続したときにpublic_htmlより上が見えなくなってるのはftpchrootの仕業です。特定のユーザにサーバでの作業を制限したい時に有効なので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とかだけでいい。