FreeBSDでChroot patch for ssh

ssh(scp,sftp)アクセスを許可したユーザに、 そのホームディレクトリ以下以外のディレクトリを参照させないようにするためのChroot patch for ssh、 これをFreeBSDのports(security/openssh-portable)に適用するためのヒント。

このパッチはports treeに取り込まれました。 security/openssh-portableにて、 WITH_OPENSSH_CHROOTオプションをつけてmakeするだけで、 chroot対応版が得られます。

配布ファイル

FreeBSD (security/openssh-portable)専用パッチ

パッチの適用

以下はOpenSSHのバージョンが3.5時点の記述であるが、 それ以降のバージョンでも概要はほぼ同じである。

openssh-portable(とopenssl)をportsから導入することを前提とする。 この文書記述時点で、 opensshのバージョンは3.5p1。

security/openssh-portableでmake patchをしたあとに、 ここのosshChroot-3.5.diffを適用すると、 エラー無しにパッチがあたるが、 肝心なchroot処理部が#ifdefで無効になっている部分に置かれるので無意味。 これを回避するFreeBSD専用patchを用意した。 opensshを次の手順でbuildする。

# cd /usr/ports/security/openssh-portable
# make patch
# ( cd work; patch -p0 <this-patch )
# make
# make install

"cd work"のところは、 もし$WRKDIRPREFIXが定義してあるなら、 cd $WRKDIRPREFIX/usr/ports/security/openssh-portable/work に置き換える。

あるユーザについて、 ログイン時にsshdをchrootさせるには、 そのユーザのホームディレクトリを、 /path/to/chroot/./home/username のように /./ を挟んで指定することにより、 そのディレクトリへのchrootを指示することができる。 /./が無いユーザについては、 通常のsshdと動作は変わらない。

chroot環境の構築

FreeBSDの場合、 chrootされた環境で、 sftpや WinSCPからのアクセスをこなすために、 最低限必要なファイルは以下の通り。

以下はFreeBSD 4.7-RELEASE環境でのリスト。 それ以外の環境では、 ldd(1)等を使って調べられたし。
bin/chmod
bin/cp
bin/ls
bin/mkdir
bin/mv
bin/rm
bin/sh
etc/group
etc/pwd.db
usr/bin/chgrp
usr/bin/groups
usr/lib/libz.so.2
usr/lib/libc.so.4
usr/lib/libutil.so.3
usr/libexec/ld-elf.so.1
usr/local/bin/scp
usr/local/libexec/sftp-server
usr/local/lib/libcrypto.so.3
usr/sbin/chown
var/run/ld-elf.so.hints
.profile

これはchroot前のpathを再現する形で配置してあるが、 実行ファイルはすべてbinに、 シェアードライブラリはすべてusr/libに収めても良い。 var/run/ld-elf.so.hintsは、 usr/local/libをシェアードライブラリパスに含めるためのおまじないであって、 libcrypto.so.3をusr/libに入れるならば必要ない。 但し、sftp-serverだけはこのパスである必要がある。 .profileでは適宜PATHの設定等を行う。

謝辞

友池さん - 初出の対3.8.p1版のミスを指摘して頂いた。


Presented by kanai@nadmin.org
Jan. 6, 2003
Home