Chapitre 1116 minIntermédiaire
Sécuriser Proxmox VE : utilisateurs, droits, 2FA et pare-feu
Par Josselyn C., prof de BTS SIO. Mis à jour le .
À la fin de ce chapitre, tu sauras
- lire et écrire un droit Proxmox : utilisateur, rôle, chemin ;
- relier Proxmox à l'Active Directory et traduire une matrice d'habilitations ;
- activer la double authentification ;
- filtrer une VM avec le pare-feu de Proxmox et durcir l'hôte.
4 exercices corrigés
Sécuriser un hyperviseur, c'est contrôler qui peut agir sur les machines virtuelles et comment on y accède : des comptes nominatifs avec la double authentification, des droits limités au strict nécessaire, une interface d'administration joignable seulement depuis le réseau d'administration, et un pare-feu. Ce chapitre explique le modèle de droits de Proxmox VE (domaines, utilisateurs, groupes, rôles, chemins), le relie à l'Active Directory de Sorbier, met en place la double authentification et le pare-feu intégré, et termine par une liste de durcissement.
Pourquoi l'hyperviseur est la cible n° 1
Celui qui contrôle l'hyperviseur contrôle toutes les machines virtuelles : il peut les éteindre, copier leurs disques (et donc la base de l'annuaire et ses empreintes de mots de passe), supprimer leurs snapshots et leurs sauvegardes, puis chiffrer les disques d'un coup. Plusieurs familles de rançongiciels visent précisément les hyperviseurs pour cette raison : une seule compromission suffit à arrêter toute l'entreprise. Les symptômes typiques d'une telle attaque, à surveiller, sont des connexions d'administration à des heures inhabituelles, la suppression en série de snapshots ou de tâches de sauvegarde, et l'arrêt simultané de nombreuses VM. Les contre-mesures sont celles de ce chapitre : accès réservé au réseau d'administration, comptes nominatifs avec double authentification, moindre privilège, journaux envoyés hors de l'hyperviseur, sauvegardes hors de sa portée.
Le modèle de droits de Proxmox VE
Un droit, dans Proxmox VE, se lit comme une phrase : tel utilisateur (ou groupe, ou jeton) a tel rôle sur tel chemin.
| Élément | Ce que c'est | Exemples |
|---|---|---|
| Domaine d'authentification (realm) | Qui vérifie le mot de passe | pam (comptes Linux de l'hôte), pve (comptes propres à Proxmox), un annuaire Active Directory ou LDAP, un fournisseur OpenID Connect |
| Utilisateur | nom@domaine | root@pam, clambert@sorbier |
| Groupe | Un ensemble d'utilisateurs | techniciens, stagiaires |
| Rôle | Un ensemble de privilèges | PVEVMAdmin, PVEAuditor |
| Chemin | L'objet sur lequel porte le droit | / (tout), /vms/177, /storage/truenas-nfs, /pool/lab, /sdn/zones/sorbier |
| Jeton d'API | Un identifiant pour un programme, rattaché à un utilisateur | zabbix@pve!supervision |
| Pool | Un regroupement de VM, de conteneurs et de stockages | Le pool lab, qui contient les VM de TP |
Un droit posé sur un chemin s'applique aussi à tout ce qui est en dessous, si l'option Propagate est cochée (c'est le cas par défaut) : un rôle sur /vms vaut pour toutes les VM. Un droit posé plus bas remplace celui hérité d'en haut.
Les rôles prédéfinis à connaître :
| Rôle | Ce qu'il permet |
|---|---|
Administrator | Tout |
PVEAdmin | Presque tout, sauf modifier les réglages système de l'hôte et les droits |
PVEVMAdmin | Administrer entièrement les VM et les conteneurs (créer, configurer, supprimer, sauvegarder) |
PVEVMUser | Utiliser les VM : démarrer, arrêter, console, sauvegarder, sans modifier leur matériel |
PVEAuditor | Tout voir, en lecture seule |
PVEDatastoreUser | Utiliser un stockage : y créer des disques, y sauvegarder |
PVEDatastoreAdmin | Administrer les stockages |
PVEPoolAdmin, PVEPoolUser | Administrer ou utiliser un pool |
PVEUserAdmin | Gérer les utilisateurs et les groupes |
PVESDNAdmin, PVESDNUser | Administrer le SDN, ou brancher des VM sur un VNet |
NoAccess | Interdire explicitement l'accès |
On peut créer ses propres rôles, avec exactement les privilèges voulus : pveum role add VM_Power-only --privs "VM.PowerMgmt VM.Console" crée un rôle qui ne permet que d'allumer, d'éteindre et d'ouvrir la console.
Les comptes : PAM, PVE ou l'annuaire
root@pam est le super-administrateur de Proxmox VE : il a tous les droits, ne peut pas être supprimé, et sert pour les opérations de l'hôte lui-même. On ne l'utilise pas au quotidien et on ne le partage pas : chaque administrateur a son compte nominatif, ce qui permet de savoir qui a fait quoi dans les journaux.
Chez Sorbier, les comptes viennent de l'Active Directory : un technicien qui quitte l'entreprise est désactivé une fois dans l'annuaire, et perd aussi l'accès à l'hyperviseur. Dans Datacenter > Permissions > Realms > Add > Active Directory Server :
| Champ | Valeur |
|---|---|
| Realm | sorbier |
| Domain | ad.sorbier.example |
| Server, Fallback Server | 192.168.10.177, 192.168.10.181 |
| Mode | LDAPS (port 636) : les mots de passe ne circulent pas en clair |
| Onglet Sync Options | Un compte de lecture de l'annuaire, et le filtre des groupes à importer (par exemple les groupes GG_Proxmox_*) |
Ou en ligne de commande, puis la synchronisation des utilisateurs et des groupes :
pveum realm add sorbier --type ad --domain ad.sorbier.example \
--server1 192.168.10.177 --server2 192.168.10.181 --mode ldaps
pveum realm sync sorbier --scope both
Les groupes importés gardent leur nom suivi du domaine (GG_Proxmox_Techniciens-sorbier). Il ne reste plus qu'à leur donner des droits.
Donner des droits : la matrice de Sorbier
Le service informatique de Sorbier a défini qui fait quoi sur le cluster :
| Qui | Groupe | Rôle | Chemin | Pourquoi |
|---|---|---|---|---|
| Antoine Mercier, responsable | GG_Proxmox_Admins | Administrator | / | Administre tout le cluster |
| Chloé Lambert, Moussa Diallo, techniciens | GG_Proxmox_Techniciens | PVEVMAdmin | /vms | Créent et administrent les VM |
| Les mêmes | GG_Proxmox_Techniciens | PVEDatastoreUser | /storage | Peuvent placer les disques et les sauvegardes |
| Le stagiaire | stagiaires | PVEVMUser | /pool/lab | Utilise les VM du laboratoire, ne touche à rien d'autre |
| La supervision Zabbix | jeton zabbix@pve!supervision | PVEAuditor | / | Lit l'état du cluster, sans rien pouvoir modifier |
En ligne de commande :
# Droits des groupes de l'annuaire
pveum acl modify / --groups GG_Proxmox_Admins-sorbier --roles Administrator
pveum acl modify /vms --groups GG_Proxmox_Techniciens-sorbier --roles PVEVMAdmin
pveum acl modify /storage --groups GG_Proxmox_Techniciens-sorbier --roles PVEDatastoreUser
# Un pool pour le laboratoire, et un compte local pour le stagiaire
pveum pool add lab --comment "VM de TP et de tests"
pveum group add stagiaires
pveum user add stagiaire1@pve --groups stagiaires --password
pveum acl modify /pool/lab --groups stagiaires --roles PVEVMUser
# Un utilisateur et un jeton en lecture seule pour la supervision
pveum user add zabbix@pve --comment "Supervision Zabbix"
pveum user token add zabbix@pve supervision --privsep 1
pveum acl modify / --tokens 'zabbix@pve!supervision' --roles PVEAuditor
# Vérifier ce qu'un compte peut réellement faire
pveum user permissions clambert@sorbier
pveum user token add affiche le secret du jeton une seule fois : copie-le immédiatement dans la configuration de l'outil qui l'utilise. Avec --privsep 1 (séparation des privilèges), le jeton n'a que les droits qu'on lui donne explicitement, et non tous ceux de son utilisateur. Le modèle Proxmox VE by HTTP de Zabbix utilise exactement ce type de jeton en lecture seule (cours Supervision).
La double authentification
Un mot de passe volé ne doit pas suffire pour entrer dans l'hyperviseur. Proxmox VE gère plusieurs seconds facteurs :
| Facteur | Principe | Pour qui |
|---|---|---|
| TOTP | Un code à six chiffres qui change toutes les 30 secondes, produit par une application (Aegis, FreeOTP, Google Authenticator…) | Tout le monde |
| WebAuthn | Une clé de sécurité physique (FIDO2) ou une clé d'accès du système | Les administrateurs ; le plus résistant à l'hameçonnage |
| Clés de récupération | Une liste de codes à usage unique | Le secours, si le téléphone ou la clé est perdu |
| Yubico OTP | Un code produit par une clé YubiKey, vérifié par un serveur | Les organisations déjà équipées |
Chaque utilisateur active son second facteur dans Datacenter > Permissions > Two Factor > Add (TOTP, WebAuthn ou Recovery Keys), en scannant le QR code et en saisissant un premier code pour valider. Après huit codes TOTP faux, le TOTP du compte est bloqué ; un administrateur le débloque avec pveum user tfa unlock <utilisateur>.
Pour un domaine Active Directory ou LDAP, l'administrateur peut imposer un second facteur à tous ses comptes, dans les options du domaine (Require TFA : TOTP ou Yubico OTP) : un utilisateur qui n'en a pas configuré ne peut plus se connecter.
Le pare-feu de Proxmox
Proxmox VE a un pare-feu intégré, à trois niveaux, qui filtre le trafic de l'hôte et celui de chaque VM, au plus près de la machine :
| Niveau | Où | Ce qu'il filtre | Fichier |
|---|---|---|---|
| Datacenter | Datacenter > Firewall | Les règles communes, les alias, les ensembles d'adresses (IPSet), les groupes de sécurité, et l'activation globale | /etc/pve/firewall/cluster.fw |
| Node | Node > Firewall | Le trafic vers l'hôte lui-même | /etc/pve/nodes/<nœud>/host.fw |
| VM et CT | VM > Firewall | Le trafic de chaque carte dont l'option Firewall est cochée | /etc/pve/firewall/<VMID>.fw |
Le pare-feu est désactivé par défaut au niveau du centre de données. Une fois activé, la politique d'entrée est de tout refuser, à l'exception de l'interface web (TCP 8006) et de SSH (TCP 22) depuis le réseau local du cluster et depuis l'ensemble d'adresses spécial management. Crée donc cet IPSet avec le réseau d'administration avant d'activer le pare-feu, pour ne pas te couper l'accès :
- Datacenter > Firewall > IPSet > Create : nom
management, puis Add192.168.10.208/28; - Datacenter > Firewall > Options : Firewall sur Yes.
Les règles d'une VM utilisent des macros (des services prédéfinis : HTTPS, SSH, DNS…). Pour srv-web, dans la DMZ, qui ne doit accepter que HTTPS de partout et SSH depuis le réseau d'administration :
# /etc/pve/firewall/225.fw
[OPTIONS]
enable: 1
policy_in: DROP
log_level_in: info
[RULES]
IN HTTPS(ACCEPT) -log nolog
IN SSH(ACCEPT) -source 192.168.10.208/28
Ce pare-feu ne remplace pas le pare-feu de périmètre (pfSense chez Sorbier) : il ajoute une micro-segmentation, un filtrage entre machines d'une même zone, que le pare-feu central ne voit pas. L'architecture complète des zones et des flux est dans le cours Cybersécurité des infrastructures.
Durcir l'hôte
| Mesure | Comment |
|---|---|
| Exposer l'administration au seul VLAN 99 | Adresse de gestion dans le VLAN 99, règles du pare-feu de périmètre qui n'autorisent TCP 8006 et 22 que depuis le poste d'administration et le bastion ; jamais d'accès depuis Internet |
| Mettre à jour | apt update et apt full-upgrade chaque mois au moins, et dès qu'une faille de sécurité est publiée (suivre les annonces de Proxmox et les avis du CERT-FR) |
| SSH par clés uniquement | PasswordAuthentication no dans la configuration de SSH, une fois les clés des administrateurs installées |
| Comptes nominatifs, double authentification, moindre privilège | Ce chapitre |
| Jetons d'API à privilèges séparés | --privsep 1, un jeton par outil, révoqué quand l'outil disparaît |
| Journaux | Les connexions à l'interface sont dans /var/log/pveproxy/access.log, les tâches dans Datacenter > Tasks ; envoie les journaux de l'hôte vers le serveur de journaux, hors de l'hyperviseur |
| Sauvegardes hors de portée | Proxmox Backup Server sur une machine séparée, compte des hôtes sans droit de suppression (chapitre 9) |
| Certificat | Un certificat signé par l'autorité interne pour l'interface web, pour que les administrateurs ne prennent pas l'habitude d'accepter n'importe quel avertissement |
Exercices
Exercice 1 sur 4 Traduire une matrice d'habilitations Réussi À revoir
Sorbier recrute une alternante, Inès, qui doit pouvoir démarrer, arrêter et ouvrir la console des VM de supervision (srv-journaux, VM 180), et seulement celle-ci. Elle a un compte dans l'annuaire, ibenali@sorbier. Le responsable veut aussi qu'un auditeur externe puisse consulter toute la configuration pendant une semaine, sans rien modifier.
Écris les commandes pveum correspondantes, en créant si besoin un rôle personnalisé.
Voir la réponseMasquer la réponse de l'exercice 1
# Un rôle limité à l'alimentation et à la console
pveum role add VM_Power-only --privs "VM.PowerMgmt VM.Console"
pveum acl modify /vms/180 --users ibenali@sorbier --roles VM_Power-only
# L'auditeur : un compte local, en lecture seule sur tout, qui expire dans une semaine
pveum user add audit-externe@pve --expire 1794268800 --password
pveum acl modify / --users audit-externe@pve --roles PVEAuditor
PVEVMUser aurait aussi convenu pour Inès, mais il donne en plus le droit de sauvegarder et quelques réglages : le rôle personnalisé respecte mieux le moindre privilège. --expire attend une date au format horodatage Unix (secondes depuis le 1er janvier 1970) : 1794268800 correspond au 10 novembre 2026 à 0 h UTC, une semaine après le 3 novembre. Dans l'interface, le champ Expire propose un calendrier.
Tu avais trouvé ?
Exercice 2 sur 4 Trouver la faille Réussi À revoir
Voici les droits posés sur le cluster d'une autre PME. Relève trois problèmes et propose une correction pour chacun.
| Utilisateur ou groupe | Rôle | Chemin | Propagate |
|---|---|---|---|
technicien@pve (compte partagé par les trois techniciens) | Administrator | / | Oui |
stagiaire@pve | PVEVMAdmin | / | Oui |
Jeton monitoring@pve!grafana sans séparation des privilèges, utilisateur monitoring@pve qui a PVEAdmin | — | — | — |
Voir la réponseMasquer la réponse de l'exercice 2
- Compte partagé : on ne sait pas qui a fait quoi, et un départ oblige à changer le mot de passe pour tous. Il faut un compte nominatif par technicien (idéalement dans l'annuaire), regroupés dans un groupe qui reçoit les droits, et un rôle plus limité que
Administrator(PVEVMAdminsur/vms,PVEDatastoreUsersur/storage). - Stagiaire administrateur de toutes les VM : il peut supprimer n'importe quelle VM de production. Il faut un pool
labet le rôlePVEVMUser(ouPVEVMAdmin) sur/pool/labseulement. - Jeton sans séparation des privilèges : il hérite de tous les droits de
monitoring@pve, donc dePVEAdmin. Un outil de tableaux de bord n'a besoin que de lire : recrée le jeton avec--privsep 1et donne-luiPVEAuditorsur/; retirePVEAdminà l'utilisateur.
Tu avais trouvé ?
Exercice 3 sur 4 Les règles du pare-feu de srv-gestion Réussi À revoir
srv-gestion (VM 179) héberge l'application de gestion des stocks en HTTPS (TCP 443) pour les postes (192.168.10.64/26), une API sur TCP 8443 appelée par srv-web (192.168.10.225), et s'administre en SSH depuis le réseau d'administration. Écris le fichier /etc/pve/firewall/179.fw.
Voir la réponseMasquer la réponse de l'exercice 3
[OPTIONS]
enable: 1
policy_in: DROP
log_level_in: info
[RULES]
IN HTTPS(ACCEPT) -source 192.168.10.64/26
IN ACCEPT -source 192.168.10.225 -p tcp -dport 8443
IN SSH(ACCEPT) -source 192.168.10.208/28
Tout le reste, en entrée, est refusé par la politique DROP et journalisé. Il faut aussi que l'option Firewall soit cochée sur la carte réseau de la VM et que le pare-feu soit activé au niveau du centre de données. Ces règles s'ajoutent à celles du pare-feu de périmètre, qui filtre déjà le passage entre les VLAN.
Tu avais trouvé ?
Exercice 4 sur 4 Une connexion suspecte Réussi À revoir
Un dimanche à 3 h 12, la supervision signale que les snapshots de six VM ont été supprimés en deux minutes, puis que les tâches de sauvegarde planifiées ont été désactivées. Le journal /var/log/pveproxy/access.log montre des connexions réussies de clambert@sorbier depuis 192.168.10.71.
- Qu'est-ce que ces signaux évoquent ?
- Quelles sont les trois premières actions à mener ?
- Quelles mesures auraient empêché ou limité l'attaque ?
Voir la réponseMasquer la réponse de l'exercice 4
- La préparation d'une attaque par rançongiciel visant l'hyperviseur : l'attaquant supprime les moyens de retour arrière (snapshots, sauvegardes) avant de chiffrer ou de détruire les VM. Le compte d'une technicienne est utilisé depuis un poste du VLAN des postes, un dimanche à 3 h : compte probablement compromis.
- Désactiver immédiatement le compte
clambert@sorbier(dans l'annuaire et dans Proxmox) et fermer ses sessions ; isoler le poste192.168.10.71du réseau ; vérifier que les sauvegardes sur PBS sont intactes (le compte des hôtes n'a pas le droit de les supprimer) et conserver les journaux comme preuves avant toute remise en état, puis déclencher la procédure de gestion d'incident. - L'interface d'administration n'aurait jamais dû être joignable depuis le VLAN des postes (seulement depuis le VLAN 99 et le bastion) ; la double authentification aurait rendu le mot de passe volé inutile ; une alerte sur les connexions hors horaires et sur les suppressions en série aurait réveillé l'astreinte ; les sauvegardes sur un PBS séparé, avec un compte sans droit de suppression et une copie hors site, garantissent la reprise.
Tu avais trouvé ?