------------------------------------------------------------------ Linux Secure Virtual Hosting Extension HOWTO (2003/04/30) ------------------------------------------------------------------ 1. 準備 1.1 モバイルプロセッサ用の設定 モバイルプロセッサは CPU 周波数の自動調整機能がついています。 しかし、我々の CPU 予約機構は固定周波数であることが必要であるため、 この CPU 周波数の自動調整機能を無効にし、固定周波数に設定する必 要があります。 1.1.1 Mobile Pentium II/III BIOS で CPU 周波数の設定ができます。CPU 周波数を最大で固定してく ださい。詳しい設定の方法はお使いの PC やマザーボードのマニュアル をご覧下さい。 1.1.2 Crusoe Crusoe の Longrun 機構は longrun ユーティリティを用いて制御でき ます。longrun ユーティリティは anonymous ftp で入手できます。URI は ftp://ftp.kernel.org/pub/linux/utils/cpu/crusoe/longrun-0.9.tar.gz CPU 周波数を最大で固定するためには以下のようにします。 # longrun -f performance # longrun -s 100 100 これらの操作は PC をブートする度に設定する必要があります。もし、 毎起動時に自動的に設定したい場合には rc スクリプトに記述してくだ さい(たいていの場合には rc.local)。 1.2 仮想ホスト用にファイルツリーの作成 我々の仮想ホスト環境を提供する機構は chroot(2) システムコールを 利用しています。そのため、Linux ホストとして完全なファイルツリー を用意する必要があります。ファイルツリーをコピーするためには、 1つのツリー辺り、1 〜 2GB 程度のディスクスペースが必要になります。 以下に、ファイルツリーをコピーするためのスクリプトをつけます。 #!/bin/sh # # COPY_DIR : make directory and copy all files. # MAKE_DIR : make directory only. COPY_DIR="/boot /etc /var /bin /sbin /lib /dev /usr" MAKE_DIR="/tmp /proc" if [ $# -ne 1 ]; then echo "Usage: $0 "; exit 1; fi TARGET_DIR=$1 if [ ! -d ${TARGET_DIR} ]; then mkdir ${TARGET_DIR} fi if [ ! -d ${TARGET_DIR} ]; then echo "chroot directory not found." exit 1; fi for i in ${COPY_DIR}; do echo "mkdir ${TARGET_DIR}$i" mkdir ${TARGET_DIR}$i echo "copy files from $i to ${TARGET_DIR}$i" (cd $i; tar cf - . )|(cd ${TARGET_DIR}$i; tar xf -) done for i in ${MAKE_DIR}; do echo "mkdir ${TARGET_DIR}$i" mkdir ${TARGET_DIR}$i done -------------------------------------------------------------------- 2. ソフトウェアの使い方 2.1 カーネルモジュールのロード 資源予約を使うためには、専用のカーネルモジュールをロードする必要 があります。 # insmod crow_rk 毎起動時に自動的にロードしたい場合は、rc スクリプトに追加するの が良いでしょう。以下に追加の例を載せます。 RELVER=`uname -r` if [ x$RELVER = x"2.2.25-svh1.0" ]; then insmod crow_rk fi 2.2 保護壁の作り方 (資源保護か仮想ホストないしはその両方). 2.2.1 コマンドの使い方 [資源予約作成] crow_exec [--wait] --cpu cpu_rate --mem mem_rate --exec "progname arguments" --cpu cpu_rate make CPU reservation with rate(%) --mem mem_rate make Physical memory reservation with MB --exec specify to be executed program and arguments --wait don't fork when invoke execve(2). [仮想ホスト作成] jail --chroot path --hostname hostname --ip ip-number --uidmin uid_min --uidmax uid_max --gidmin gid_min --gidmax gid_max --exec "command ..." path new root directory hostname hostname of virtual host ip-number IP address of virtual host uid_min minimum uid number allowed in virtual host uid_max maximum uid number allowed in virtual host gid_min minimum gid number allowed in virtual host gid_max maximum gid number allowed in virtual host command specify to be executed program and arguments 2.2.2 資源予約のみの作成 アプリケーションに対して CPU とメモリ資源の割り当てて動かしたい 場合、crow_exec コマンドを使います。 例) CPU 30% とメモリ 100MB を httpd に予約し割り当てる # crow_exec --cpu 30 --mem 100 --wait \ --exec "/etc/rc.d/init.d/httpd start" 2.2.3 仮想ホストのみの作成 仮想ホストを作成し、そこでアプリケーションを動かすためには jail コマンドを使います。 例) http を動かす仮想ホストの設定 new root : /home/jail hostname : svh.foo.com IPaddress : 129.168.124.1 uid_min : 100 uid_max : 10000 gid_min : 100 gid_max : 65535 # jail --chroot /home/jail --hostname svh0.foo.com \ --ip 192.168.124.1 --uidmin 100 --uidmax 10000 \ --gidmin 100 --gidmax 65535 \ --exec "/etc/rc.d/init.d/httpd start" 2.2.4 資源予約に仮想ホストをマッピングする場合 仮想ホストを作成し、そこに CPUとメモリ資源を作成する場合、 crow_exec コマンドと jail コマンドを組み合わせて用います。 Example) httpd 用の仮想ホストと資源予約の設定 CPU : 30 % Memory : 100MB new root : /home/jail hostname : svh0.foo.com IPaddress : 129.168.124.1 uid_min : 100 uid_max : 10000 gid_min : 100 gid_max : 65535 # crow_exec --cpu 30 --mem 100 --wait \ --exec "jail --chroot /home/jail \ --hostname svh0.foo.com --ip 192.168.124.1 \ --uidmin 100 --uidmax 10000 \ --gidmin 100 --gidmax 65535 \ /etc/rc.d/init.d/rc.httpd start" 複数のプログラムを動かしたい場合には、スクリプトを作成し、それを 呼び出すようにすればよい。 例) ウェブサーバ用スクリプト #!/bin/sh LANG=C; export LANG; #echo $1; case "$1" in stop) sh /etc/rc.d/init.d/syslog stop sh /etc/rc.d/init.d/xinetd stop sh /etc/rc.d/init.d/sshd stop sh /etc/rc.d/init.d/httpd stop killall minilogd echo "unmouting /dev/pts" umount /dev/pts echo "unmouting /proc" umount /proc ;; restart) if [ -f /etc/mtab ]; then cat /etc/mtab | grep -v /proc | grep -v /dev/pts > /etc/mtab.new mv -f /etc/mtab.new /etc/mtab fi echo "mouting /proc" /bin/mount /proc echo "mouting /dev/pts" /bin/mount /dev/pts sh /etc/rc.d/init.d/syslog restart sh /etc/rc.d/init.d/xinetd restart sh /etc/rc.d/init.d/sshd restart sh /etc/rc.d/init.d/httpd restart ;; start) if [ -f /etc/mtab ]; then cat /etc/mtab | grep -v /proc | grep -v /dev/pts > /etc/mtab.new mv -f /etc/mtab.new /etc/mtab fi echo "mouting /proc" /bin/mount /proc echo "mouting /dev/pts" /bin/mount /dev/pts sh /etc/rc.d/init.d/syslog start sh /etc/rc.d/init.d/xinetd start sh /etc/rc.d/init.d/sshd start sh /etc/rc.d/init.d/httpd start ;; *) ;; esac 2.2.5 資源予約や仮想ホストの破壊の方法 linux-svh カーネルは資源予約や仮想ホストに対応したプロセスが全て 終了した場合、自動的にこれらを破壊する。明示的に破壊したい場合に は、対応する全てのプロセスを殺せばよい。 -------------------------------------------------------------------- 3. カーネル MIB set_hostname_allowed : sethostname(2) の使用の on/off (デフォルト 0 == off) ただし、名前空間は prison 毎に分離されている socket_unixiproute_only : socket の利用種別の制限 (デフォルト 1 == 制限あり) jail_sysvipc_allowed : SysVIPC の利用の on/off (デフォルト 1 == on) ただし、名前空間/資源空間は prison 毎に 分離されている jail_enable_uid_divide : 各prison 間での uid の分割利用の on/off (デフォルト 1 == on) jail_enable_gid_divide : 各prison 間での gid の分割利用の on/off (デフォルト 0 == off) jail_shared_uid_min : 各prison 間で共有する uid の最小値 (デフォルト 0) jail_shared_uid_max : 各prison 間で共有する uid の最大値 (デフォルト 99) jail_shared_gid_min : 各prison 間で共有する gid の最小値 (デフォルト 0) jail_shared_gid_max : 各prison 間で共有する gid の最大値 (デフォルト 99) set_reserve_allowed : prison からの資源予約要求の可否 (デフォルト 0 == 不可) jail_mount_restriction : 疑似ファイルシステム以外のマウントの制限 (デフォルト 1 == 制限あり)