chrootは特定のディレクトリをルートとみなしてファイルシステムを閉じ込めます。FreeBSDにはjailというchrootより強力で プロセスも閉じ込めることができるものがありますが、IPアドレスを割り振ったり、環境を構築するのが面倒です。 ここではFTPに必要な最低限のコマンドが用意されたユーザディレクトリに閉じ込める設定を紹介します。
追記 (2005/04/08)
PortsにChrootのオプションが組み込まれたようです。makeの際にWITH_OPENSSH_CHROOTのオプションをつければいいようです。 なので以下は参考程度に読んでください。(NADMINさん経由)
インストール
http://nadmin.org/howto/chrooted-ssh.htmlからFreeBSD用のChrootssh化パッチをダウンロードします。
# cd /usr/local
# fetch http://nadmin.org/howto/distfiles/osshChroot-3.8p1-FreeBSD.diff
# cd /usr/ports/security/openssh-portable
# make patch
# cd work
# patch -p0 < /usr/local/osshChroot-3.8p1-FreeBSD.diff
# cd ..
# make
# make install
# mv /usr/sbin/sshd /usr/sbin/sshd.bak
# ln -s /usr/local/sbin/sshd /usr/sbin/sshd
※私の環境ではコンパイル時にエラーになったのでsession.cを以下のように修正しました。(3.8-p1)
↓行番号
1593| (追加) #ifdef CHROOT
1594| (追加) do_setusercontext(pw, user_dir, new_root, 1);
1595| (追加) #else
1596| do_setusercontext(pw);
1567| (追加) #endif /* CHROOT */
(2004-04-06)版のパッチで修正されました。
設定
chrootしたいユーザのホームディレクトリを
/home/ユーザ名/./と設定します。
ここでchroot後にFTPが操作できる最低限必要なファイルを用意します。
私は以下のファイル構成にしました。/以下 の同名のファイルをコピーしてください。
# vi .profile
PATH=/bin:/usr/sbin:/usr/bin:/usr/local/libexec:/usr/libexec; export PATH
# cd /home/ユーザ名
# mkdir bin etc usr var usr/bin usr/lib usr/libexec usr/local usr/local/libexec usr/sbin var/run
/home/ユーザ名:
.login
.login_conf
.profile
.shrc
bin/
etc/
usr/
var/
/home/ユーザ名/bin:
chmod
cp
echo
ln
ls
mkdir
mv
pwd
rm
rmdir
sh
/home/ユーザ名/etc:
group
pwd.db
termcap
/home/ユーザ名/usr:
bin/
lib/
libexec/
local/
sbin/
/home/ユーザ名/usr/bin:
chgrp
groups
id
scp
/home/ユーザ名/usr/lib:
libc.so.4
libcrypto.so.3
libssh.so.2
libutil.so.3
libz.so.2
/home/ユーザ名/usr/libexec:
ld-elf.so.1
/home/ユーザ名/usr/local:
libexec/
/home/ユーザ名/usr/local/libexec:
sftp-server
/home/ユーザ名/usr/sbin:
chown
/home/ユーザ名/var:
run/
/home/ユーザ名/var/run:
ld-elf.so.hints
# chown root:wheel .*
# chmod 755 bin etc usr var usr/bin usr/lib usr/libexec usr/local usr/local/libexec usr/sbin var/run