---
Title: Installer Openvz 7 à distance
subtitle: Bonus : chiffrez le intégralement
date: 2017-11-23 23:31
Authors: Victor
Slug: installer-openvz7-a-distance
Tags: openvz7, installation distante, chiffrement, LUKS, centos
keywords: openvz7, installation distante, chiffrement, LUKS, centos
Status: published
---
[TOC]
**Edit 2022**: Article mis à jour pour nettoyer les parties obsolètes : utilisation de sshd et du raid soft
# Vous n'avez accès à rien ?
Pas d'ipmi, pas de KVM, pas de console ? Et pourtant vous voulez installer votre serveur openvz ?
C'est possible et dans cet article, on va voir comment vous pouvez vous en tirer !
En bonus, parce que sinon ce serait trop facile, on va également voir comment chiffrer le serveur et lancer un serveur SSH au boot pour entrer le mot de passe et déchiffrer le disque.
Vous aurez ainsi un serveur openvz entièrement chiffré pour faire tourner vos container ou vos VM, ce qui est très appréciable à notre époque où la confidentialité des données est un problème important.
Vous pouvez très bien faire confiance à votre hébergeur (ou à ceux qui pourraient lui demander d'accéder à vos données), mais personnellement je pense que si vous ne vous mettez pas dans la situation ou vous **devez** lui faire confiance, c'est encore plus simple ;-)
Je ne vais par contre pas vous mentir, sans accès visuel, le debug en cas de problèmes peut être trèèèèès relou.
Je vais ici décrire la procédure complète qui a fonctionné plusieurs fois chez moi, mais il a fallut de nombreux tests... Si jamais vous ne vous en sortez pas, n'hésitez pas à commenter, j'essaierai de vous aider au mieux !
**Attention !** Cela va de soit, mais cette procédure va totalement effacer les données de votre serveur. S'il n'est pas neuf et que vous souhaitez récupérer des données dessus, pensez à les backuper ;-)
# Prérequis
Je le dis tout de suite, il va vous falloir quand même quelques trucs pour vous faciliter la vie et permettre l'installation.
* Un serveur HTTP (pas hébergé sur le serveur que vous installez !) accessible par le serveur que vous souhaitez installer. Voir ci-dessous.
* Un client VNC. Je vous conseille [Reminna](http://www.remmina.org/wp/) si vous utilisez Linux. Sous Windows, je ne peux pas vous aider.
* Un client SSH. Openssh sous Linux, ou [putty](http://www.putty.org/) sous Windows.
* Il vous faut un mode rescue avec votre hébergeur... Même minimaliste, avec au moins un accès SSH, nécessaire pour le chroot.
* Installer votre serveur sur votre OS préféré pour le préparer, j'utiliserai pour ma part Debian 11.
## Préparer le serveur HTTP
Pour permettre l'installation à distance, il va falloir faire en sorte que les fichiers de l'image ISO openvz7 soient accessibles en HTTP pour que votre serveur puisse récupérer les fichiers à distance lors de son démarrage.
**Ces manipulations doivent donc avoir lieu sur un AUTRE serveur que celui que vous allez installer !**
Je partirai également du principe que vous avez un serveur HTTP. N'importe quel serveur web fera l'affaire, apache, nginx, IIS, c'est selon vos préférenes ou ce qui est disponible.
Téléchargez votre iso depuis les [mirroirs openvz](https://download.openvz.org/virtuozzo/releases/7.0/x86_64/iso/). Vous pouvez prendre l'image classique (pas la netinstall).
Il va vous falloir mettre à disposition les fichiers de l'image via HTTP. On va donc monter l'ISO sur votre serveur web, puis poser les fichiers dans un vhost pour qu'ils soient disponibles.
mount openvz-iso-7.0.5-netinstall.iso /votre_repertoire_web/
Faites en sortes que ce répertoire soit accessible sur une adresse type http://votredomain.tld/vz. Il doit pointer directement dans le répertoire où est montée l'image.
Notez cette adresse dans un coin, ça va resservir. :-)
## Préparer le serveur pour l'installation
### Nettoyez les disques en mode rescue
Redémarrer votre serveur sur votre mode rescue, pour nettoyer à fond les disques dur de votre serveur avant l'installation.
Pour ça, on va utiliser l'outil [Shred](https://fr.wikipedia.org/wiki/Shred_(commande_unix)). En mode rescue, vous pouvez effacer vos disques tranquillement.
Je vous conseille d'utliser au moins 2 passes, tout en remplissant de zéro pour être carré :
shred -n 2 -z /dev/sda
Ca peut prendre pas mal de temps selon la taille des disques, jusqu'à plusieurs heures... Lancez le de nuit si possible, mais pour que le chiffrement soit efficace, mieux vaut que le disque ne soit pas prédictible :-)
### Poser les fichiers d'installation
Pour télécharger les fichiers nécessaires au lancement de l'installation, il vous faudra un OS installé sur votre serveur.
Vous aurez besoin de générer un grub et de poser quelques fichiers dans /boot donc un Linux selon votre préférence. Pour ma part, je part sur un debian.
Réinstallez donc votre serveur via le système d'installation de votre hébergeur, connectez vous en SSH, et go !
Récupérez via votre serveur HTTP (celui avec l'ISO montée) les 2 fichiers d'install PXE :
wget http://votredomaine.tld/vz/images/pxeboot/initrd.img -O /boot/initrd_ovz7.img
wget http://votredomaine.tld/vz/images/pxeboot/vmlinuz -O /boot/vmlinuz_ovz7
Notez la configuration réseau de votre serveur. Il vous faut adresse IP, passerelle, masque réseau et serveurs DNS :
ip address show
cat /etc/resolv.conf
Vérifiez quel driver grub utilise pour votre partition de boot, et l'id de la partition /boot au passage :
grep "hint" /boot/grub/grub.cfg
# search --no-floppy --fs-uuid --set=root --hint='hd0,msdos1' xxxx-xxxx-xxxx-xxxx-xxxx
# Ici on veut récupérer l'info du --hint, ainsi que l'ID du disque xxxx-....
On va ensuite éditer grub pour ajouter une entrée spécifique pour booter sur l'installeur :
vim /etc/grub.d/40_custom
Et ajoutez après les commentaires le contenu suivant :
**Attention à ne pas enlever le ``exec tail -n +3 $0`` dans le fichier**
menuentry 'NetInstall' {
load_video
set gfxpayload=keep
insmod gzio
insmod part_msdos
insmod ext2
set root='HINT'
if [ x$feature_platform_search_hint = xy ]; then
search --no-floppy --fs-uuid --set=root --hint='HINT' ID_DISQUE
else
search --no-floppy --fs-uuid --set=root ID_DISQUE
fi
linux /vmlinuz_ovz7 vnc vncpassword=guigui inst.vncpassword=guigui headless inst.repo=https://votredomaine.tld/vz/ ip=IP_SERVEUR netmask=MASQUE_SERVEUR gateway=PASSERELLE_SERVEUR dns=DNS_SERVEUR nameserver=DNS_SERVEUR biosdevname=0 net.ifnames=0 ksdevice= bootproto=static lang=en_US keymap=us text noipv6
initrd /initrd_ovz7.img
}
Cette configuration va permettre de redémarrer le serveur sur une console VNC pour permettre d'installer openvz7 en mode graphique à distance :-)
Editez bien entendu les valeurs ci dessous :
* ID_DISQUE : l'id de la partition récupérée plus tôt
* HINT : le numéro de disque et la table de partition associé récupéré dans grub.cfg (ex : `hd0,msdos`, `hd1,gpt`, ...)
* IP_SERVEUR : l'adresse IP du serveur
* MASQUE_SERVEUR : le masque de sous réseau de votre serveur
* PASSERELLE_SERVEUR : la passerelle par défaut de votre serveur
* DNS_SERVEUR (x2) : l'IP du serveur DNS remontée plus tôt
* mot de passe vnc : il doit faire entre 4 et 6 caractères, donc si vous le changez, restez dans ces critères
Puis regénérez la configuration de grub :
grub-mkconfig -o /boot/grub/grub.cfg
Et enfin, configurez votre serveur pour redémarrer sur votre installeur au prochain reboot. Cette option permettra de redémarrer sur l'entrée grub, mais une fois seulement.
Ainsi, si jamais il ne démarre pas ou que l'installation se passe mal (avant le formatage bien sûr), un simple redémarrage électrique le fera redémarrer sur son OS de base.
grub-reboot NetInstall
**Attention**, si votre serveur utilise une partition /boot sur un RAID soft, cette commande est durable. En cas de souci, il faudra passer par le rescue pour reconfigurer le démarrage sur le bon os.
On va maintenant pouvoir redémarrer et récupérer la console VNC.
# Installation d'openvz 7 !
Redémarrez votre serveur, et lancez un ping sur son adresse IP. Dès qu'il répond, lancez votre console VNC sur l'IP du serveur, avec le port `:5901` ou `:1`.
**Attention**, malgré pas mal de recherches et de tests, je n'ai pas réussi à monter une connexion chiffrée pour ce VNC... Sachez donc que tout ce que vous y entrerez sera potentiellement récupérable en clair sur Internet !
Préparez vous donc à utiliser des mots de passe temporaires pour le chiffrement des disques et les accès utilisateurs. Nous les changerons dès l'installation terminée via une connexion SSH un peu plus robuste :-)
Vous avez accès à la console VNC en mode graphique, donc rien de très compliqué pour l'installation. La [documentation officielle](https://docs.openvz.org/openvz_installation_guide.webhelp/_installing_openvz_in_graphics_mode.html) est parfaite à ce niveau là.
Normalement, la configuration réseau est déjà faite grâce aux options de grub, donc rien à toucher.
Le partitionnement des disques par défaut est en théorie suffisant, **mais** c'est le moment de penser à cocher "Encrypt" !
Vous devez cocher la case pour toutes les partitions sauf /boot et la petite partition "BIOS Boot".
En sortant du menu de partionnement, l'installeur vous demandera les mots de passe pour le chiffrement. Il est important de mettre le même mot de passe pour toutes les partitions.
Attention là encore à ne pas mettre le mot de passe final, car la connexion à VNC n'est pas chiffrée !
Laissez ensuite l'installation se terminer tranquillement, puis passez à la suite.
# SSH et réseau au démarrage
Pour cette partie, il va falloir redémarrer votre serveur en mode rescue de nouveau.
En effet, votre serveur est désormais installé, ses disques sont chiffrés, mais vous n'avez pour l'instant aucun moyen de taper le mot de passe demandé au boot pour déchiffrer les disques !
On va donc modifier directement le initramfs pour y intégrer un petit serveur SSH qui se lancera au boot, et qui permettra ainsi de taper le mot de passe au démarrage en toute sécurité.
Une fois revenu en mode rescue, préparez vous à monter votre système en chroot. Je part ici du principe que vous avez gardé le partionnement par défaut, donc pensez à adapter le nom des partitions dans la suite si besoin.
On va commencer par changer les mots de passe bidon des partitions maintenant que nous sommes sur une connexion ssh sécurisée.
La manipulation change toutefois selon que vous ayez gardé du lvm monodisque, ou utilisé une configuration avec raid multidisque, choisissez celle qui vous convient le mieux !
## chroot avec lvm
cliquez pour déplier
On va activer les volumes lvm, changer les mots de passe luks, puis activer la partition root et la monter pour entrer en chroot.
```
vgchange -a y
cryptsetup luksChangeKey /dev/sda3 # On change le mot de passe du swap
cryptsetup luksChangeKey /dev/mapper/virtuozzo-root # On change le mot de passe du /
cryptsetup luksChangeKey /dev/mapper/virtuozzo-vz # On change le mot de passe du vz
cryptsetup luksOpen /dev/mapper/virtuozzo-root crypt_root
mkdir -p /mount/openvz
mount /dev/mapper/crypt_root /mount/openvz
mount /dev/sda2 /mount/openvz/boot
mount -o bind /dev/ /mount/openvz/dev/
mount -o bind /sys/ /mount/openvz/sys
mount -o bind /proc/ /mount/openvz/proc/
chroot /mount/openvz
```
cliquez pour déplier
l'objectif est de signaler au système l'existence de volumes raid avec les bonnes partitions, changer les mots de passe luks, puis activer la partition root et la monter pour entrer en chroot.
Pour commencer, récupérez les partitions qui correspondent entre-elles sur vos disques
```
fdisk -l /dev/sda
# Start End Size Type Name
1 2048 4095 1M BIOS boot
2 4096 2101247 1G Microsoft basic
3 2101248 5760518143 2,7T Linux RAID
4 5760518144 5827631103 32G Linux RAID
5 5827631104 5860532223 15,7G Linux RAID
fdisk -l /dev/sdb
# Start End Size Type Name
1 2048 5758418943 2,7T Linux RAID
2 5758418944 5825531903 32G Linux RAID
3 5825531904 5858433023 15,7G Linux RAID
```
L'objectif ici est de **rapprocher** les partitions qui "vont ensembles" en raid mdadm, en utilisant leur taille, puisque 2 partitions en raid doivent être identiques.
On observe par exemple que
- sda3 est liée à sdb1
- sda4 est liée à sdb2 # Au passage, cette partition est notre partition root, à repérer pour savoir quelle partition monter dans le chroot
- sda5 est liée à sdb3
Une fois cette correspondance faite, on va dire à mdadm d'activer les volumes raid.
On prends ici l'exemple d'un raid1 avec 2 disques, dans le cas de raid5, ou 6, ajoutez les partitions nécessaires.
```
# Modifiez bien vos partitions si nécessaire !
mdadm -A -R /dev/md1 /dev/sda3 /dev/sdb1
mdadm -A -R /dev/md2 /dev/sda4 /dev/sdb2
mdadm -A -R /dev/md3 /dev/sda5 /dev/sdb3
cryptsetup luksChangeKey /dev/md1
cryptsetup luksChangeKey /dev/md2
cryptsetup luksChangeKey /dev/md3
cryptsetup luksOpen /dev/md2 crypt_root
mkdir -p /mount/openvz
mount /dev/mapper/crypt_root /mount/openvz
mount /dev/sda2 /mount/openvz/boot
mount -o bind /dev/ /mount/openvz/dev/
mount -o bind /sys/ /mount/openvz/sys
mount -o bind /proc/ /mount/openvz/proc/
chroot /mount/openvz
```
Si vous utilisez en outre un raid soft, cliquez
Vous devez récupérer les volumes raid :
```
# blkid | grep md
/dev/md127: UUID="6f09377e-dda8-4d11-83b6-c3c3cc17b6b9" TYPE="crypto_LUKS"
/dev/md126: UUID="03988b26-4004-4551-969b-461a7d2f37e6" TYPE="crypto_LUKS"
/dev/md125: UUID="0d60f8ec-7167-4e07-a92a-8f58fe89c22a" TYPE="crypto_LUKS"
```
On va utiliser le paramètre `rd.md.uuid` de grub MAIS celui-ci prends un format bien précis d'uuid, séparé par des points.
Prenez donc l'UUID de vos disques, et tous les 8 caractères, enlevez le tiret et mettez un `:` à la place :
```
6f09377e-dda8-4d11-83b6-c3c3cc17b6b9 => 6f09377e:dda84d11:83b6c3c3:cc17b6b9
03988b26-4004-4551-969b-461a7d2f37e6 => 03988b26:40044551:969b461a:7d2f37e6
...
```
Il faudra ensuite ajouter dans la ligne `GRUB_CMDLINE_LINUX` une option `rd.md.uuid=XXX` pour chaque partition raid. (cf exemple complet ci-dessous)
Cliquez pour sortir du chroot avec lvm
```
exit
umount /mount/openvz/dev
umount /mount/openvz/sys
umount /mount/openvz/proc
umount /mount/openvz/boot
umount /mount/openvz
cryptsetup luksClose crypt_root
vgchange -a n
```
Cliquez pour sortir du chroot avec raid soft
```
exit
umount /mount/openvz/dev
umount /mount/openvz/sys
umount /mount/openvz/proc
umount /mount/openvz/boot
umount /mount/openvz
cryptsetup luksClose crypt_root
mdadm -S /dev/md3
mdadm -S /dev/md2
mdadm -S /dev/md1
```