CentOS サーバー構築 KVM 仮想サーバー

(最終更新日時:2013-02-10 21:06:20)
サーバーメンテナンスやセキュリティ面を考慮し、データベースサーバーを仮想化した別サーバーで稼働させることにします。
稼働させる仮想サーバーのネットワークは以下のポリシーで設定することにします。
• ネットワークセグメントは、仮想サーバー用に独立させます。(192.168.101.0/24)
• 仮想サーバー(内部 LAN)からインターネットへの通信を許可します。
iptables -A FORWARD -i virbr0 -o eth0 -s 192.168.101.0/24 -p tcp --sport 1024:65535 -j ACCEPT
iptables -A POSTROUTING -t nat -o eth0 -j MASQUERADE
• ホストマシン以外から仮想サーバーへの通信は許可しません。
• 仮想サーバーは外部へ直接公開しません。

KVMのインストールと設定

サーバーマシンへCentOSをインストールする際に『仮想化』を選択していれば、KVM は既にインストールされており、サーバーマシンはホストマシンとして稼働しています。

KVMがインストールされていないサーバーマシンへ、後からKVMをインストールする手順は以下になります。
# # CentOS インストール時の『仮想化』パッケージ群を yum でインストールします
# yum -y groupinstall Virtualization "Virtualization Platform" "Virtualization Client"

# # KVMは最初からOSに組み込まれていますので、モジュールをロードすれば利用できるようになります
# modprobe kvm_intel                                          # AMDのCPUを使用している場合は kvm_amd をロードします
# # Operation not supported のエラーが出る場合は、BIOSでVT(Virtualization Technology)が有効になっているか確認してください

# service libvirtd start                                      # 仮想マシンの管理デーモンを起動します

※ 以下の内容は qemu-kvm-0.12.1.2-2.295.el6_3.10.x86_64 を対象に記述しています。

ホストマシンのネットワーク設定

KVMのデフォルトでは、仮想サーバーとの接続用に virbr0 というインターフェースが作成されます。
このインターフェースは、
inet addr:192.168.122.1 Bcast:192.168.122.255 Mask:255.255.255.0
となっています。
また、NATルーターおよびDHCPサーバーの機能も併せ持っています。

当サイトの仮想サーバー構築では、ネットワークセグメントを 192.168.101.0/24 に変更します。
また、各仮想サーバーのIPアドレスも 個別に設定 することにしますので、DHCP機能は不要です。
さらに、NATルーター機能も不要です。

以上のことから、デフォルトのvirbr0を使用せず、ネットワークインターフェースのみを持つvirbr0を新たに作成して置き換えることにします。
なお、外部に対して公開する仮想サーバーを運用する場合は、ブリッジインターフェースを作成するのが良いのですが、ここでは省略します。
# # 念のため、デフォルトインターフェースの設定内容をバックアップしておきます
# mkdir -p /home/kvm/libvirt                                  # バックアップ先を作成します
# cp /etc/libvirt/qemu/networks/default.xml /home/kvm/libvirt/

# # デフォルトインターフェースのネットワーク定義を削除します
# virsh net-destroy default                                   # ネットワークを停止します
# virsh net-autostart default --disable                       # 自動起動設定を解除します
# virsh net-undefine default                                  # ネットワーク定義を削除します

# # 新しいネットワークの定義ファイルを作成します
# vi /home/kvm/libvirt/virtnet.xml
----------(vi ここから)----------
<network>
  <name>virtnet</name>
  <bridge name="virbr0" />
  <ip address="192.168.101.11" netmask="255.255.255.0" />
</network>
----------(vi ここまで)----------

# # 新しいネットワーク定義を登録して起動します
# virsh net-define /home/kvm/libvirt/virtnet.xml              # ネットワーク定義を登録します
# virsh net-autostart virtnet                                 # 自動起動設定を行います
# virsh net-start virtnet                                     # ネットワークを起動します

ファイアウォール iptables に仮想サーバーのネットワークセグメントの定義を追加します。
※ファイアウォール設定は 『CentOS サーバー運用・管理 iptables』の設定ファイル で行っています。
# vi /usr/local/sbin/firewall.sh
----------(vi ここから)----------
     :
# 外部I/Fのネットワーク情報
     :
# 内部I/Fのネットワーク情報
     :
# 仮想I/Fのネットワーク情報
VIRIF="virbr0"
VIRIP=$(ifconfig $VIRIF | grep inet | cut -d ":" -f 2 | cut -d " " -f 1)
VIRMASK=$(ifconfig $VIRIF | grep Mask | cut -d ":" -f 4)
VIRLAN=$VIRIP'/'$VIRMASK
     :
# --- (INPUTチェイン) ---
     :
# 内部LANからのパケットを許可
     :
# 仮想LANからのパケットを許可
iptables -A INPUT -i $VIRIF -s $VIRLAN -j ACCEPT
iptables -A INPUT -i $VIRIF -p igmp -d 224.0.0.0/4 -j ACCEPT
     :
# --- (OUTPUTチェイン) ---
     :
# 内部LANへのパケットを許可
     :
# 仮想LANへのパケットを許可
iptables -A OUTPUT -o $VIRIF -d $VIRLAN -j ACCEPT
iptables -A OUTPUT -o $VIRIF -p igmp -d 224.0.0.0/4 -j ACCEPT
     :
# --- (FORWARDチェイン) ---
     :
# 内部LANの非特権ポートから外部への転送を許可
     :
# 仮想LANの非特権ポートから外部への転送を許可
iptables -A FORWARD -i $VIRIF -o $EXTIF -s $VIRLAN -p tcp --sport $UNPRIVPORTS -j ACCEPT
iptables -A FORWARD -i $VIRIF -o $EXTIF -s $VIRLAN -p icmp -j ACCEPT----------(vi ここまで)----------

# firewall.sh                                                 # 設定を反映させます

# service libvirtd reload                                     # 仮想マシンの管理デーモンに設定を反映させます

ゲストマシンの作成準備

ゲストマシンのインストール先を準備します。
当サーバーでは、ハードディスク上に仮想サーバー用の物理パーティションを準備し、そこに各仮想サーバー毎に作成したLVMの論理ボリュームにインストールします。
# # ハードディスクの物理パーティションは、ゲストマシン用に /dev/sda4 として作成しています。
# fdisk -l
     :
/dev/sda4           44658       60802   129676288   8e  Linux LVM

# # 物理ボリュームを作成します
# pvcreate /dev/sda4

# # ボリュームグループを作成します
# # (例)VgVirtual という名称で、物理ボリューム /dev/sda4 上に作成します
# vgcreate VgVirtual /dev/sda4

# # ゲストマシンインストール先の論理ボリュームを作成します
# # (例)LvMySQL という名称で、ボリュームグループ VgVirtual 上に 15G のサイズで作成します
# lvcreate -n LvMySQL -L 30G VgVirtual
# lvdisplay /dev/VgVirtual/LvMySQL
  --- Logical volume ---
  LV Path                /dev/VgVirtual/LvMySQL
  LV Name                LvMySQL
  VG Name                VgVirtual
     :
  LV Size                29.30 GiB
     :

ゲストマシンのインストール

ゲストマシンのインストールは、WindowsクライアントPCから Windows X-Server Xming を使用して、GUI管理ツール virt-manager で行うことにします。

ホストマシンのDVDドライブにインストールするOSのメディアをセットして接続します。

•ゲストマシンの作成
(※)クリックすると別画面で拡大画像が開きます。画像は Windows7 64bit のものです。
kvm01.gif Xmingを起動し、PuTTYでホストマシンにSSHでログインします。
SSHコンソールからrootユーザーになり virt-manager を起動します。
kvm02.gif localhost上に新規ゲストマシンを作成します。

localhost(QEMU)を選択し、『新規』で作成を開始します。
kvm03.gif 作成するゲストマシンの名前とOSのインストール方法を設定します。

進む(F)』で次の作成設定に進みます。
kvm04.gif インストールメディアの場所は『CD-ROM または DVD を使用(R)』を選択します。
ISOイメージを準備して、『ISO イメージを使用(I)』を選択しても構いません。

進む(F)』で次の作成設定に進みます。
kvm05.gif ゲストマシンに割り当てるメモリとCPUの数を設定します。

進む(F)』で次の作成設定に進みます。
kvm06.gif ゲストマシンに割り当てるストレージ領域を指定します。

既に確保しているLVM領域を指定しています。

進む(F)』で次の作成設定に進みます。
kvm07.gif ゲストマシンの作成設定の確認画面です。

完了(F)』でゲストマシンが作成されます。
kvm11.gif ゲストマシンが作成されたら、DVDドライブからOSのインストールが開始されます。

OSのインストールを行います。

データベースサーバー専用にするため、Minimal でインストールしています。

インストールが完了したら、DVDドライブからDVDメディアを取り出し、必要に応じてDVDドライブをアンマウントします。

ゲストマシンの初期設定

ゲストマシンのネットワーク設定を行います。
なお、ゲストマシンは固定IPアドレスで運用します。
# # ゲストマシン上での作業です
# vi /etc/sysconfig/network-scripts/ifcfg-eth0
----------(vi ここから)----------
DEVICE="eth0"
BOOTPROTO="static"
IPADDR="192.168.101.101"
NETMASK="255.255.255.0"
GATEWAY="192.168.101.11"
HWADDR="xx:xx:xx:xx:xx:xx"
NM_CONTROLLED="yes"
ONBOOT="yes"
TYPE="Ethernet"
UUID="xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
----------(vi ここまで)----------

# vi /etc/resolv.conf
----------(vi ここから)----------
domain     server.localnet
nameserver 192.168.101.11
----------(vi ここまで)----------

# service network restart                                     # 設定を反映させます

ゲストマシンのshutdownやrebootがホストマシンから行えるよう acpi をインストールします。
# yum -y install acpid
# service acpid start

KVMの管理コンソールでの作業は、管理コンソール外からのコピー&ペーストができず、効率的に大きな問題があります。
そのため、最小必要限の設定のみ行い、残りの設定はゲストマシンへのSSH接続環境が整ってから行います。

ゲストマシンの動作設定

ゲストマシンの時刻やマウスの設定を行います。
# # ホストマシン上での作業です
# vi /etc/libvirt/qemu/actmysql.xml                           # 下線部はゲストマシンの名前です
----------(vi ここから)----------
     :
  <clock offset='localtime'/>                                 # 時刻を日本時間にします
     :
    <input type='mouse' bus='ps2'/>
    <input type='tablet' bus='usb'/>                          # マウスカーソルがずれないようにします----------(vi ここまで)----------

# # 変更した定義を反映し、ゲストマシンを再起動します
# virsh define /etc/libvirt/qemu/actmysql.xml
# virsh reboot actmysql

# # ホストマシン起動時に、ゲストマシンが自動起動するようにします
# virsh autostart actmysql

ホストマシン側NFSの設定

ホストマシンとゲストマシン間でのファイルの受け渡しに NFS(Network File System) を使用して、ネットワーク越しにファイルの受け渡しができるようにします。

ホストマシン側のNFS設定を行います。
# # NFSをインストールし、自動起動設定を行います
# yum -y install nfs-utils
# chkconfig nfs on

# # ゲストマシンから参照されるディレクトリを作成します
# mkdir /home/exports
# chmod 777 /home/exports

# # NFSの定義を行います
# vi /etc/exports
----------(vi ここから)----------
/home/exports   192.168.101.0/24(ro)                          # ゲストマシンから参照のみで許可しています
----------(vi ここまで)----------

# vi /etc/hosts.deny
----------(vi ここから)----------portmap: ALL                                                  # リモートによるNFS関連サービスの使用を禁止します
lockd:   ALL
rquotad: ALL
mountd:  ALL
statd:   ALL
----------(vi ここまで)----------

# vi /etc/hosts.allow
----------(vi ここから)----------portmap: 192.168.101.0/255.255.255.0                          # 仮想サーバーからのNFS関連サービスの使用を許可します
lockd:   192.168.101.0/255.255.255.0
rquotad: 192.168.101.0/255.255.255.0
mountd:  192.168.101.0/255.255.255.0
statd:   192.168.101.0/255.255.255.0
----------(vi ここまで)----------

# # NFSサービスの(再)起動を行います
# service rpcbind restart
# service nfs     restart

ゲストマシンへのSSH接続準備

ゲストマシン上での作業をリモートで行うため、SSHでの接続準備を行います。

なお、ファイアウォール iptables の設定で、ホストマシン以外からゲストマシンへは直接アクセスできないように設定しています。
そのため、ゲストマシンへのSSHログインはパスワード認証でも良いのですが、念のため公開鍵認証方式のみにします。

ゲストマシンにログインするホストマシンのユーザーでSSHの鍵セットを作成します。
既に作成している場合は、新たに作成する必要はありません。
$ ssh-keygen -t rsa -C "SSH Connection User - sshuser"
Generating public/private rsa key pair.
Enter file in which to save the key (/home/users/sshuser/.ssh/id_rsa): [Enter]
Created directory '/home/users/sshuser/.ssh'.
Enter passphrase (empty for no passphrase): 鍵のパスフレーズ
Enter same passphrase again: 鍵のパスフレーズ(再入力)
     :

$ # NFSを経由して公開鍵をゲストマシンに送ります
$ cp .ssh/id_rsa.pub /home/exports/

ゲストマシンの初期設定(続き)

ホストマシンからゲストマシンにSSHでリモートログインし、ゲストマシンの残りの初期設定を行います。
$ # ホストマシンからゲストマシン(例:actmysql.server.localnet)にSSHでログインします
$ # DNSサーバーを運用していますので、IPアドレスではなくホスト名を使用しています
$ # (※)まだ、パスワード認証になっています
$ ssh root@actmysql.server.localnet
The authenticity of host 'actmysql.server.localnet (192.168.101.101)' can't be established.
RSA key fingerprint is …
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'actmysql.server.localnet,192.168.101.101' (RSA) to the list of known hosts.
root@actmysql.server.localnet's password: ゲストマシンのrootユーザーログインパスワード

[vm]# # ここからはゲストマシン上での作業です

[vm]# # SELinuxの設定を行います
[vm]# # SELinuxの設定をログ出力のみにします
[vm]# setenforce Permissive                                   # 動作モードを変更します

[vm]# # 再起動しても動作モードが Permissive になるように設定します
[vm]# vi /etc/selinux/config
----------(vi ここから)----------
       :
SELINUX=permissive
       :
----------(vi ここまで)----------

[vm]# # ファイアーウォールの設定を行います
[vm]# # ファイアーウォールのスクリプトを作成します
[vm]# vi /usr/local/sbin/firewall.sh
----------(vi ここから)----------
#!/bin/sh
# ==========================================================================================
# File    : firewall.sh
# Author  : System House ACT
#
# 仮想サーバーのファイアウォールの設定を行う
#
# Copyright 2012 System House ACT All rights reserved.
# ==========================================================================================

# --------------------------------------------------------------------------- (変数定義) ---
# 仮想サーバーのネットワーク情報
VIRIF="eth0"
VIRIP=$(ifconfig $VIRIF | grep inet | cut -d ":" -f 2 | cut -d " " -f 1)
VIRMASK=$(ifconfig $VIRIF | grep Mask | cut -d ":" -f 4)
VIRLAN=$VIRIP'/'$VIRMASK

# 非特権ポート
UNPRIVPORTS="1024:65535"

# ----------------------------------------------------------------------------- (初期化) ---
# 全チェインを空にする
iptables           -F
iptables -t nat    -F
iptables -t mangle -F

# 全ユーザー定義チェインを削除する
iptables           -X
iptables -t nat    -X
iptables -t mangle -X

# 全チェインのカウンタをクリアする
iptables           -Z
iptables -t nat    -Z
iptables -t mangle -Z

# デフォルトポリシーをDROPに設定する
iptables -P INPUT   DROP
iptables -P OUTPUT  DROP
iptables -P FORWARD DROP

# iptablesパラメータ
LOGLIMIT="1/s"                                                # ログマッチ許可   1回/秒
LOGBURST="3"                                                  # ログマッチ最大値 3回

# ----------------------------------------------------------------------- (ログチェイン) ---
# DROPパケット
iptables -N LOG-DROP
iptables -A LOG-DROP -p all \
                     -m limit --limit $LOGLIMIT --limit-burst $LOGBURST \
                     -j LOG --log-prefix "iptables DROP "
iptables -A LOG-DROP -f \
                     -m limit --limit $LOGLIMIT --limit-burst $LOGBURST \
                     -j LOG --log-prefix "iptables FRAGMENT DROP "
iptables -A LOG-DROP -j DROP

# ---------------------------------------------------------------------- (INPUTチェイン) ---
# ローカルからのパケットを許可
iptables -A INPUT -i lo -j ACCEPT

# 仮想サーバーセグメントからのパケットを許可
iptables -A INPUT -i $VIRIF -s $VIRLAN -j ACCEPT

# ESTABLISHED/RELATED接続を許可
iptables -A INPUT -i $VIRIF -m state --state ESTABLISHED -j ACCEPT
iptables -A INPUT -i $VIRIF -p tcp --dport $UNPRIVPORTS \
                            -m state --state RELATED     -j ACCEPT
iptables -A INPUT -i $VIRIF -p udp --dport $UNPRIVPORTS -m state --state RELATED -j ACCEPT

iptables -A INPUT -j LOG-DROP

# --------------------------------------------------------------------- (OUTPUTチェイン) ---
# ローカルのパケットを許可する
iptables -A OUTPUT -o lo -j ACCEPT

# 仮想サーバーセグメントへのパケットを許可
iptables -A OUTPUT -o $VIRIF -d $VIRLAN -j ACCEPT

# OUPUT ICMPパケットを許可
iptables -A OUTPUT -o $VIRIF -p icmp -j ACCEPT

# 非特権ポートからのTCP/UDPパケットを許可
iptables -A OUTPUT -o $VIRIF -s $VIRIP -p tcp --sport $UNPRIVPORTS -j ACCEPT
iptables -A OUTPUT -o $VIRIF -s $VIRIP -p udp --sport $UNPRIVPORTS -j ACCEPT

iptables -A OUTPUT -j LOG-DROP

# ------------------------------------------------------------------------- (定義の保存) ---
service iptables save
----------(vi ここまで)----------

[vm]# # 作成したスクリプトを実行します
[vm]# chmod +x /usr/local/sbin/firewall.sh
[vm]# /usr/local/sbin/firewall.sh

ゲストマシンのリポジトリ設定

ゲストマシンのリポジトリに、Fedoraプロジェクトの有志により作成されたエンタープライズLinux用の拡張パッケージである EPEL(Extra Packages for Enterprise Linux) とLAMPパッケージを中心に新しいバージョンのパッケージが存在する Remi を追加します。
[vm]# # ゲストマシン上での作業です
[vm]# # EPELリポジトリからのインストール設定
[vm]# # リポジトリの優先順位を管理するプラグイン yum-priorities をインストールします
[vm]# yum -y install yum-priorities

[vm]# # CentOS-Base.repo の各リポジトリが優先されるように設定します
[vm]# # PHPとMySQL関連のパッケージは、Remiリポジトリからインストールしますので対象外にします
[vm]# vi /etc/yum.repos.d/CentOS-Base.repo
----------(vi ここから)----------
       :
[base]
       :
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6
priority=10
exclude=php* mysql*

#released updates
[updates]
       :
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6
priority=10
exclude=php* mysql*

#packages used/produced in the build but not released
[addons]
       :
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6
priority=10

#additional packages that may be useful
[extras]
       :
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6
priority=10

#additional packages that extend functionality of existing packages
[centosplus]
       :
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6
priority=20

#contrib - packages by Centos Users
[contrib]
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6
priority=20
----------(vi ここまで)----------

[vm]# # EPELリポジトリの署名確認用のキーファイルを取得します
[vm]# rpm --import http://dl.fedoraproject.org/pub/epel/RPM-GPG-KEY-EPEL-6

[vm]# # EPELリポジトリをインストールします
[vm]# rpm -ihv http://download.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-7.noarch.rpm
[vm]# # (※)下線部は 2012/11/12 現在の最新リリース番号です。

[vm]# # EPELリポジトリの設定を行います
[vm]# vi /etc/yum.repos.d/epel.repo
----------(vi ここから)----------
[epel]
       :
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-6
priority=91

[epel-debuginfo]
       :
----------(vi ここまで)----------

[vm]# # Remiリポジトリからのインストール設定
[vm]# # Remiリポジトリの署名確認用のキーファイルを取得します
[vm]# rpm --import http://rpms.famillecollet.com/RPM-GPG-KEY-remi

[vm]# # Remiリポジトリをインストールします
[vm]# rpm -ihv http://rpms.famillecollet.com/enterprise/remi-release-6.rpm

[vm]# # Remiリポジトリの設定を行います
[vm]# vi /etc/yum.repos.d/remi.repo
----------(vi ここから)----------
[remi]
       :
enabled=1                                                     # リポジトリを有効にします
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-remi
failovermethod=priority
priority=92
       :
----------(vi ここまで)----------

ゲストマシンからの通知メール転送

ゲストマシンからの通知メールをホストマシンに転送するため、軽量なSMTPサーバー sSMTP をインストールします。
[vm]# # ゲストマシン上での作業です
[vm]# # EPELリポジトリから sSMTP をインストールします
[vm]# yum -y install ssmtp

[vm]# # sSMTPの設定を行います
[vm]# vi /etc/ssmtp/ssmtp.conf
----------(vi ここから)----------
       :
mailhub=smtp.system-act.com                                   # 転送先のSMTPサーバーを指定します
       :
# The full hostname
#Hostname=
Hostname=actmysql.server.localnet                             # ゲストマシン自身のホスト名を指定します
       :
----------(vi ここまで)----------

ゲストマシンのパッケージ更新

ゲストマシンのパッケージを最新のバージョンに更新し、自動更新設定を行います。
[vm]# # ゲストマシン上での作業です
[vm]# # 不要なパッケージを削除します
[vm]# yum -y erase \
[vm]>   dhclient dhcp-common                                  # DHCPを使用しません

[vm]# # パッケージの更新を行います
[vm]# yum -y update

[vm]# # 自動更新ツール yum-cron をインストールします
[vm]# yum -y install yum-cron

[vm]# # yum-cronの設定を行います
[vm]# vi /etc/sysconfig/yum-cron
----------(vi ここから)----------
       :
SERVICE_WAIT_TIME=86400                                       # 更新のチェックを1回/日(60秒×60分×24時間)にします
----------(vi ここまで)----------

[vm]# chkconfig yum-cron on                                   # 自動更新サービスを起動します
[vm]# service yum-cron start
[vm]# service crond restart

ゲストマシンのログ管理

ゲストマシンのログ管理を行います。
[vm]# # ゲストマシン上での作業です
[vm]# # ログ監視ツールLogWatchをインストールします
[vm]# yum -y install logwatch

ゲストマシンのNTP設定

ゲストマシンの時刻をホストマシンに同期させるためNTPをインストールします。
[vm]# # ゲストマシン上での作業です
[vm]# # NTPをインストールします
[vm]# yum -y install ntp

[vm]# # NTPの設定を行います
[vm]# vi /etc/ntp.conf
----------(vi ここから)----------
       :
# Use public servers from the pool.ntp.org project.
# Please consider joining the pool (http://www.pool.ntp.org/join.html).
server ntp.server.localnet                                    # ホストマシンのNTPサーバーを指定しています
#server 1.centos.pool.ntp.org                                 # ホストマシンのNTPサーバーのみと同期させますので
#server 2.centos.pool.ntp.org                                 # コメントアウトします
       :
----------(vi ここまで)----------

[vm]# # NTPを起動します
[vm]# chkconfig ntpd on
[vm]# service   ntpd start

ゲストマシンのNFS設定

ゲストマシンにNFSをインストールし、ホストマシンとの共有設定を行います。
[vm]# # ゲストマシン上での作業です
[vm]# # NFSをインストールし、自動起動設定を行います
[vm]# yum -y install nfs-utils
[vm]# chkconfig nfs on

[vm]# # 共有ディレクトリを作成します
[vm]# mkdir /home/exports
[vm]# chmod 777 /home/exports

[vm]# # NFSの定義を行います
[vm]# # ホストマシンのホスト名を gateway.server.localnet としています
[vm]# vi /etc/exports
----------(vi ここから)----------
/home/exports   gateway.server.localnet(ro)                   # ホストマシンからのみ参照で許可しています
----------(vi ここまで)----------

[vm]# vi /etc/hosts.deny
----------(vi ここから)----------portmap: ALL                                                  # リモートによるNFS関連サービスの使用を禁止します
lockd:   ALL
rquotad: ALL
mountd:  ALL
statd:   ALL
----------(vi ここまで)----------

[vm]# vi /etc/hosts.allow
----------(vi ここから)----------portmap: gateway.server.localnet                              # ホストマシンからのNFS関連サービスの使用は許可します
lockd:   gateway.server.localnet
rquotad: gateway.server.localnet
mountd:  gateway.server.localnet
statd:   gateway.server.localnet
----------(vi ここまで)----------

[vm]# NFSサービスのIPv6を無効化します
[vm]# vi /etc/netconfig
----------(vi ここから)----------#udp6       tpi_clts      v     inet6    udp     -       -    # コメントアウトします
#tcp6       tpi_cots_ord  v     inet6    tcp     -       -
     :
----------(vi ここまで)----------

[vm]# NFSサービスの(再)起動を行います
[vm]# service rpcbind restart
[vm]# service nfs     restart

ゲストマシンのユーザー管理

ゲストマシンのユーザー管理に関する設定を行います。
# ゲストマシン上での作業です

ゲストマシンの登録ユーザーにメールアカウントは不要ですので、新規ユーザー作成時にメールボックスが作成されないようにします。
[vm]# vi /etc/default/useradd
----------(vi ここから)----------
       :
CREATE_MAIL_SPOOL=no
       :
----------(vi ここまで)----------

新規Linuxユーザー作成時に -m オプション無指定でホームディレクトリが作成されないようにします。
[vm]# vi /etc/login.defs
----------(vi ここから)----------
       :
CREATE_HOME     no
       :
----------(vi ここまで)----------

suコマンドの使用をrootとwheelグループユーザーのみに制限します。
[vm]# vi /etc/pam.d/su
----------(vi ここから)----------
       :
# Uncomment the following line to require a user to be in the "wheel" group.
#auth         required        pam_wheel.so use_uid
auth         required        pam_wheel.so use_uid             # コメントを外します
       :
----------(vi ここまで)----------

sudoコマンドの使用をwheelグループユーザーに許可します。
# visudo
----------(vi ここから)----------
       :
## Allows people in group wheel to run all commands
# %wheel        ALL=(ALL)       ALL
%wheel  ALL=(ALL)       ALL                                   # コメントを外します

## Same thing without a password
       :
----------(visudo ここまで)----------

ゲストマシン上の開発ユーザー登録

ゲストマシンで開発(コンパイル等)を行うユーザー(例:devel)を登録します。
※ ゲストマシン上での作業です
[vm]# rmdir /usr/local/src                                    # 開発ソースディレクトリを一度削除します
[vm]# useradd devel -g users -G wheel -d /usr/local/src -m
[vm]# passwd devel                                            # sudoコマンドを使用するため、パスワードを設定します
ユーザー devel のパスワードを変更。
新しいパスワード:ユーザー devel に設定するパスワード
新しいパスワードを再入力してください:ユーザー devel に設定するパスワード(再入力)
passwd: 全ての認証トークンが正しく更新できました。

[vm]# # NFSで渡されたSSHログイン用の公開鍵を取得するため、NFSのマウントを行います
[vm]# mkdir /mnt/imports
[vm]# mount -t nfs gateway.server.localnet:/home/exports /mnt/imports

[vm]# # SSHログイン用に公開鍵を登録します
[vm]# su - devel
[vm]$ mkdir .ssh
[vm]$ chmod 700 .ssh
[vm]$ cat /mnt/imports/id_rsa.pub >> .ssh/authorized_keys

[vm]$ exit
logout

[vm]# # SSHログインを公開鍵方式のみにするとともに、rootログインを禁止します
[vm]# vi /etc/ssh/sshd_config
----------(vi ここから)----------
       :
#ListenAddress 0.0.0.0
ListenAddress 0.0.0.0                                         # IPv4のみ有効にしています
#ListenAddress ::
       :
#PermitRootLogin yes
PermitRootLogin no                                            # rootによるログインを禁止します
       :
#PasswordAuthentication yes
#PermitEmptyPasswords no
PasswordAuthentication no                                     # パスワード認証は行いません
       :
#ChrootDirectory none

AllowUsers  devel                                             # ログインを許可するユーザーのリストを空白で区切って指定します

# no default banner path
       :
----------(vi ここまで)----------

ゲストマシンの再起動

ゲストマシンからログアウトして、ゲストマシンを再起動します。
[vm]# exit
logout
Connection to actmysql.server.localnet closed.

# # ここからはホストマシン上での作業です
# virsh reboot actmysql

フィードバック

記事の内容についてのご質問、ご指摘、その他ご意見等は、公式ブログ/Twitter にて受け付けております。

System House ACT 公式ブログ内記事 : KVMによる仮想サーバーの構築

トラックバックまたはコメントにてお寄せください。

Twitter では .@systemact 宛につぶやいてください。
また、こちら から、この記事についてつぶやくことができます。
a System House to build an Accounting system by the Computer Technology