Depuis la version 7.0 de la mise à jour U2, la manière dont certaines parties de la configuration liée à ESXi sont stockées a changé. L’un de ces changements concerne le mot de passe des utilisateurs ESXi.

VMware (et plus récemment Broadcom) affirme officiellement qu’il n’est pas possible de réinitialiser le mot de passe du logiciel ESXi et que si l’administrateur oublie son mot de passe, il devra réinstaller (sauf si vous avez déjà relié votre ESXi à un vCenter et pouvez utiliser le profil d’hôte).

Aujourd’hui, nous vous fournissons la nouvelle version de la méthode (qui a été testée jusqu’à la version 9 dans notre environnement de test).

1. Démarrez votre serveur avec une ISO version 7.0U2 ou supérieure. (De préférence, utilisez la même version installée sur votre serveur)

2. Après que l’ESXi a démarré sur votre disque d’installation et que l’installateur s’affiche, appuyez sur Alt+F1 pour entrer dans le DCUI et à partir de là, ouvrez le shell avec l’utilisateur root sans mot de passe.

Si vous n’êtes pas à l’aise avec le travail via DCUI (par exemple, parce que vous ne pouvez pas copier/coller), vous pouvez démarrer le service SSH et vous y connecter.

Tout d’abord, assurez-vous que votre adresse IP est configurée d’une manière ou d’une autre. Par défaut, si vous avez un DHCPv4, ESXi obtiendra une adresse IPv4. En IPv6 avec SLAAC et en utilisant la méthode EUI64, une adresse vous sera attribuée, que vous pouvez voir de cette façon :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
localcli network ip interface ipv4 address list
localcli network ip interface ipv6 address list
Si ces méthodes ne fonctionnent pas et que vous préférez utiliser une adresse IP statique, vous pouvez procéder ainsi :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
localcli network ip interface ipv4 set --interface-name vmk0 --ipv4 VOTRE_ADRESSE_IPV4 --netmask VOTRE_MASQUE --type static
localcli network ip interface ipv6 address add --interface-name vmk0 --ipv6 VOTRE_ADRESSE_IPV6/PREFIX
Comme vous pouvez le constater, une adresse IP est appliquée sur l’interface VMK0.

Avant d’activer SSH, assurez-vous d’avoir défini un mot de passe acceptable pour l’utilisateur root. Pour ce faire, utilisez la commande suivante :

Si vous activez le service SSH sans définir de mot de passe, vous pourrez vous connecter à ESXi en tant que root sans mot de passe, ce qui est évidemment très dangereux d’un point de vue sécurité, surtout si vous utilisez une adresse IP publique.

Enfin, utilisez la commande suivante pour activer SSH :

Cela exécutera le serveur SSH sur le port 22/tcp.

3. Il existe 4 types de disques différents que vous pouvez voir de cette manière :

5. Les partitions qui nous intéressent portent les étiquettes BOOTBANK1 et BOOTBANK2 et sont de type FAT. Si vous n’avez jamais mis à jour votre ESXi, le BOOTBANK2 sera vide, mais si vous avez effectué une mise à jour, ESXi alternera la partition de démarrage à chaque mise à jour réussie. Nous n’allons pas entrer dans les détails des bootbanks, et à partir de maintenant, nous supposerons que votre ESXi démarre depuis BOOTBANK1.

Si vous souhaitez être 100 % certain, laissez votre ESXi original commencer à démarrer et appuyez sur Shift+O pendant les 5 secondes d’attente du bootloader, puis notez la valeur bootUUID affichée en bas de l’écran. Enfin, après avoir redémarré le serveur avec l’ISO, utilisez cette commande :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
localcli storage filesystem list
6. Les paramètres d’ESXi, y compris les mots de passe des utilisateurs, sont stockés dans le fichier state.tgz. Pour les nouvelles versions d’ESXi, si vous extrayez ce fichier, vous trouverez deux fichiers : encryption.info et local.tgz.ve.

Utilisez ces commandes :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
mkdir /tmp/hmecode
cd /tmp/hmecode
cp /vmfs/volumes/BOOTBANK1/state.tgz .
tar x -z -f state.tgz
Dans les anciennes versions d’ESXi, le fichier était local.tgz.

⚠️ Remarque : Comme le système de fichiers des bootbanks est en FAT, si vous effectuez l’extraction directement là-bas, vous perdrez les permissions des fichiers. C’est pourquoi l’opération est faite dans /tmp.

Le fichier local.tgz.ve est un fichier de type enveloppe utilisé par VMware pour appliquer un chiffrement. Vous ne pourrez donc plus l’extraire et voir/modifier son contenu comme auparavant.

Le fichier encryption.info est un fichier texte clair dont le contenu dépend du mode de chiffrement choisi. (Actuellement, cela peut être NONE ou TPM).

Si votre matériel le permet et que vous souhaitez passer de NONE à TPM (plus sécurisé), vous pouvez utiliser l’une de ces commandes après avoir réinitialisé votre mot de passe et vous être connecté à ESXi :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
localcli system settings encryption set --mode TPM
esxcli system settings encryption set --mode TPM
La méthode partagée ici vous permet de réinitialiser votre mot de passe dans les deux modes (NONE et TPM).

7. À l’étape suivante, vous allez déchiffrer le fichier local.tgz.ve.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
crypto-util envelope extract --aad ESXConfiguration local.tgz.ve local.tgz
8. Extrayez le fichier local.tgz

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
mkdir local
tar x -z -f local.tgz -C local
cd local
Si vous regardez attentivement, vous verrez que cette archive n’inclut plus les fichiers suivants comme auparavant :

etc/passwd

etc/shadow

En effet, VMware ne stocke plus le mot de passe dans ces fichiers mais l’a déplacé dans une base sqlite à l’adresse suivante :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
var/lib/vmware/configstore/backup/current-store-1
Vous pouvez visualiser le mot de passe sauvegardé des utilisateurs avec cette commande :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
/usr/lib/vmware/sqlite/bin/sqlite3 var/lib/vmware/configstore/backup/current-store-1 \
"SELECT * FROM Config WHERE Component='esx' AND ConfigGroup='authentication' \
AND Name='user_accounts' AND Identifier='root'"
10. Créez un fichier avec le contenu suivant :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
UPDATE Config SET UserValue='{"name":"root","password_hash":"$6$OuBJHTuaUlOIkE/k$p2fCVL5q5kniGsWYo1xU4Tzct0ZJ7hFQeJH2z9c5F/srN2hQkBKf/lTepTZHwJqRim48vNJ9Meky3E5S0amnL0","description":"Administrator"}' WHERE Component='esx' AND ConfigGroup='authentication' AND Name='user_accounts' AND Identifier='root'
Enregistrez-le à l’adresse suivante :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
vi /tmp/hmecode/reset-password.sql
⚠️ Si vous ne savez pas utiliser vi, vous pouvez créer le fichier dans votre éditeur de texte préféré (sur votre système) puis le transférer dans votre ESXi avec SFTP (par ex. FileZilla ou WinSCP).

11. Exécutez la requête avec sqlite :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
/usr/lib/vmware/sqlite/bin/sqlite3 var/lib/vmware/configstore/backup/current-store-1 </tmp/hmecode/reset-password.sql
Cela mettra à jour le hash dans la base. Vous pouvez vérifier le changement avec la commande de l’étape 9.

👉 Le hash fourni correspond au mot de passe pa$$w0rd.

12. Ré-archivez les fichiers pour obtenir un nouveau local.tgz :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
tar c -z -f /tmp/hmecode/local-new.tgz tar t -z -f /tmp/hmecode/local.tgz
Puis chiffrez à nouveau le fichier avec la clé :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
cd /tmp/hmecode/
key_id=crypto-util keys getkidbyname ConfigEncryptionKey
mv local.tgz.ve local-old.tgz.ve
crypto-util envelope insert --aad ESXConfiguration --id ${key_id} local-new.tgz local.tgz.ve
14. Créez un nouveau fichier state.tgz :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
mv state.tgz state-old.tgz
tar c -z -f state.tgz local.tgz.ve encryption.info
15. Transférez le fichier dans le bootbank et remplacez l’existant :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
cd /vmfs/volumes/BOOTBANK1
mv state.tgz state.tgz.bak
mv /tmp/hmecode/state.tgz .
👉 Une sauvegarde a été faite pour conserver l’original.

Vous pouvez maintenant redémarrer votre serveur et vous connecter avec l’utilisateur root et le mot de passe pa$$w0rd.

✅ Résumé rapide (TL;DR) :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
mkdir /tmp/hmecode
cd /tmp/hmecode
cp /vmfs/volumes/BOOTBANK1/state.tgz .
tar x -z -f state.tgz
localcli --plugin-dir=/usr/lib/vmware/esxcli/int system settings encryption stop
localcli --plugin-dir=/usr/lib/vmware/esxcli/int system settings encryption setup -c encryption.info
localcli --plugin-dir=/usr/lib/vmware/esxcli/int system settings encryption start
crypto-util envelope extract --aad ESXConfiguration local.tgz.ve local.tgz
mkdir local
tar x -z -f local.tgz -C local
cd local
/usr/lib/vmware/sqlite/bin/sqlite3 var/lib/vmware/configstore/backup/current-store-1 "UPDATE Config SET UserValue='{"name":"root","password_hash":"$6$OuBJHTuaUlOIkE/k$p2fCVL5q5kniGsWYo1xU4Tzct0ZJ7hFQeJH2z9c5F/srN2hQkBKf/lTepTZHwJqRim48vNJ9Meky3E5S0amnL0","description":"Administrator"}' WHERE Component='esx' AND ConfigGroup='authentication' AND Name='user_accounts' AND Identifier='root'"
tar c -z -f /tmp/hmecode/local-new.tgz tar t -z -f /tmp/hmecode/local.tgz
cd /tmp/hmecode/
key_id=crypto-util keys getkidbyname ConfigEncryptionKey
mv local.tgz.ve local-old.tgz.ve
crypto-util envelope insert --aad ESXConfiguration --id ${key_id} local-new.tgz local.tgz.ve
mv state.tgz state-old.tgz
tar c -z -f state.tgz local.tgz.ve encryption.info
cd /vmfs/volumes/BOOTBANK1
mv state.tgz state.tgz.bak
mv /tmp/hmecode/state.tgz .