SSHユーザが自由に使える専用の環境を提供したいとき

複数のお互いに関係がないユーザへ共用サーバを提供したいときには、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
同じタグの記事: Linux
同じタグの記事: SSH
同じカテゴリの記事: Linux