Sauvegarde de VMs sur des hôtes VMware ESXi avec vmSafeguard
I. Présentation
Aujourd'hui, c'est un grand jour, car je vais vous présenter mon projet vmSafeguard (open source) que je développe depuis plus d'un an. Cette application full-web est un système d'administration et d'automatisation de gestion de sauvegardes pour un ou plusieurs hôtes VMWare ESXi.
L'objectif étant de pouvoir automatiser entièrement les processus de sauvegarde de vos machines virtuelles, en évitant in fine au maximum l'intervention humaine. (si-vous avez déjà lu d'autres articles que j'ai écrits, vous commencez à saisir que j'adore tout automatiser je pense :-)).
J'utilise cette solution au quotidien dans le cadre de mon travail, au sein de plusieurs environnements de production. Tout au long de ce tutoriel, je vais utiliser la version conteneurisée de mon application, via Docker. Si vous souhaitez ne pas utiliser Docker pour son installation, je vous laisse le soin de consulter la documentation de mon projet (lien ci-dessous). Je préfère vous présenter vmSafeguard avec docker, comme ça si vous n'aimez pas l'application, vous aurez juste à supprimer l'image et son conteneur associé, et vous n'aurez pas perdu votre temps à provisionner un nouvel OS dédié.
Le serveur VMware ESXi qui va me servir de "test" pour cette démo est un ESXi 7.x. L'outil vmSafeguard est aussi disponible pour les ESXi en version 6.x, mais avec moins de fonctionnalités. (cf la documentation)
Pour plus d'information, voici le Lien github du projet : https://github.com/archidote/vmSafeguard
🛑 Message destiné à tous les lecteurs de cet article :
vmSafeguard est un projet issu d'un stage et d'une période de ma vie lors de laquelle j'ai été étudiant en alternance. Son développement a duré plus de 2 ans. Ce projet n'est plus disponible sur mon GitHub, car j'ai complètement arrêté son développement depuis plus de 2 ans, ayant changé de poste.
Avec le temps et l'expérience que j'ai acquise, je me suis aperçu que le code du projet comportait des failles de sécurité, suite à une analyse statique du code effectuée via SonarCloud, qui parfois peut être plus alarmiste qu'autre chose sur certains aspects du code. Si malgré tout, vous souhaitez quand même l'installer, je peux vous fournir le code source du projet ;-), bien évidemment.
Voilà donc la raison de sa suppression sur GitHub. Hélas, je n'ai clairement pas le temps de me replonger dans le code et de corriger ces différentes vulnérables. Pour rassurer tout le monde, sachez que l'an passé, lors d'un de mes cours de cybersécurité offensive, j'ai fait tester partiellement ce projet à des étudiants ingénieurs en master 1 : rien ne m'a été remonté.
Cette année, si je réitère l'expérience, je proposerai un CTF complet pour qu'ils essayent de pwned "vmSafeguard". Si pwnd, il y a, je posterai un commentaire sur cet article, et peut-être que l'article sera retiré du site en fonction de ce qui aura été trouvé. En tout cas, je profite de ce message pour remercier chaque personne qui a utilisé ou utilise toujours la solution. Le projet avait quand même atteint plus de 30 étoiles sur GitHub !
A. Perspectives d'amélioration
Bien que pleinement fonctionnel, je souhaite continuer à améliorer cet outil, et certaines fonctionnalités et améliorations pourraient voir le jour à l'avenir, notamment :
- Sauvegarde "à chaud" des VMs, sans obligation de les éteindre pour réaliser l'action de sauvegarde comme c'est le cas actuellement (c'est géré automatiquement par l'outil vmSafeguard).
- Amélioration de l'API afin d'avoir plus de fonctionnalités et de granularité pour les alertes mail.
- Affichage des logs "en live" (sans avoir besoin de recharger la page manuellement)
- Identifier les VM avec leur nom plutôt que le VMID
- etc.
B. Prérequis
Voici les prérequis à respecter afin de pouvoir installer vmSafeguard :
- Disposer d'un ou plusieurs hyperviseurs VMware ESXi opérationnels pouvant communiquer avec la machine qui hébergera vmSafeguard
- Le service SSH et l'ESXi Shell doivent être activés (au démarrage), sur le(s) hôte(s) ESXi concerné(s)
- Privilèges d'administrateur sur le(s) hôte(s) ESXi ainsi que sur la machine hébergeant l'application.
- La version conteneurisée de vmSafeguard ne supporte pas HTTPS pour des raisons techniques (dialogue API, etc.). Si vous souhaitez absolument utiliser HTTPS, suivez l'installation standard sans Docker, qui n'est guère plus longue.
C. À ne surtout pas faire !
- N'ajoutez pas d'espace dans les noms des machines virtuelles. Les VMs doivent avoir une nomenclature comme celle-ci :
- Debian-11-64Bits ou Debian_11_64bits ✅
- mais pas comme ça : Debian 11 64bits, sinon vmSafeguard plantera ❌
- Ne renommez pas vos VMs ❌
- Ne stockez pas votre machine virtuelle dans un sous-dossier d'une banque de données. Les VM doivent être stockées à la racine d'une banque de données spécifique comme celle-ci :
- /vmfs/volume/datatsore1/MyDebian10Vm/ ✅
Et surtout pas comme ça
/vmfs/volume/datastore1/VMsdebian/MyDebian10Vm/ ❌
- /vmfs/volume/datatsore1/MyDebian10Vm/ ✅
D. Environnement de mise en place
- vmSafeguard : exécuté dans un container docker via un hôte Linux (Kali linux) sur le port 8080 (192.168.130.128:8080)
- ESXi 7.x : adresse IP 192.168.130.131
Les deux machines, à savoir l'ESXi et l'hôte Docker doivent pouvoir communiquer entre elle.
II. Installation de vmSafeguard via Docker
Ce guide vous montrera comment configurer l'application vmSafeguard en tant que conteneur Docker rapidement.
Quelques ressources utiles sous la forme de tutoriels vidéos (installation et démonstration - non commenté) :
- Installation et configuration de vmSafeguard (Docker)
- Actions de sauvegarde avec vmSafeguard (Docker)
- Installation de vmSafeguard pour un environnement de production et tests divers (Ubuntu)
Playlist complète : https://www.youtube.com/playlist?list=PLWUac84yuFqoM4wt7p3OHaClCab03BE_h
A. Extraire (exécuter) l'image de vmSafeguard du hub docker (ESXi 7.x)
Via l'utilisateur root, exécutez les commandes suivantes :
docker run -d -p 8080:80 archidote/vmsafeguard
J'attire votre attention sur le point suivant :
Vu que j'utilise un port d'écoute différent de 80 et 443 (8080) du côté de l'hôte docker, l'ESXi n'accepte pas par défaut d'envoyer des données sur d'autres ports que ces deux-là. Ce qui est primordial pour le fonctionnement de l'API locale. (Grrr...) Comme je vais utiliser le port 8080 côté hôte docker, je vais donc être amené à désactiver le pare-feu ESXi pour autoriser l'API locale à dialoguer sur un autre port que 80. Nous allons voir plus bas comment désactiver le pare-feu de l'ESXi le cas échéant. Néanmoins, si vous souhaitez vraiment utiliser le port 80 côté hôte docker (ce que je ne fais pas ici), vous pouvez vous abstenir de désactiver le pare-feu de l'ESXi.
Vérifiez que le conteneur est bien en cours d'exécution via la commande suivante :
docker ps
Si tel est le cas, connectez-vous au shell du conteneur par l'intermédiaire de la commande suivante :
docker exec -it <id of the container vmSafeguard> bash
#################
You are into the container with a bash shell
#################
# Démarrez le service cron par le biais de la commande suivante :
# Par défaut, l'heure du conteneur se base sur l'heure "Française et sur la timezone Europe/Paris
service cron start
Dès lors, dirigez-vous vers le dossier suivant :
cd /root/.ssh/
B. Copiez votre clé publique SSH sur votre (vos) ESXi(s)
vmSafeguard utilise l'authentification par clé SSH publique/privée, pour pouvoir dialoguer avec les hôtes ESXi. Par défaut, le conteneur vmSafeguard dispose d'un couple de clés SSH, accessibles depuis le shell du container. Si vous souhaitez utiliser votre propre couple de clés ou en générer une nouvelle, pas de problème. Il suffira de remplacer cette paire de clés.
Transmettez la clé publique de vmSafeguard via la commande suivante à votre ESXi :
cat id_rsa.pub | ssh -p 22 root@adresse-ip-esxi \ 'cat >> /etc/ssh/keys-root/authorized_keys'
<mot de passe de l'utilisateur ESXi (root)>
Note 1 : Si vous souhaitez interagir avec plusieurs ESXi, répétez la commande précédente sur chaque hôte ESXi.
Afin de tester si vous pouvez vous connecter sans mot de passe via SSH, essayer de vous connecter avec la commande suivante :
ssh -p 22 root@ip-esxi
Désactivez le pare-feu de votre ESXi, si vous n'avez pas changé le port d'écoute côté "Hôte" sur 80.
esxcli network firewall set --enabled
esxcli network firewall get
Terminez la connexion SSH initiée avec la commande :
exit
C. Spécifier le nom de votre datastore
Dans cette nouvelle étape, nous allons spécifier dans la configuration de vmSafeguard le nom du datastore qui stockera les futures sauvegardes.
Depuis le terminal de votre conteneur, exécutez la commande suivante afin de modifier le nom du datastore en modifiant la valeur de la variable "DATASTORE".
nano /var/www/html/vmSafeguard/scripts/backup.sh
Enregistrez le fichier backup.sh et quittez le conteneur :
exit
D. Configurer le panneau Web
Avec un navigateur pouvant communiquer avec votre hôte Docker, entrez l'URL suivante pour configurer votre première connexion :
- http://localhost:8080/vmSafeguard/scripts/router.php?action=welcome
Lorsque vous accédez à vmSafeguard, vous devez fournir un identifiant et un mot de passe. Voici les identifiants par défaut (que vous pouvez modifier par la suite):
- Identifiant : admin
- Mot de passe : helloworld
Renseignez, les 5 champs ci-dessous, en les adaptant en fonction de votre configuration.
Note 2 : Ne pas oublier de préciser le port s'il est différent de 80, dans le champ vmSafeguard IP.
Cliquez sur "Submit" pour valider et accéder au tableau de bord de l'application.
Cliquez sur "Reload the dashboard", pour accéder à celui-ci.
Voici l'interface principale de vmSafeguard.
III. Tests
A. Afficher un résumé de chaque VM de l'ESXi
Depuis le tableau de bord, cliquez sur "Summary All", afin d'obtenir le VMID de chacune des VMs de votre ESXi. L'obtention de ce VMID est primordiale, car sans celui-ci, vous ne pourrez pas programmer de sauvegardes. En effet, au moment de créer un nouveau job de sauvegarde il faudra spécifier le VMID de la VM à sauvegarder.
Ici, nous pouvons constater que trois VMs sont présentes sur mon hôte ESXi (192.168.130.131).
Si vous souhaitez obtenir le VMID d'une seule VM en particulier, utilisez le menu suivant et entrez le nom de votre VM, depuis l'interface du dashboard :
B. Sauvegarder une ou plusieurs VM
En guise d'exemple, je vais sauvegarder deux VMs. Pour cela, je vais utiliser le sous-menu "Pool Backup", en entrant les deux "VMID" des VMs, séparés par un espace. Si vous souhaitez sauvegarder une seule VM, utilisez le sous-menu de gauche en entrant simplement son VMID.
Note 3 : Si la VM est éteinte, vmSafeguard la backupera directement, sinon il essaiera de l'éteindre de manière "conventionnelle" (si la VM à les vmware tools). Dans le cas contraire, vmSafeguard éteindra de force celle-ci pour procéder à sa sauvegarde. Lorsque la VM est allumée, le processus d'extinction avant sauvegarde est plus long (notamment si la VM doit faire des mises à jour par exemple)
Cliquez sur Start (pool) backup, pour lancer la sauvegarde directement.
Cliquez sur Latest logs pour obtenir les derniers logs concernant la sauvegarde en cours.
Sur la copie d'écran ci-dessus, j'attire votre attention sur les deux lignes qui sont pointées par une flèche rouge. Depuis la version 6.2, vmSafeguard, utilise deux API (locale/distante) qui permettent de vous envoyer un mail dans les situations suivantes :
- Backup(s) achevé(s)
- ESXi détecté comme étant hors ligne
C. Programmez vos sauvegardes
Tout l'intérêt de vmSafeguard est de pouvoir différer la programmation de vos sauvegardes. Grâce à ce menu, vous pouvez programmer vos sauvegardes afin de les automatiser : ce qui est très pratique, si vous souhaitez effectuer des sauvegardes de plusieurs machines virtuelles, la nuit par exemple.
Veillez à respecter la syntaxe cron, car par souci de sécurité, la tâche cron ne sera pas inscrite dans la crontab de l'utilisateur www-data le cas échéant.
Voici un site qui vous aidera, si vous souhaitez créer une tâche cron complexe : https://crontab.guru/examples.html
Vous avez le choix entre programmer une sauvegarde d'une seule VM (menu de gauche), et une sauvegarde de plusieurs VM. Dans tous les cas, il faudra insérer le(s) VMID(s) de(s) machine(s).
vmSafeguard contrôle l'existence ou non des VMID qui lui sont transmis avant de lancer la sauvegarde. Dans le cas où un mauvais VMID serait indiqué par erreur, pas de panique la sauvegarde sera simplement déprogrammée pour cette instance. Cela n'annule pas une sauvegarde de plusieurs machines virtuelles, si les autres VMID sont corrects.
Dans le cas du formulaire de droite, "Pool Backup", pensez bien à mettre un espace entre chaque VMID afin qu'ils soient tous pris en compte. Lorsque la sauvegarde s'effectue sans interaction humaine, toutes les informations sont journalisées. Menu > Logs
D. Changer d'ESXi pour un autre hôte ESXi
Depuis la version 5.0, vmSafeguard est capable de pouvoir changer d'ESXi, afin de sauvegarder les VMs d'un autre hôte. Cette approche vous permet de jongler d'ESXi en ESXi, en fonction des emplacements des VMs que vous souhaitez sauvegarder.
Depuis le tableau de bord, accédez au sous-onglet suivant, et renseignez l'IP et le port du service SSH de votre deuxième hôte ESXi.
Cliquez sur "Reload the dashboard".
Nous constatons que l'ESXi 192.168.130.132 n'a aucune VM existante, mais c'est normal. Rassurez-vous 😉
E. Menu Paramètres
Enfin, pour finir, je vous présente le menu des paramètres de vmSafeguard. Il rassemble un ensemble d'éléments personnalisables comme :
- L'ajout d'un hôte ESXi, qui ne partage pas une banque de données communes avec d'autres ESXi
- Changement du mot de passe du compte admin, email, etc.
- Fixer le rafraichissement de la page d'accueil de manière automatique toutes les X secondes.
- Augmenter/Diminuer le temps, en seconde, d'écriture des logs (notamment pour la progression de la sauvegarde)
- Supprimer les anciennes sauvegardes > à X jours de manière automatique
IV. Conclusion
J'espère que ce tutoriel et la présentation de ce projet vous auront plu. N'hésitez pas à revenir vers moi via l'espace commentaire si vous avez une quelconque question, ou si vous souhaitez suggérer une ou plusieurs fonctionnalités que je pourrais intégrer à vmSafeguard.
Si le projet vous intéresse et que vous souhaitez l'intégrer dans un environnement de production pour "le long terme", installez vmSafeguard sans Docker. Ce n'est pas plus compliqué que ce vous venez de voir.
Dans le cas où vous rencontriez un bug ou un problème technique, je vous invite à ouvrir une issue directement sur la page GitHub du projet. Si vous trouvez la documentation un peu floue sur certains points, je vous encourage aussi à me le signaler.
Beau projet.
Mais il y a quelque chose que j’aimerais que vous éclaircissiez. Vous dites au paragraphe I.A que vous faîtes des « sauvegardes à chaud » alors qu’au paragraphe III.B vous dites que la sauvegarde se fera quand la VM sera éteinte.
Quel est le fonctionnement de votre outil ?
Merci
Les sauvegardes à chaud font parties de la section « Perspectives d’amélioration » 🙂
Bonjour,
Je peux laisser tomber l’idée de faire fonctionner votre outil dans un environnement VMWare 5.5 si j’ai bien compris ?
Merci
Bonjour Thierry, je n’ai jamais vmsafeguard sur un ESXi 5.5. Peut-être que cela fonctionne.
Si toutefois vous testez, n’hésitez pas à me faire un retour !
Pour information, j’ai arrêté le développement de vmsafeguard il y a un an, celui-ci n’est plus maintenu.
Bonjour,
le lien Github pour l’installation hors container ne fonctionne pas.
Existe t-il un autre lien ?
pouvez vous m’aider sur ce point ?
Bonne journée
Cordialement
Salut !
Alors oui, c’est normal. J’ai supprimé le projet de mon GitHub, car j’ai complètement arrêté son développement depuis plus de deux ans, ayant changé de poste.
Si jamais tu souhaites quand même l’installer, je peux te fournir le projet, mais il ne bénéficiera pas de mises à jour. (sauf si un jour je me motive à reprendre le développement de celui-ci)
++