Linux-VServerのインストール方法

BSDのjail機構をご存じだろうか。リソースをグループ化し、グループ内外で動作するサービス間に論理的な障壁を作る仕組みである。これを利用すると、セキュリティを改善することができる。Linuxの場合はLinux-VServerというアプリケーションがほぼ同様の機能を提供している。システムのリソース――CPU、メモリー、ハードディスク、ネットワーク――をグループ化、プロセスは所属するグループ内で動作するためサービス運用妨害攻撃に対する耐性が高くなる。こうした理由も手伝って、ホスティング企業の多くが仮想サーバーを導入している。

Linux-VServerを使うと、1台のコンピューター上に複数の仮想Linuxサーバー(VServer)を立ち上げることができる。VServerは通常のLinuxサーバーと同じように動作するが、オーバーヘッドは少なく、相互に独立しながら同時に動くため、仮想プライベート・サーバーやセキュリティ強化領域として使える。オペレーティング・システム・レベルでの仮想化であるため、リソースをグループ化し分離できるからである。SSH、電子メール、Web、データベースなどのサービスは、VServer上で、そのまま修正なしに通常通り起動することができる。したがって、メール・サーバーとWebサーバーを同じマシン上で動作させても、Webサーバーを活かしたまま、メール・サーバーをリブートすることができる。固有のIPアドレス、ハードドライブ・スペース、ユーザ・アカウント・データベース、rootパスワードを持ち、VServer同士が干渉することはない。

仮想サーバーは、ホスト・システムとゲスト・システムという2種類のシステムから構成される。ホスト・システムは仮想サーバーが載っている物理的なサーバーであり、ゲスト・システムは、ホストOSの上に載って動作する仮想サーバー・オペレーティング・システムである。

基本システムの準備

ここでは、CentOSバージョン4.2を使って手順を説明することにする。Linux 2.6が動作するLinuxディストリビューションであれば、どれでも大差ないはずだ。FedoraUbuntuの場合は、Web上に若干の解説がある。

まず、CentOS 4.2を新規にインストールする。ホスト・システムは小さければ小さいほどよく、通常は、SSHとiptablesがあれば十分だ。

CentOS 4.2 の1枚目のCDを使ってシステムをブートする。Linuxをインストールした経験があるなら、このインストールは比較的簡単だろう。大きな/vserversパーティションを作り、パッケージはDevelopment Packagesを選択すること。ほとんどのサービスはゲスト・システムで動かすことになるため、このシステムに多くはいらない。インストールが完了したら、インターネットの接続といったサービスが正常に動作していることを確認する。

次に、rootでログインし、upgradeして、セキュリティ更新を含むすべてのパッケージを最新バージョンに更新する。

yum -y upgrade

更新が終わったらSELinuxを無効にする。つまり、/etc/selinux/configファイル中のSELINUXエントリーを次のように変更する。

SELINUX=disabled

次に、ホスト・システムで運用するサービスを最小限にする。理由は2つ。一つは、使いもしないサービスを動かしてCPUサイクルを浪費しないため。もう一つは、動作中のサービスが少ないほど、セキュリティが脆弱な個所も少なくなるからだ。

現在動作中のサービスを調べるには、まずrunレベルを知る必要がある。

# runlevel

rootでログインしているので、ほとんどの場合、3という数字が戻るはずだ。ブート時に実行されたサービスは、次のコマンドで分かる。

# chkconfig –list | grep “3: on”

どのパッケージかを知るには、パッケージごとに次のコマンドを実行する。

# rpm -qi package_name

不要なサービスがあった場合は、ntsysvツールを使ってブート時に起動されないようにする。リブートして、この設定を適用する。

たとえば、このサーバーでは次のパッケージは不要だろう。

  • autofs – ファイル・システムを自動的にマウントするデーモン
  • apmd – Advanced Power Managementデーモンを制御するプログラム。現在発売されているほとんどのノートブック・コンピューターに搭載されているユーティリティ
  • pcmcia – どれかのパッケージに含まれているモジュール
  • cups – Common Unix Printing System
  • xinetd – inetdのセキュリティ強化版
  • gpm – テキスト・ベースのLinuxアプリケーションのためのマウス・サポート
  • kudzu – ブート時に起動されるハードウェア・アナライザで、ハードウェアの追加と削除を監視する
  • iptables – ファイアウォール。セットアップ時にインストールを省略できるが、実際にはインストールされ、単にconfigファイルが空になるだけ
  • anacron – 指定日数間隔でコマンドを実行する定期コマンド・スケジューラー。cronとは異なり、途中でシステムの運転が止まってもよい
  • isdn – ISDN接続をしなければ不要
  • nfs – TCP/IP ネットワーク上でファイルを共有するサーバー機能
  • netfs – すべてのネットワーク・ファイル・システムとSambaマウント・ポイントをマウントしたりアンマウントしたりする。リモート・ファイル・システムを自動マウントする必要がなければ不要
  • nfslock – TCP/IPネットワーク上でファイルを共有するサーバー機能
  • atd – atコマンドの制御。コマンドのスケジュールで使用
  • rpcgssd / rpcsvcgssd / rpcidmapd – ネットワーク・ファイル・システムのデーモン。NFSを使わないのであれば不要
  • cpuspeed – 必要とされる処理能力に応じてCPUの速度を動的に変更する。ノートブックでなければ不要
  • mdmonitor – ソフトウェアRAIDの管理。ここでは、ハードウェアRAIDを使用
  • HALdaemon / DBUS – デスクトップのためのサービス

カーネル

さて、ここからが佳境だ。すでに述べたように、Linux上のVServerはOSレベルで仮想化される。つまり、カーネルがVServerをサポートする。しかし、CentOSの標準カーネルはVServerをサポートしていないため、カーネルのソースを入手し、VServerパッチを当ててコンパイルする必要がある。

そこで、カーネル・ソースを取ってこよう。現在のlinux-vserver最新安定版は2.6.14.3カーネルだ。入手の手順は以下の通り。

# cd /usr/src
# wget ftp://ftp.probe-networks.lkams.kernel.org/pub/linux/kernel/v2.6/linux-2.6.14.3.tar.bz2

次に、linux-vserver.orgまたは13thfloor.at/vserverから最新カーネル・パッチを入手する。

# wget http://www.13thfloor.at/vserver/s_rel26/v2.01/patch-2.6.14.3-vs2.01.diff.bz2
# tar xjf linux-2.6.14.3.tar.bz2

そして、カーネル・ソースにパッチを当てる。

# cd /usr/src/linux-2.6.14.3
# bzip2 -dc ../patch-2.6.14.3-vs2.01.diff.bz2 | patch -p1

次にconfigを作成するのだが、運用している2.6.xカーネル――2.4.xのconfigファイルは駄目――があれば、そのconfigをコピーする。

# cp /boot/config-`uname -r` .config

VServer対応カーネルのためのコンパイル時に含めておきたいものあれば、ここで済ませておく。カーネルのコンパイルで問題が発生したら、このページが参考になるはずだ。それでは、makeに進もう。まず、次のコマンドを実行する。

# make menuconfig

Linux VServer関連の構成は最後の方だ。選択を求められた場合はデフォルトを選べばよい。ただし、次の項目が有効になっていることは確認すること。

Enable Legacy kernel API
Enable Proc Security
Enable Hard CPU Limits

これで、configの設定は完了。いよいよ、カーネルをmakeする。次のコマンドで、カーネルをコンパイルしインストールすることができる。しばらく時間がかかるので、コーヒーを入れ、ピザを頬張りながら待とう。

# make bzImage && make modules && make modules_install && make install

次に、GRUB構成ファイル/boot/grub/menu.lstを編集する。default=とある行を探し、次のように0に設定されていることを確認する。

default=0
title CentOS (2.6.14.3-vs2.0.1)
root (hd0,0)
kernel /vmlinuz-2.6.14.3-vs2.0.1 ro root=/dev/VolGroup00/LogVol00 rhgb quiet

次に、マシンをリブートし、VServer対応カーネルを動かす。起動したら、uname -rコマンドでカーネルのバージョンを調べ、今作ったカーネルが確かに動作していることを確認する。2.6.14.3-vs2.0.1のように表示されるはずだ。そうでなければ、ここまでの手順を確認し、間違えた個所を特定して再挑戦する。

VServerのバイナリ

以上で、VServer対応CentOS 4.2のシステムができ上がり、VServerのバイナリをインストールする準備ができた。VServerの作成と管理のためのuserlandのユーティリティがあるのでダウンロードし、これを使ってバイナリを抽出することにしよう。

# cd /usr/src/
# wget http://www.13thfloor.at/vserver/s_rel26/v2.01/util-vserver-0.30.209.tar.gz
# tar -zxvf util-vserver-0.30.209.tar.gz
# cd util-vserver-0.30.209

ここで、次のコマンドを使って、dietlibcとbeecrypt-develがインストールされていることを確認する。

# yum install -y dietlibc beecrypt-devel

それでは、util-vserverツールをビルドしインストールしよう。以下に示すのは、その一例である (インストール先は/lib、/sbin、/etc/init.d)。

# cd /usr/src/util-vserver-0.30.209
# ./configure –prefix= –sysconfdir=/etc
# make && make install && make install-distribution

インストールの成否を確認しておこう。

# wget http://vserver.13thfloor.at/Stuff/SCRIPT/testme.sh
# chmod 700 testme.sh;./testme.sh

問題がなければ、次のように表示されるはずだ。

Linux-VServer Test [V0.15] Copyright (C) 2003-2006 H.Poetzl
chcontext is working.
chbind is working.
Linux 2.6.14.3-vs2.0.1 #1 SMP Thu Mar 2 12:45:32 IST 2006 i686
Ea 0.30.209 273/glibc (DSa) <compat,v11,v13,fscompat,net,oldproc,olduts>
VCI: 0002:0001 273 03110036 (TbLgnPD)

[000]# succeeded.
[001]# succeeded.
[011]# succeeded.
[031]# succeeded.
[101]# succeeded.
[102]# succeeded.
[201]# succeeded.
[202]# succeeded.

仮想サーバーの設定

仮想サーバーを作成するのは極めて簡単、しかも1回だけだ。ただし、時間がかかる。まず、ホスト・システムからテンプレートを作る必要がある。つまり、/procと/devなどのディレクトリを除いた全ファイルシステムのダンプを取る。

# mkdir /vservers/template/
# dump 0f – /usr | (cd /vservers/template/ && restore rf -)

同様に、次のディレクトリのダンプを取る。

/bin、/etc、/home、/include、/initrd、/lib、/opt、/root、/sbin、/tmp、/usr、/var

このテンプレートを掃除しておくとVServerが小さくなり、また速度の点でも有利だ。ファイルをコピーしながらVServerに不要なものを削除する。根気のいる作業だ。今は止めておく。

さて、VServerを作ろう。次のコマンドを実行する。

# /sbin/vserver <VSERVER_NAME> build -m <BUILD_METHOD> –hostname <VSERVER_HOSTNAME> –interface <VSERVER_NAME>=<NET_DEVICE>:<IP>/<CIDR>

以下に、実例を示す。

# /sbin/vserver calvin build -m skeleton –hostname calvin –interface calvin=eth0:192.168.0.10/24

この場合、1つめの仮想サーバーは次のような構成になる。

VSERVER_NAME calvin
FQDN calvin
NET_DEVICE eth0
IP 192.168.0.10
CIDR 24 (255.255.255.0)
BUILD_METHOD skeleton

次に、VServerにテンプレートのデータを流し込む。

# cp -a /vservers/template/. /vservers/calvin/

そして、運用するネットワークに合わせてVServerの/etc/hostsを編集する。

# vi /vservers/calvin/etc/hosts

最後に、リソースをグループに分離するVServer関連スクリプトを起動する。このスクリプトは、ブートのたびに実行する必要がある。

# /etc/init.d/vprocunhide start

以上で、VServerの設定は終わりだ。それでは神に祈りつつ、ピカピカのVServerを起動してみよう。

# /sbin/vserver calvin start

サービスが起動しないなどといったエラーなら大した問題ではないが、VServerが立ち上がらない場合は VServerメーリングリストのアーカイブを検索してみる必要がある。うまく立ち上がったら、VServerに入ってみよう。

# /sbin/vserver calvin enter

以下、VServerで必要となる基本コマンドを幾つか挙げておく。まずは、次のコマンド。

# /sbin/vserver <VSERVER_NAME> [ start | stop | restart | enter ]

何か実行してみたいなら、ntsysvまたはchkconfigのいずれかを実行してみよう。それから、起動する必要のないサービスをすべて停止させること。すべてのネットワーク関連サービスとカーネル関連サービス、特に、iptablesやkudzuなどは間違いなく停止させておく。

VServerの動作状況は次のコマンドで得られる。

# /sbin/vserver-stat

問題や疑問があれば、VServerパッケージのmanページを見てみよう。それでも分からなければ、VServerメーリングリストが助けてくれるだろう。

NewsForge.com 原文