Browse Source

Mise a jour de l'article sur openvz chiffré

edit_openvz_chiffre
LecygneNoir 1 year ago
parent
commit
f2f2b66e0c
3 changed files with 157 additions and 37 deletions
  1. +2
    -1
      .gitignore
  2. +146
    -36
      content/2017/2017-11-23-installer-openvz-a-distance.md
  3. +9
    -0
      requirements.txt

+ 2
- 1
.gitignore View File

@ -23,4 +23,5 @@ var/
*.egg-info/
.installed.cfg
*.egg
.idea
.idea
.vscode

+ 146
- 36
content/2017/2017-11-23-installer-openvz-a-distance.md View File

@ -11,15 +11,15 @@ Status: published
[TOC]
**Edit 2022**: Article mis à jour pour nettoyer les parties osbolètes et utiliser les nouveaux logiciels
# 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 ça ne serait pas marrant, 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.
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 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 ;-)
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 !
@ -33,7 +33,7 @@ Je le dis tout de suite, il va vous falloir quand même quelques trucs pour vous
* 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 9.
* 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.
@ -74,9 +74,11 @@ Notez la configuration réseau de votre serveur. Il vous faut adresse IP, passer
ip address show
cat /etc/resolv.conf
Enfin, récupérez l'id de votre disque dur pour le menu de boot :-)
Vérifiez quel driver grub utilise pour votre partition de boot, et l'id de la partition /boot au passage :
blkid /dev/sda1 # Récupérez l'id de la partition de votre /boot
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 :
@ -91,20 +93,21 @@ Et ajoutez après les commentaires le contenu suivant :
insmod gzio
insmod part_msdos
insmod ext2
set root='hd0,msdos1'
set root='HINT'
if [ x$feature_platform_search_hint = xy ]; then
search --no-floppy --fs-uuid --set=root --hint='hd0,msdos1' ID_DISQUE
search --no-floppy --fs-uuid --set=root --hint='HINT' ID_DISQUE
else
search --no-floppy --fs-uuid --set=root ID_DISQUE
fi
linux /boot/vmlinuz_ovz7 vnc vncpassword=guigui inst.vncpassword=guigui headless inst.repo=http://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 /boot/initrd_ovz7.img
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
@ -120,16 +123,18 @@ Ainsi, si jamais il ne démarre pas ou que l'installation se passe mal (avant le
grub-reboot NetInstall
On va maintenant pouvoir redémarrer et récupérez la console VNC.
**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 5900.
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é via une connexion SSH un peu plus robuste :-)
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 gace aux options de grub, doncrien à toucher.
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".
@ -139,14 +144,20 @@ Attention là encore à ne pas mettre le mot de passe final, car la connexion à
Laissez ensuite l'installation se terminer tranquillement, puis passez à la suite.
# Serveur SSH et réseau au boot
# 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é.
## SSH dans le initramfs
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.
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 quyi vous convient le mieux !
## chroot avec lvm
<details>
<summary>cliquez pour déplier</summary>
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
@ -161,6 +172,49 @@ On va commencer par changer les mots de passe bidon des partitions.
mount -o bind /proc/ /mount/openvz/proc/
chroot /mount/openvz
</details>
## chroot avec raid soft
<details>
<summary>cliquez pour déplier</summary>
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
fdisk -l /dev/sdb
```
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 sur 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
```
</details>
## SSH dans le Initramfs
Une fois dans le chroot, les choses marrantes reprennent ;-)
La connexion au boot se fera exclusivement avec une clef SSH. Si vous avez besoin de générer une clef SSH, vous pouvez vous référer à [cet article](https://blog.victor-hery.com/2012/08/connexion-ssh-par-cle.html#generation-de-la-cle-les-choses-serieuses-commencent) .
@ -171,16 +225,30 @@ Commencez donc par poser votre clef ssh dans le chroot directement.
chmod 700 /root/.ssh
chmod 600 /root/.ssh/authorized_keys
On va ensuite utiliser le splendide plugin [dracut-crypt-ssh](https://github.com/dracut-crypt-ssh/dracut-crypt-ssh) pour modifier le initramfs via dracut.
J'utilisais précédemment [dracut-crypt-ssh](https://github.com/dracut-crypt-ssh/dracut-crypt-ssh) qui implémentait DropbearSSH, mais après plusieurs années de bons et loyaux services, il n'est plus maintenu.
On peut avantageusement le remplacer désormais par [dracut-sshd](https://github.com/gsauthof/dracut-sshd).
```
yum install yum-plugin-copr
yum copr enable gsauthof/dracut-sshd/
yum update
yum install dracut-sshd
mkdir /etc/dracut-sshd
cp /root/.ssh/authorized_keys /etc/dracut-sshd/
```
yum install epel-release
wget -O /etc/yum.repos.d/rbu-dracut-crypt-ssh-epel-7.repo https://copr.fedorainfracloud.org/coprs/rbu/dracut-crypt-ssh/repo/epel-7/rbu-dracut-crypt-ssh-epel-7.repo
yum install dracut-crypt-ssh
**Si vous utilisez un raid** il est nécessaire d'indiquer à dracut de charger le driver correspondant
```
vim /etc/dracut.conf
# Modifier et décommentez l'entrée add_drivers
add_drivers+="raid1" # Dans le cas d'un raid1
```
Par défaut, dracut va générer un initramfs pour le noyau sur lequel le serveur est démarré, à savoir celui du rescue.
Pas très utile dans notre cas...
Récupérez donc le "vrai" noyau qu'utilise openvz :
Récupérez donc le "vrai" noyau qu'utilise openvz, c'est à dire le dernier (classé par nom) disponible dans /boot :
# ls /boot/
[...]
@ -190,11 +258,11 @@ On va ici générer l'image initramfs pour le noyau 3.10.0-514.16.1.vz7.30.10 :
dracut --force /boot/initramfs-3.10.0-514.16.1.vz7.30.10.img 3.10.0-514.16.1.vz7.30.10
La commande dracut ne doit rien vous renvoyer mais peut être longue à exécuter... Si vous avez une erreur, vous devrez chercher la solution avant le prochain redémarrage, car votre initramfs risque d'être HS. Au pire, le mode rescue vous serez extrêmement utile !
La commande dracut ne doit rien vous renvoyer mais peut être longue à exécuter... Si vous avez une erreur, vous devrez chercher la solution avant le prochain redémarrage, car votre initramfs risque d'être HS. Au pire, le mode rescue vous sera extrêmement utile !
Une fois que le initramfs a été généré sans erreur, on va s'occuper du réseau.
## Réseau via initramfs
## Configuration de grub : réseau
Reprenez ici la configuration réseau que vous aviez noté plus haut pour le boot VNC, ça va resservir.
@ -209,25 +277,67 @@ Une fois le fichier enregistré, regénérez la configuration grub :
grub2-mkconfig --output /etc/grub2.cfg
Une fois la configuration regénéré sans erreurs, vous pouvez quitter le chroot, démonter les disques et préparer le redémarrage.
## Configuration de grub : luks
Sur les dernières versions, j'ai noté que par défaut openvz ne configurait le grub pour déchiffrer que les partitions root et swap.
Cela nous pose problème, car il demande le mot de passe pour déchiffrer la partition /vz bien plus tard, **après** le process initramfs mais **avant** d'avoir lancé les services. Pas de ssh pour le déverrouiller donc !
Pour corriger cela, on va devoir ajuster la configuration du grub nous-même.
Une fois le fichier enregistré, regénérez la configuration grub :
grub2-mkconfig --output /etc/grub2.cfg
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
N'oubliez pas de désactiver le mode rescue de votre serveur, pour éviter qu'il redémarre en mode rescue ! Puis redémarrez le serveur.
## Sortir du chroot
Une fois la configuration regénérée sans erreurs, vous pouvez quitter le chroot, démonter les disques et préparer le redémarrage.
<p>
<details>
<summary>Cliquez pour sortir du chroot avec lvm</summary>
```
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
```
</details>
</p>
<p>
<details>
<summary>Cliquez pour sortir du chroot avec raid</summary>
```
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
```
</details>
</p>
N'oubliez pas de désactiver le mode rescue de votre serveur, pour éviter qu'il ne démarre en mode rescue ! Puis redémarrez le serveur.
# Last reboot (?)
Si tout s'est bien passé, au bout de quelques minutes (selon votre serveur), le réseau devrait se remettre à pinguer. Quelques instant plus tard, le SSH devrait être disponible.
**Attention**, le SSH écoute sur le port **222** dans cette configuration.
% ssh root@IP_SERVEUR -p 222
% ssh root@IP_SERVEUR -p 22
# console_peek # Pour voir ce qu'affiche la console, notamment la demande de mot de passe
# console_auth # Pour vous permettre de taper la clef des disques dur

+ 9
- 0
requirements.txt View File

@ -0,0 +1,9 @@
beautifulsoup4==4.11.1
bs4==0.0.1
docutils==0.16
Jinja2==2.11.3
Markdown==3.2.2
MarkupSafe==2.0.1
pelican==4.5.4
python-dateutil==2.8.2
rich==12.5.1

Loading…
Cancel
Save