Un script Proxmox est un programme, le plus souvent écrit en Bash ou en Python, qui pilote un hôte ou un cluster Proxmox VE sans passer par l'interface web : création et clonage de machines virtuelles, snapshots avant maintenance, sauvegardes, inventaire ou mise à jour des nœuds. Il s'appuie sur les outils natifs qm, pct et pvesh, ou sur l'API REST exposée en HTTPS sur le port 8006. Cette puissance a un revers : le script s'exécute souvent en root sur l'hyperviseur, là où une erreur de logique ou un code piégé touche d'un coup toutes les charges hébergées. En 2026, avec Proxmox VE 9.2 et plus de 700 scripts communautaires prêts à copier-coller, la question n'est plus de savoir s'il faut automatiser, mais comment le faire sans ouvrir de brèche. Ce guide détaille les interfaces disponibles, les règles d'écriture, la gestion des tokens d'API, les hookscripts, puis une méthode d'audit des scripts tiers et des pistes de détection. Il complète notre guide complet de Proxmox VE, qui couvre l'installation et l'architecture de la plateforme.

Résumé exécutif : Automatiser Proxmox VE par script fait gagner un temps considérable, mais chaque script devient un composant privilégié de l'hyperviseur, au même niveau de criticité que le cluster lui-même. Les interfaces natives (qm, pct, pvesh, API REST) suffisent à couvrir la plupart des besoins, à condition d'utiliser des tokens d'API à privilèges séparés, datés et limités à un périmètre précis. Les scripts communautaires, très populaires, s'exécutent en root avec accès à Internet et chargent une partie de leur code au moment de l'exécution : ils exigent une revue, un épinglage de version et un test en laboratoire. Enfin, la journalisation de l'API et des commandes privilégiées permet de distinguer une automatisation légitime d'un usage malveillant.

Points clés de cet article :

  • Préférez l'API REST avec un token à privilèges séparés plutôt qu'un script lancé en root via SSH sur chaque nœud.
  • Donnez à chaque script son propre token, une date d'expiration, un rôle personnalisé minimal et un propriétaire identifié.
  • Ne collez jamais une commande « curl | bash » sur un hôte de production : clonez, relisez, épinglez un commit, testez en laboratoire.
  • Protégez en écriture le stockage des snippets : un hookscript s'exécute en root à chaque démarrage ou arrêt de la VM concernée.
  • Centralisez les journaux de pveproxy, des tâches Proxmox et d'auditd pour repérer les exécutions hors fenêtre de maintenance.

Script Proxmox : définition, usages et périmètre

Script Proxmox : ensemble d'instructions exécutées de manière non interactive, permettant d'administrer des ressources Proxmox VE (machines virtuelles, conteneurs LXC, stockages, utilisateurs, sauvegardes) au moyen des outils en ligne de commande de la plateforme ou de son API REST, afin de rendre une opération reproductible, traçable et rapide.

Dans la pratique, le terme recouvre des réalités très différentes. Pour un administrateur, c'est un fichier Bash de quelques dizaines de lignes qui crée des snapshots la veille d'une mise à jour. Pour une équipe DevOps, c'est un module Python ou un plan Terraform qui provisionne des environnements entiers. Pour un utilisateur de homelab, c'est souvent une commande unique copiée depuis un site communautaire qui installe un service dans un conteneur.

Ces usages partagent un point commun : ils agissent sur l'hyperviseur, c'est-à-dire la couche qui héberge et isole toutes les autres. Un script défaillant peut arrêter cinquante machines virtuelles, supprimer un volume de stockage ou modifier la configuration réseau d'un nœud. Un script malveillant obtient, de fait, un contrôle complet sur les invités, leurs disques et leurs sauvegardes. Cette position justifie une exigence de rigueur supérieure à celle appliquée aux scripts d'un serveur applicatif ordinaire.

Trois familles de scripts à distinguer

  • Scripts d'administration internes : écrits par l'équipe, ils automatisent des tâches récurrentes (clonage, snapshots, inventaire, rapports de capacité) et sont versionnés dans un dépôt Git de l'organisation.
  • Scripts déclenchés par la plateforme : hookscripts associés à une VM ou à un conteneur, scripts de hook de vzdump appelés pendant les sauvegardes. Ils s'exécutent automatiquement, sans intervention humaine.
  • Scripts communautaires : projets tiers tels que les Proxmox VE Helper-Scripts, téléchargés depuis Internet pour installer des applications ou appliquer des réglages post-installation.

Chaque famille appelle des contrôles spécifiques. Les scripts internes relèvent de la qualité logicielle et de la gestion des secrets. Les scripts déclenchés posent un problème d'intégrité du stockage où ils résident. Les scripts communautaires relèvent de la sécurité de la chaîne d'approvisionnement logicielle. Confondre ces trois catégories conduit souvent à appliquer le même niveau de confiance à un code relu en interne et à un code jamais lu.

Les outils natifs en ligne de commande : qm, pct et pvesh

Proxmox VE expose une architecture cohérente : l'interface web, les outils en ligne de commande et les clients externes passent tous par la même API. La documentation officielle de gestion des utilisateurs le rappelle explicitement : les outils en ligne de commande de la plateforme sont des surcouches de l'API REST. Cette unicité simplifie l'automatisation, car une opération faisable dans l'interface l'est aussi par script, avec les mêmes contrôles de permissions.

qm et pct : les outils de premier niveau

La commande qm gère les machines virtuelles QEMU/KVM : création, clonage, démarrage, arrêt, snapshots, migration, modification de la configuration matérielle. Son équivalent pour les conteneurs LXC (Linux Containers) est pct. Ces outils s'exécutent localement sur un nœud, en root, et agissent sur les invités de ce nœud. Ils conviennent aux scripts lancés directement sur l'hôte, par exemple via un timer systemd, mais ne fournissent aucune séparation de privilèges : quiconque les exécute dispose des pleins pouvoirs.

pvesh : l'API en ligne de commande

Le wiki officiel décrit pvesh comme un outil qui expose l'intégralité de l'API REST d'un cluster lorsqu'il est lancé en root sur un nœud, en relayant les appels vers les autres membres via SSH. Une commande comme pvesh get /cluster/resources --type vm --output-format json renvoie l'inventaire de toutes les VM du cluster. C'est l'outil idéal pour prototyper un appel API avant de le transposer dans un client distant.

API REST Proxmox : automatiser à distance avec un client dédié

Selon la documentation de l'API Proxmox VE, le service écoute en HTTPS sur le port 8006, avec une URL de base en /api2/json/. L'authentification repose soit sur un ticket de session valable deux heures, accompagné d'un jeton anti-CSRF (Cross-Site Request Forgery) pour les requêtes d'écriture, soit sur un token d'API transmis dans l'en-tête Authorization. Le même wiki signale que passer ces en-têtes en argument de curl les expose aux autres utilisateurs du système.

L'API distante présente un avantage décisif pour la sécurité : le script tourne sur un poste d'administration ou un serveur d'automatisation, pas sur l'hyperviseur, et s'authentifie avec une identité dont les droits sont bornés. Des bibliothèques existent dans la plupart des langages, comme proxmoxer en Python, ainsi que des fournisseurs Terraform et un plugin Packer maintenus par la communauté.

Comparatif des interfaces d'automatisation Proxmox VE
InterfaceLieu d'exécutionAuthentificationUsage typiquePoint de vigilance
qm / pctNœud local, en rootSession shell rootScripts de maintenance locaux, timers systemdAucune restriction de droits, portée limitée au nœud
pveshNœud du cluster, en rootSession shell rootPrototypage d'appels API, opérations à l'échelle du clusterPleins pouvoirs, relais SSH entre nœuds
API REST + ticketPoste ou serveur distantUtilisateur, mot de passe, ticket 2 h, jeton CSRFOutils interactifs, sessions courtesMot de passe à stocker, second facteur inapplicable au script
API REST + tokenPoste, CI/CD, outil tiersToken à privilèges séparés, expirationTerraform, Ansible, supervision, scripts planifiésSecret affiché une seule fois, à stocker dans un coffre
HookscriptNœud hébergeant l'invité, en rootAucune (déclenché par la plateforme)Actions au démarrage ou à l'arrêt d'une VMIntégrité du stockage des snippets
Architecture de l'automatisation Proxmox VE : scripts locaux, outils distants, hookscripts et scripts communautaires convergent vers qm, pct, pvesh et l'API REST sur le port 8006, contrôlée par les ACL et tokens, avant d'atteindre QEMU/KVM, LXC, le stockage et la configuration du cluster
Schéma 1 — Les sources de scripts, les interfaces d'automatisation et le point de contrôle des permissions dans Proxmox VE.

Écrire un script Proxmox robuste et lisible

Un script d'administration d'hyperviseur doit échouer proprement plutôt que poursuivre sur une erreur. En Bash, l'en-tête set -euo pipefail interrompt l'exécution dès qu'une commande échoue, qu'une variable n'est pas définie ou qu'un élément d'un pipeline renvoie une erreur. Cette discipline évite le scénario classique d'une suppression lancée sur une variable vide, qui transforme une opération ciblée en opération globale.

Trois autres réflexes réduisent fortement les incidents. Un verrou empêche deux exécutions concurrentes, par exemple via la commande flock. Une journalisation systématique vers syslog avec logger rend chaque action traçable dans le journal du nœud. Un mode de simulation, activé par une option ou une variable d'environnement, affiche les actions prévues sans les exécuter et permet une validation humaine avant la première exécution réelle.

L'idempotence constitue le quatrième pilier : un script relancé deux fois doit produire le même état final, sans créer de doublons ni d'erreurs. Concrètement, il vérifie l'existence d'une VM, d'un snapshot ou d'un utilisateur avant de le créer, et contrôle l'état d'un invité avec qm status avant de l'arrêter. Cette approche facilite aussi la reprise après une interruption partielle.

Exemple commenté : un script de snapshots avant maintenance

Le script ci-dessous illustre ces principes sur un cas fréquent : figer l'état des machines virtuelles (VM) d'un nœud avant une mise à jour. Il combine verrou, mode simulation activé par défaut, journalisation dans syslog et traitement individuel des erreurs, afin qu'un échec sur une VM n'interrompe pas la protection des autres.

#!/usr/bin/env bash
set -euo pipefail

exec 9>/run/lock/snap-maintenance.lock
flock -n 9 || { echo "Exécution déjà en cours" >&2; exit 1; }

TAG="premaint-$(date +%Y%m%d-%H%M)"
DRY_RUN="${DRY_RUN:-1}"

for VMID in $(qm list | awk 'NR>1 && $3=="running" {print $1}'); do
  if [[ "$DRY_RUN" == "1" ]]; then
    echo "[simulation] qm snapshot $VMID $TAG"
    continue
  fi
  if qm snapshot "$VMID" "$TAG" --description "Snapshot avant maintenance"; then
    logger -t snap-maintenance "VM $VMID : snapshot $TAG créé"
  else
    logger -p user.err -t snap-maintenance "VM $VMID : échec du snapshot $TAG"
  fi
done

Par défaut, cet exemple se contente d'afficher les commandes prévues ; lancé avec DRY_RUN=0, il crée un snapshot de chaque VM en cours d'exécution sur le nœud local. Il suppose un stockage compatible avec les snapshots, comme ZFS, LVM-thin, Ceph RBD ou des disques qcow2. Le même raisonnement s'applique à un script d'inventaire qui interroge /cluster/resources pour produire un rapport de capacité, utile pour suivre la méthode de dimensionnement CPU et RAM d'un cluster Proxmox.

Enfin, un script destiné à durer doit être versionné, commenté dans un fichier README séparé et relu par un pair avant sa mise en service. L'analyse statique avec ShellCheck détecte les erreurs de guillemets et les expansions dangereuses, qui sont à l'origine de nombreux comportements inattendus en Bash. Ces contrôles prennent quelques minutes et évitent des heures de restauration.

Tokens d'API et moindre privilège pour les scripts Proxmox

La documentation de gestion des utilisateurs Proxmox VE décrit les tokens d'API comme un accès sans état à la plupart des points de l'API, attribuable à un utilisateur avec des permissions et une date d'expiration propres. Un token compromis peut être révoqué sans désactiver l'utilisateur. Les points d'accès aux consoles des VM et du système restent exclus : ils exigent des privilèges d'utilisateur et ne sont pas accessibles par token.

Deux modes coexistent. Avec la séparation des privilèges, comportement par défaut, le token doit recevoir ses propres ACL (listes de contrôle d'accès) et ses droits effectifs résultent de l'intersection entre ceux de l'utilisateur et ceux du token. Sans séparation, le token hérite de tous les droits de son utilisateur. La documentation recommande de ne désactiver la séparation que si l'intégration en a réellement besoin, et de fixer une expiration pour éviter qu'une automatisation abandonnée reste active.

Le secret du token n'est affiché qu'une seule fois, à la création, et ne peut plus être relu par l'API. Il doit donc être immédiatement déposé dans un coffre de secrets ou, à défaut, dans un fichier lisible uniquement par le compte de service. Le modèle d'ACL de Proxmox VE repose sur des chemins (/vms, /storage, /pool, /nodes) et des rôles, ce qui permet de limiter un script à un pool de ressources précis.

Mettre en œuvre un token d'API restreint pas à pas

La séquence suivante crée un compte de service, un rôle personnalisé limité à l'audit et aux snapshots, puis un token à privilèges séparés valable 90 jours. Elle s'exécute une seule fois, en root, sur un nœud du cluster ; le script d'automatisation utilise ensuite uniquement le token, depuis un poste distant.

pveum user add automation@pve --comment "Compte de service des scripts"
pveum role add SnapshotOperator --privs "VM.Audit VM.Snapshot"
pveum acl modify /pool/production --users automation@pve --roles SnapshotOperator

pveum user token add automation@pve snapshots --privsep 1 \
  --expire "$(date -d '+90 days' +%s)" \
  --comment "Script snapshots - équipe infrastructure"
pveum acl modify /pool/production --tokens 'automation@pve!snapshots' --roles SnapshotOperator
pveum user token permissions automation@pve snapshots

curl -fsS --cacert /etc/ssl/pve-root-ca.pem \
  -H @/home/svc-auto/.config/pve/snapshots.header \
  "https://pve1.example.internal:8006/api2/json/cluster/resources?type=vm"

Dans cet exemple, l'utilisateur et le token reçoivent tous deux le rôle personnalisé sur le pool, condition nécessaire puisque les droits effectifs d'un token séparé ne dépassent jamais ceux de son utilisateur. L'en-tête Authorization, de la forme PVEAPIToken=utilisateur@royaume!identifiant=secret, est stocké dans un fichier en mode 600 et passé à curl avec l'option -H @fichier, comme le préconise le wiki. Le certificat racine du cluster, présent sur les nœuds dans /etc/pve/pve-root-ca.pem, est copié sur le poste client pour valider la connexion TLS (Transport Layer Security) au lieu de désactiver la vérification.

Conseil d'expert : traitez chaque token comme un compte de service à part entière : un token par script et par environnement, un commentaire indiquant l'équipe propriétaire et la date de rotation, une expiration de 90 jours au maximum pour les usages planifiés. Comme pour la rotation scriptée et sécurisée du compte KRBTGT en environnement Active Directory, la rotation d'un secret d'automatisation doit être documentée, testée et réalisable sans interruption de service.

Ce principe rejoint les recommandations de configuration d'un système GNU/Linux publiées par l'ANSSI, qui font du moindre privilège, de la gestion des comptes de service et du contrôle d'accès des principes structurants. Appliqué à Proxmox VE, il se traduit par une règle simple : aucun script planifié ne devrait utiliser root@pam ni un token sans séparation de privilèges, sauf justification écrite et revue périodique.

Hookscripts, hooks de sauvegarde et automatisation événementielle

Un hookscript est un exécutable associé à une VM ou à un conteneur par l'option hookscript, par exemple avec la commande qm set 110 --hookscript local:snippets/journal-hook.sh. Proxmox VE l'appelle avec deux arguments, l'identifiant de l'invité et la phase en cours : pre-start, post-start, pre-stop et post-stop. Un code de retour non nul en phase pre-start empêche le démarrage, ce qui permet par exemple de vérifier un prérequis réseau.

#!/usr/bin/env bash
vmid="$1"
phase="$2"
case "$phase" in
  pre-start|post-start|pre-stop|post-stop)
    logger -t pve-hook "Invité ${vmid} : phase ${phase}"
    ;;
esac
exit 0

Le fichier doit résider sur un stockage autorisé à contenir des snippets et être exécutable. Il tourne en root sur le nœud qui héberge l'invité. Conséquence directe : toute personne capable d'écrire dans le stockage des snippets peut faire exécuter du code en root au prochain démarrage de la VM. Sur un partage NFS ou CIFS commun à plusieurs nœuds, l'impact s'étend à tout le cluster. Le stockage des snippets mérite donc le même niveau de protection que la configuration du cluster.

Les sauvegardes disposent d'un mécanisme comparable : vzdump accepte un script de hook, déclaré par l'option --script ou dans /etc/vzdump.conf, appelé aux différentes étapes d'une tâche de sauvegarde. Il sert couramment à envoyer une notification, à geler une application ou à copier un rapport. Les mêmes règles s'appliquent : chemin protégé en écriture, propriétaire root, contenu versionné et relu.

La configuration du système invité au premier démarrage par cloud-init, qui s'appuie elle aussi sur des snippets, relève d'une logique différente : elle agit à l'intérieur de la VM et non sur l'hyperviseur. Elle mérite un traitement dédié. Retenons seulement ici que ses fichiers personnalisés partagent le même emplacement de stockage et donc les mêmes exigences d'intégrité.

Proxmox VE Helper-Scripts : ce que font les scripts communautaires

Le projet le plus connu de scripts pour Proxmox VE est né du travail d'un contributeur connu sous le pseudonyme tteck. Après son décès, début novembre 2024, la communauté a poursuivi le projet sous le nom de Proxmox VE Helper-Scripts (Community Edition), publié sous licence MIT. Le principe reste inchangé : une seule commande collée dans le shell de l'hôte crée, configure et démarre un conteneur LXC ou une VM prête à l'emploi.

Chiffres clés : selon le communiqué de lancement de Proxmox VE 9.2 publié le 21 mai 2026, la plateforme équipe plus de 2 millions d'hôtes dans le monde. Le dépôt community-scripts/ProxmoxVE sur GitHub, consulté en novembre 2026, revendique plus de 700 scripts d'installation et précise que ces commandes s'exécutent en root sur l'hôte.

Pourquoi ces scripts séduisent

Leur succès s'explique facilement. Ils couvrent la domotique, le multimédia, les bases de données, la supervision ou les outils de développement, avec des valeurs par défaut raisonnables et un mode avancé pour choisir stockage, réseau et ressources. Chaque conteneur reçoit une commande de mise à jour. Pour un laboratoire personnel, le gain de temps est réel et la qualité moyenne du code s'est nettement améliorée avec la structuration du projet.

Prérequis et modifications de l'hôte imposés par les scripts communautaires

Le README du projet Proxmox VE Helper-Scripts est transparent sur les prérequis : Proxmox VE 8.0 à 8.4 ou 9.0 à 9.2, un shell root sur l'hôte et un accès Internet pendant l'installation. Il invite chaque utilisateur à lire le script avant de le coller. Il indique aussi qu'un script applicatif se contente de décrire l'installation, tandis qu'un moteur commun, hébergé dans un dépôt distinct, est chargé au démarrage pour créer le conteneur et gérer les erreurs.

Les outils destinés à l'hôte lui-même, comme les routines post-installation ou les aides au passthrough matériel, modifient directement le système : dépôts APT (gestionnaire de paquets de Debian), paquets, paramètres du noyau ou du chargeur de démarrage. Pour ces opérations sensibles, une procédure documentée et maîtrisée reste préférable, qu'il s'agisse d'un passthrough GPU NVIDIA ou AMD pour des charges d'IA ou des réglages décrits dans notre guide d'optimisation de Proxmox VE, appliqués un par un et mesurés.

Risques de sécurité du modèle « curl | bash » sur un hyperviseur

Avertissement : cette section décrit des risques pour aider les administrateurs à protéger leurs propres infrastructures. Toute vérification active sur un système doit être réalisée dans un cadre autorisé, sur un périmètre dont vous avez la responsabilité.

Le schéma « télécharger et exécuter immédiatement » supprime l'étape de contrôle entre la source et l'exécution. Sur un poste de travail, l'impact reste en général circonscrit à une machine et à un utilisateur. Sur un hyperviseur, le script obtient les droits root sur la machine qui détient les disques, la mémoire et les secrets de toutes les VM hébergées. L'ensemble du cluster hérite alors du niveau de confiance accordé au dépôt distant.

Les principaux risques se répartissent ainsi :

  • Exécution non relue : la commande s'exécute avant toute lecture, sous l'effet de l'urgence ou de la confiance accordée à la popularité du projet.
  • Code chargé dynamiquement : une partie de la logique est récupérée au moment de l'exécution ; le code lu la veille n'est pas forcément celui qui s'exécute le lendemain.
  • Compromission de la chaîne d'approvisionnement : compte de mainteneur détourné, dépendance modifiée, site clone ou nom de domaine proche diffusant une commande altérée.
  • Modifications silencieuses de l'hôte : changement de dépôts APT, installation de paquets, ajout de tâches planifiées ou de services, rarement documentés dans le registre des changements.
  • Services exposés après installation : applications installées avec des identifiants par défaut, des ports ouverts ou des mises à jour automatiques non maîtrisées.

Le deuxième point est souvent sous-estimé. Lire un script ne garantit pas de lire ce qui s'exécutera réellement si ce script télécharge à son tour d'autres fichiers depuis une branche mobile. Le contrôle doit donc porter sur une version figée de l'ensemble des composants, pas seulement sur la ligne de commande affichée sur un site web. C'est la différence entre faire confiance à un projet et vérifier un artefact.

Enfin, ces risques ne sont pas théoriques dans leur principe : les dépôts de code et les outils d'intégration continue figurent régulièrement parmi les cibles des campagnes de compromission de la chaîne logicielle. Un projet bénévole très suivi présente une surface d'attaque attractive, quelle que soit la bonne foi de ses mainteneurs. Pour un usage professionnel, la question n'est pas la qualité du projet, mais l'absence de contrôle entre lui et vos hyperviseurs.

Auditer un script Proxmox tiers avant exécution : méthode en six étapes

Utiliser un script communautaire reste possible dans un cadre professionnel, à condition de le traiter comme n'importe quel logiciel tiers entrant dans le système d'information. La méthode suivante, applicable en une à deux heures pour un script simple, transforme une commande opaque en artefact relu, figé et testé.

  1. Identifier la source officielle : vérifier l'organisation GitHub, l'URL exacte et l'historique du dépôt, puis écarter les miroirs et les sites qui republient les commandes.
  2. Cloner plutôt que télécharger à la volée : récupérer le dépôt du script et celui du moteur commun dans un environnement d'analyse, sans les exécuter.
  3. Épingler une version : noter le hash de commit analysé et créer un fork ou un miroir interne figé à ce commit.
  4. Relire le code et ses appels réseau : rechercher les téléchargements, les sources externes, les commandes eval, les modifications de dépôts APT et les services créés.
  5. Tester en laboratoire isolé : exécuter sur un nœud de test, avec un snapshot préalable, et comparer l'état du système avant et après.
  6. Exécuter depuis la copie interne et tracer : lancer la version validée, consigner le changement et planifier la revue des mises à jour suivantes.
git clone https://github.com/community-scripts/ProxmoxVE.git
cd ProxmoxVE
git log -1 --format='%H %cd'
git checkout <commit-relu-et-valide>
less ct/debian.sh
shellcheck ct/debian.sh
grep -rnE 'curl|wget|eval|source|apt-get|systemctl|crontab' ct/debian.sh install/ | less

Le README du projet documente des variables d'environnement permettant de pointer vers un fork ou vers une copie locale du moteur. C'est ce mécanisme qui rend possible une exécution depuis un miroir interne relu, plutôt que depuis la branche principale publique. Le recours à ces variables doit lui-même être consigné dans la procédure, afin qu'un autre administrateur reproduise exactement la même exécution.

Processus en six étapes pour auditer un script Proxmox communautaire : identifier la source, cloner, épingler un commit, relire le code et les appels réseau, tester en laboratoire avec snapshot, exécuter depuis une copie interne, avec des critères de refus à chaque étape
Schéma 2 — Méthode d'audit d'un script tiers avant exécution sur un hôte Proxmox VE, avec points de décision go / no-go.

Critères de décision go ou no-go

Un refus s'impose si le script télécharge des binaires sans vérification d'empreinte, désactive des contrôles de sécurité de l'hôte sans le signaler, ouvre un accès distant non documenté ou modifie la configuration du cluster. Une validation conditionnelle convient lorsque les modifications sont limitées à un conteneur isolé, réversibles par snapshot et compréhensibles par l'équipe qui assurera la maintenance du service installé.

Détecter un usage anormal de scripts sur un hôte Proxmox

Le référentiel MITRE ATT&CK décrit l'abus des interpréteurs de commandes Unix sous la sous-technique T1059.004 et, depuis 2025, l'abus des outils en ligne de commande d'hyperviseur sous la sous-technique T1059.012 Hypervisor CLI. Celle-ci cible pour l'instant ESXi et ses outils esxcli et vim-cmd, mais sa logique se transpose directement à qm, pct et pvesh : arrêt massif d'invités, découverte des VM, modification du pare-feu avant chiffrement.

La stratégie de détection proposée par MITRE pour cette sous-technique vise l'usage des outils d'administration par des comptes non autorisés ou en dehors des fenêtres de maintenance prévues. Sur Proxmox VE, cela suppose de connaître le comportement normal : quels comptes de service appellent l'API, depuis quelles adresses, à quelles heures, et quelles tâches sont attendues.

Sources de journaux à collecter

  • Le journal d'accès de l'API dans /var/log/pveproxy/access.log, qui consigne l'adresse source, l'utilisateur ou le token et la ressource appelée.
  • Les journaux des tâches Proxmox dans /var/log/pve/tasks/, qui identifient l'initiateur de chaque opération (création, suppression, migration, sauvegarde).
  • Le journal système des services pvedaemon et pveproxy, où figurent les échecs d'authentification.
  • Les événements auditd sur les exécutions privilégiées et sur les fichiers de persistance de l'hôte.
cat > /etc/audit/rules.d/50-pve-scripts.rules <<'EOF'
-w /etc/apt/sources.list.d/ -p wa -k pve_apt_sources
-w /etc/cron.d/ -p wa -k pve_persistence
-w /etc/systemd/system/ -p wa -k pve_persistence
-a always,exit -F arch=b64 -S execve -F exe=/usr/bin/curl -F euid=0 -k root_download
-a always,exit -F arch=b64 -S execve -F exe=/usr/bin/wget -F euid=0 -k root_download
EOF
augenrules --load
ausearch -k root_download --start today -i | tail -n 50

Ces règles signalent les téléchargements lancés en root et les modifications des emplacements de persistance usuels, sans prétendre à l'exhaustivité. Adaptez les chemins avec command -v sur votre version et testez la volumétrie générée avant un déploiement généralisé. La corrélation entre nœuds exige une horloge cohérente : une dérive de quelques secondes complique la reconstitution d'une séquence, d'où l'importance d'une synchronisation NTP (Network Time Protocol) rigoureuse des nœuds Proxmox.

Signaux faibles à surveiller

Plusieurs indices méritent une alerte : un appel API avec root@pam depuis une adresse inhabituelle, une rafale d'arrêts ou de suppressions de VM, la création d'un token sans séparation de privilèges, l'ajout d'un hookscript sur une VM sensible, une modification des dépôts APT hors fenêtre de changement. Ces signaux complètent les mesures décrites dans notre guide de durcissement de Proxmox VE, notamment le filtrage du port 8006 et de SSH vers un réseau d'administration dédié.

Industrialiser l'automatisation Proxmox : Git, revue de code et outils déclaratifs

Au-delà d'une dizaine de scripts, la gouvernance devient le vrai sujet. Un dépôt Git unique, une revue obligatoire par un second administrateur, une analyse ShellCheck en intégration continue et un catalogue indiquant pour chaque script son propriétaire, son token et sa fréquence d'exécution suffisent à éviter l'essentiel des dérives. Les secrets restent hors du dépôt, dans un coffre accessible au seul exécuteur.

Pour les opérations répétitives de provisioning, les outils déclaratifs prennent le relais des scripts impératifs. Ansible, Terraform ou Packer décrivent l'état attendu plutôt que la séquence d'actions, ce qui facilite la revue et la détection des écarts. Ils consomment la même API et doivent recevoir les mêmes tokens restreints que les scripts maison, jamais un compte d'administration complet.

Dans un cluster, les scripts doivent tenir compte de la haute disponibilité. Sur une ressource gérée par le gestionnaire HA (haute disponibilité), les demandes de démarrage et d'arrêt sont arbitrées par ce dernier, et un script qui l'ignore peut provoquer des redémarrages inattendus ou des migrations concurrentes. Les principes de conception sont détaillés dans notre guide du clustering et de la haute disponibilité Proxmox VE.

Environnement de test : les commandes et méthodes de cet article ont été préparées pour un laboratoire isolé composé de trois nœuds Proxmox VE 9.2 virtualisés en mode imbriqué sur Debian 13, d'un serveur Proxmox Backup Server 4.2, d'un stockage NFS dédié aux snippets et d'un poste d'administration Debian 13 avec Ansible, curl et ShellCheck. Le réseau d'administration est séparé et l'accès Internet passe par un miroir interne. Validez chaque commande sur votre propre version avant tout usage en production.

Retour terrain : Cas typique rencontré en mission — lors des revues d'infrastructure Proxmox, je constate souvent que des scripts post-installation lancés en root ont basculé les dépôts APT vers la branche sans abonnement, sans trace dans le registre des changements. Des tokens créés pour un essai restent actifs, sans expiration ni séparation des privilèges, et un conteneur déployé par script expose son interface sur le réseau d'administration. La remédiation passe par un inventaire des tokens avec pveum, une expiration systématique et des dépôts figés par la gestion de configuration.

La maturité se mesure enfin à la capacité de répondre à trois questions en moins d'une heure : quels scripts peuvent modifier l'hyperviseur, avec quelles identités, et qui les a exécutés au cours du dernier mois. Une organisation incapable d'y répondre dispose d'une automatisation efficace, mais pas encore d'une automatisation gouvernée.

À lire aussi : le stockage hyperconvergé vSAN ; les templates cloud-init.

Questions fréquentes

Comment exécuter un script sur Proxmox ?

Un script peut s'exécuter de deux manières. Localement, il est copié sur un nœud puis lancé en root depuis le shell, éventuellement par un timer systemd ; il utilise alors qm, pct ou pvesh. À distance, il tourne sur un poste d'administration ou un serveur d'automatisation et appelle l'API REST sur le port 8006 avec un token. La seconde approche est préférable pour la sécurité, car elle permet de limiter les droits du script à un pool ou à quelques VM. Dans tous les cas, testez d'abord en mode simulation sur un nœud de laboratoire, vérifiez que le stockage prend en charge les opérations prévues et journalisez chaque action avec logger.

Les Proxmox VE Helper-Scripts sont-ils sûrs ?

Le projet est public, maintenu par une équipe identifiée et son code est lisible sur GitHub, ce qui constitue un bon point de départ. Mais ses propres consignes rappellent que les commandes s'exécutent en root sur l'hôte et qu'il faut lire chaque script avant de le coller. Le risque vient moins de l'intention des mainteneurs que du modèle d'exécution : téléchargement à la volée, chargement dynamique du moteur, besoin d'un accès Internet. En homelab, une lecture attentive suffit souvent. En production, clonez le dépôt, épinglez un commit relu, testez en laboratoire et exécutez depuis une copie interne, en consignant le changement.

Comment automatiser la création de VM sur Proxmox ?

La méthode la plus fiable consiste à préparer un modèle de VM, puis à le cloner par script. Avec qm, la commande qm clone crée une copie complète ou liée, ajustée ensuite par qm set pour la mémoire, le processeur ou le réseau. Par l'API, le même résultat s'obtient avec un appel POST sur le point de clonage de la VM modèle. Pour des environnements entiers, Terraform ou Ansible décrivent l'état attendu et appellent l'API à votre place. Dans tous les cas, utilisez un token limité au pool cible et vérifiez la disponibilité des ressources avant de lancer des créations en série.

Quelle différence entre qm, pct et pvesh ?

La commande qm administre les machines virtuelles QEMU/KVM : création, clonage, démarrage, arrêt, snapshots ou migration. La commande pct joue le même rôle pour les conteneurs LXC, avec des options propres comme l'exécution d'une commande dans le conteneur. L'outil pvesh est plus générique : il expose toute l'API REST en ligne de commande lorsqu'il est lancé en root sur un nœud, avec relais vers les autres membres du cluster. En résumé, qm et pct offrent une syntaxe métier pratique pour un nœud, tandis que pvesh permet d'atteindre n'importe quel point de l'API et de prototyper des appels distants.

Comment sécuriser un token API Proxmox utilisé par un script ?

Créez un utilisateur de service dédié dans le royaume PVE, puis un token avec séparation de privilèges, qui est le comportement par défaut. Attribuez à l'utilisateur et au token un rôle personnalisé minimal sur le chemin le plus précis possible, par exemple un pool. Fixez une date d'expiration, ajoutez un commentaire indiquant le propriétaire et stockez le secret dans un coffre ou dans un fichier en mode 600. Passez l'en-tête à curl depuis un fichier plutôt qu'en argument, validez TLS avec le certificat du cluster et révoquez immédiatement tout token inutilisé ou suspecté d'exposition.

Conclusion

Un script Proxmox bien conçu est un levier de fiabilité : il rend les opérations reproductibles, traçables et rapides. Mal maîtrisé, il devient le chemin le plus court vers une compromission complète de l'hyperviseur. Les interfaces natives offrent déjà tout le nécessaire pour concilier les deux exigences : API REST, tokens à privilèges séparés et datés, ACL par pool, journaux d'accès et de tâches.

Pour les scripts communautaires, la règle tient en une phrase : aucun code tiers ne s'exécute en root sur un hyperviseur de production sans avoir été cloné, relu, figé et testé. Cette discipline, complétée par une détection orientée sur les usages anormaux des outils d'administration, permet de profiter de l'automatisation sans en subir les risques. Pour replacer ces pratiques dans l'ensemble de la plateforme, consultez notre guide complet de Proxmox VE.

Faire auditer vos scripts et votre cluster Proxmox VE

Ayi NEDJIMI accompagne les équipes d'infrastructure dans l'audit de leurs automatisations Proxmox : revue des scripts et des tokens d'API, contrôle des scripts communautaires installés, durcissement des nœuds et mise en place d'une détection adaptée.

Demander un audit de votre environnement Proxmox