複数のお互いに関係がないユーザへ共用サーバを提供したいときには、SSHでログインしたユーザは自分の環境は自由に使えますが、他のユーザの環境は参照できない、といった環境となるように設定をして提供する必要があります。
こういった環境を提供する方法のひとつに、SSHのChrootDirectoryを使うという方法があります。たとえば、hiro345ユーザへchroot環境を用意するには、下記のようにします。AllowUsers や DenyUsers の指定はMatchより前に記載しましょう。
Match User hiro345 ChrootDirectory /chroot/ X11Forwarding no AllowTcpForwarding no
sftpを提供する必要があるなら、internal-sftpを指定します。
#Subsystem sftp /usr/local/libexec/sftp-server Subsystem sftp internal-sftp
SSHログインをして、それなりに作業ができるようにするには、結構準備が必要です。まずは、chroot用のディレクトリを用意して、そこへ必要なファイルをコピーします。chroot用のディレクトリは、所有者をrootとして、755としておかないといけません(最初、700にしてはまりました)。ここの例では、ls, cat のコマンドを使えるようにしています。
mkdir /chroot chmod 755 /chroot cd / mkdir -p /chroot/{bin,lib,lib64,var,home,etc,dev,usr} cp -p /bin/bash /bin/ls /bin/cat /chroot/bin/
bash, ls, cat が使っているライブラリを調べるには、lddコマンドを使います。次のようなスクリプトを用意して確認するのがよいでしょう。
for t in `ldd /chroot/bin/* | grep 0x | sort -u`; do echo $t|grep ".so."; done | sort -u | grep lib64 > /chroot/lib.txt for f in `cat /chroot/lib.txt`; do cp $f /chroot/$f; done
パッケージから必要なファイルを抜き出すには、次のようなスクリプトが役に立ちます。
for f in `rpm -qs perl-5.10.1-119.el6_1.1.x86_64|grep "/usr/bin"|awk '{print $2}'`; do cp -a $f /chroot/$f; done
/var/tmp, /tmp は念のため用意しておいた方が良いでしょう。chroot環境でログインするユーザの情報は、/chroot/etc/passwd, /chroot/etc/group, /chroot/etc/shadow に置きます。Linuxユーザの情報として、/etc/passwd, /etc/group, /etc/shadow に登録が必要ですが、その中から、chroot環境に必要なユーザ(rootとかttyといったものはすべて削除しておいていい)分だけ抜き出して用意します。
動作確認時にうまくできないときは、/lib, /lib64, /usr あたりは全部コピーしてしまてから、後で不要なものを削除していくという方法もアリでしょう。
次のような感じで、devも作っておきます。
mkdir -p /chroot/dev mknod /chroot/dev/null c 1 3 mknod /chroot/dev/zero c 1 5 chmod 666 /chroot/dev/*
CentOSなら、/sbin/MAKEDEV をコピーして作るという方法もあります。
cp -a /sbin/MAKEDEV /chroot/dev/ cd /chroot/dev ./MAKEDEV std
SSHログインをする前に、chrootコマンドを使って、ローカルでlsやcatコマンドが動作するか確認をしておきましょう。
# chroot /chroot/ /bin/bash # ls