Installation d'un hôte sous CentOS 5 pour héberger des machines virtuelles

Configuration des dépôts

Configurer les dépôts RPMForge, EPEL, ATRpms, fws et lfarkas (voir cette page)

Installation des outils de base

Certains outils sont indispensables

yum --enablerepo=rpmforge install htop screen strace

Installation des outils de virtualisation

yum install kvm

Puis:

yum --enablerepo=fws install perl-Sys-Virt libvirt

: il y'a un problème avec le dépôt, pour l'instant, il faut télécharger les rpm puis yum localinstall...

yum --enablerepo=epel install pbzip2

Ajustements SELinux

Il faut ajouter une politique de sécurité personnalisée pour autoriser qemu à accéder aux volumes logiques LVM, à certains binaires (save/restore) etc...

mkdir -p /etc/selinux/targeted/custom
cd /etc/selinux/targeted/custom
vim qemucustom.te

Puis y placer les lignes suivantes:

module qemucustom 1.0;
require {
type virt_var_lib_t;
type shell_exec_t;
type tmp_t;
type bin_t;
type qemu_t;
class lnk_file read;
class file { ioctl execute execute_no_trans read getattr append write};
class dir { write add_name };
class sock_file create;
}
#============= qemu_t ==============
allow qemu_t bin_t:lnk_file read;
allow qemu_t shell_exec_t:file { read getattr execute execute_no_trans };
allow qemu_t virt_var_lib_t:dir { write add_name };
allow qemu_t virt_var_lib_t:file { ioctl append write };
allow qemu_t virt_var_lib_t:sock_file create;
allow qemu_t bin_t:file { read getattr execute execute_no_trans };

Il faut maintenant compiler ce fichier en module chargeable dans le noyau

checkmodule -M -m -o qemucustom.mod qemucustom.te
semodule_package -o qemucustom.pp -m qemucustom.mod

Maintenant, il reste à mettre en place un script wrapper autour de qemu-kvm pour modifier le label des volumes LVM à la volé, avant de démarrer une machine:

cat <<"EOF" > /usr/local/bin/qemu-kvm
#!/bin/sh
for VG in data usb1; do
if [ -e /dev/\$VG ]; then
chcon -t virt_image_t /dev/mapper/\$VG-*
blockdev --setra 32768 /dev/\$VG/*
fi
done
exec /usr/libexec/qemu-kvm "\$@"
exit \$?
EOF
chmod 755 /usr/local/bin/qemu-kvm
ln -s /usr/local/bin/qemu-kvm /usr/bin/qemu-kvm

Bien sûre en remplaçant data et usb1 par vos VG

Configuration de l'interface "interne" en mode bridge

Pour pouvoir connecter les VM sur le réseau local (ou les réseau locaux à l'hôte physique, il peut s'agir de DMZ, ou n'importe quel sous-réseau connecté à l'hôte physique), il faut que ces interfaces fassent partie d'un bridge (=switch virtuel)

cd /etc/sysconfig/network-scripts
cat <<EOF > ifcfg-eth0
DEVICE=eth0
HWADDR=00:16:76:D6:C9:45
ONBOOT=yes
BRIDGE=br0
EOF

En adaptant l'adresse mac (ici 00:16:76:D6:C9:45)

Pour un bridge configuré via DHCP:

cat <<EOF > ifcfg-br0
DEVICE=br0
TYPE=Bridge
BOOTPROTO=dhcp
ONBOOT=yes
DELAY=0
EOF

Pour une configuration en IP fixe

cat <<EOF > ifcfg-br0
DEVICE=br0
TYPE=Bridge
BOOTPROTO=static
IPADDR=192.168.7.2
NETMASK=255.255.255.0
BROADCAST=192.168.7.255
NETWORK=192.168.7.0
ONBOOT=yes
DELAY=0
EOF

Connexion distante à libvirt

Le plus simple est d'utiliser un tunnel SSH. Pour cela, nous allons utiliser un compte avec des privilèges réduits:

Création d'un utilisateur aux privilèges réduits

groupadd libvirt
useradd -c 'Firewall Services' -m -d /home/fws -s /bin/bash fws
usermod -a -G libvirt fws

Ajustement des permissions du socket

Éditer le fichier /etc/libvirt/libvirtd.conf et dé-commenter les lignes unix_sock_group et unix_sock_rw_perms

#################################################################
#
# UNIX socket access controls
#
# Set the UNIX domain socket group ownership. This can be used to
# allow a 'trusted' set of users access to management capabilities
# without becoming root.
#
# This is restricted to 'root' by default.
unix_sock_group = "libvirt"
# Set the UNIX socket permissions for the R/O socket. This is used
# for monitoring VM status only
#
# Default allows any user. If setting group ownership may want to
# restrict this to:
#unix_sock_ro_perms = "0777"
# Set the UNIX socket permissions for the R/W socket. This is used
# for full management of VMs
#
# Default allows only root. If PolicyKit is enabled on the socket,
# the default will change to allow everyone (eg, 0777)
#
# If not using PolicyKit and setting group ownership for access
# control then you may want to relax this to:
unix_sock_rw_perms = "0770"
# Set the name of the directory in which sockets will be found/created.
#unix_sock_dir = "/var/run/libvirt"
#################################################################

Ces modifications permettent à tout les utilisateurs membre du groupe libvirt de contrôler entièrement libvirt (accès rw sur le socket rw). Pour appliquer les changements, il faut redémarrer libvirt:

/etc/init.d/libvirtd restart

Mettre en place une authentification SSH par clef (sans mot de passe)

su - fws
cd
mkdir -p .ssh
chmod 700 .ssh
touch .ssh/authorized_keys
chmod 600 .ssh/authorized_keys

Puis placer votre clef publique dans le fichier authorized_keys

Monitoring

Le monitoring sera assuré par Zabbix. Un proxy sera installé sur la machine physique pour pouvoir remonter les info de toutes les machines virtuelles

yum --enablerepo=rpmforge --enablerepo=fws install zabbix-agent zabbix-proxy-sqlite3 --exclude=*i386