15/11/2024

SauvegardeVMware

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/ ❌

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é) :

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

warning 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/
Figure 1 : Capture d'écran de mon terminal, démontrant les actions précédentes

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)>
Figure 2 : Transmission de notre clé publique à notre ESXi (192.168.130.131)

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
Figure 3 : La connexion SSH vers l'hyperviseur ESXi s'effectue maintenant sans mot de passe.

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
Figure 4 : Désactivation du pare-feu.

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
Figure 5 : Modification du nom du datastore (en fonction de votre configuration) qui accueillera les futures sauvegardes.

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.

Figure 6 : Menu "Welcome"

Cliquez sur "Submit" pour valider et accéder au tableau de bord de l'application.

Figure 7 : Informations renseignées sauvegardées.

Cliquez sur "Reload the dashboard", pour accéder à celui-ci.

Voici l'interface principale de vmSafeguard.

Figure 8 - Tableau de bord 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.

Figure 9 - Petit résumé des caractéristiques de chacune des VMs qui sont hébergées sur mon ESXi de test.

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 :

Figure 10 - Trouver le VMID d'une VM seule et quelques informations connexes.

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)

Figure 11 - Deux sous-menus permettant la sauvegarde seule ou de plusieurs VMs, sans les différer dans le temps.

Cliquez sur Start (pool) backup, pour lancer la sauvegarde directement.

Figure 12 - Déclenchement du processus de sauvegarde

Cliquez sur Latest logs pour obtenir les derniers logs concernant la sauvegarde en cours.

Figure 13 - Affichage des logs de vmSafeguard

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
Figure 14 - Rapport de sauvegarde, envoyé par mail pour chaque VMs sauvegardé.

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).

Figure 15 : Menu "Schedule a backup"

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.

Figure 14 - Enregistrement de la tâche cron.

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

Figure 16 - Affichage des logs suite au déclenchement de la sauvegarde.
Figure 17 - Rapport de sauvegarde envoyé par mail pour chaque VMs sauvegardé.

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.

Figure 18 - Changement d'hôte ESXi, afin d'administrer celui-ci.
Figure 19 - Informations renseignées enregistrées.

Cliquez sur "Reload the dashboard".

Figure 20 - Tableau de bord actualisé.

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
Figure 21 - Menu paramètres

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.

author avatar
Geoffrey Sauvageot-Berland Ingénieur Cybersécurité
Ingénieur diplômé par l’état en Informatique et Cybersécurité. Généraliste, à l'origine administrateur systèmes et réseaux, j’occupe actuellement un poste d’auditeur en sécurité offensive. J’apprécie également la programmation/automatisation. Fondateur du blog : "Le Guide du SecOps", anciennement "Le Guide du SysOps"
Partagez cet article Partager sur Twitter Partager sur Facebook Partager sur Linkedin Envoyer par mail

6 commentaires sur “Sauvegarde de VMs sur des hôtes VMware ESXi avec vmSafeguard

  • 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

    Répondre
  • 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

    Répondre
    • 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.

      Répondre
  • 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

    Répondre
    • 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)

      ++

      Répondre

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.