| Code | MO-SEC-003 |
| Version | 1.1 |
| Date | 26 juin 2026 |
| Auteur | Cédric LEGRAND |
| Classification | USAGE INTERNE — Équipe BTS SIO |
| Version | Date | Modifications |
|---|---|---|
| 1.0 | 15/04/2026 | Création initiale — formalisation du traitement appliqué aux 4 items ancien-mdp résiduels du Sprint 2 (Ferme HyperV, OPNsense 2, SuluCisco Wifi, Zabbix root) |
Ce mode opératoire décrit la procédure d'investigation et de résolution des items du gestionnaire de mots de passe Vaultwarden qui ne peuvent pas être rotates lors d'une opération de rotation périodique (cf. MO-AD-008) ou d'une rotation krbtgt (cf. MO-AD-002). Deux situations sont distinguées :
PermitRootLogin no, mot de passe changé hors-trace, compte verrouillé).L'enjeu n'est pas anodin : sans procédure formalisée, ces résidus s'accumulent silencieusement et l'on aboutit à une situation "rotate en vault mais inopérant en réel", strictement pire que pas de rotation du tout.
⚠️ Contexte initial. A l'issue du Sprint 2 (rotation des mots de passe critiques, 14-15 avril 2026), quatre items ancien-mdp résiduels ont été identifiés : Ferme HyperV (
10.0.112.4, injoignable), OPNsense 2 (10.0.112.101, injoignable), SuluCisco-Wifi (10.0.112.6, injoignable) et Zabbix root (10.0.112.190, divergence SSH). Cette procédure est issue du traitement appliqué à ces quatre items.
| Public concerné | Administrateurs de l'infrastructure BTS SIO |
| Vault | Vaultwarden auto-hébergé https://10.0.112.10 (CT 127 ProxMox) |
| Outils | bw CLI (Bitwarden CLI), ping/nc/ssh, navigateur web, jq |
| Authentification | Vault Vaultwarden déverrouillé (admin@bts.sio) ; accès LAN/console pour les pivots |
| Durée | 15-30 min par item, ~2 h pour un lot complet de quatre items |
| Présentiel requis | Dépend du cas : Cas A (souvent oui), Cas B (souvent non) |
Ce MO est complémentaire, et non substitutif, des MO-AD-002 et MO-AD-008. Il couvre exclusivement la phase "résidu post-rotation".
export BW_SESSION=$(bw unlock --raw) (cf. MO-PLT-009)wg-bts actif (bts vpn status)ℹ️ Certificat self-signed. Vaultwarden hébergé un certificat auto-signé. Préfixer toute commande
bwparNODE_TLS_REJECT_UNAUTHORIZED=0ou exporter cette variable une fois pour la session. Pas de fallback gracieux dansbwen cas d'erreur TLS.
Après une rotation, identifier les items qui contiennent encore l'ancien mot de passe (ex. recherche ancien-mdp) :
export NODE_TLS_REJECT_UNAUTHORIZED=0
export BW_SESSION=$(bw unlock --raw)
bw list items 2>/dev/null \
| jq -r '.[] | select(.login.password|ascii_downcase|startswith("colombo")) | "\(.id) | \(.name) | \(.login.username // "-")"'
La sortie liste les items à traiter avec leur identifiant Vaultwarden, leur nom et le compte concerné.

Pour chaque item identifié, exécuter les quatre tests dans cet ordre. Le premier qui échoue déclenche le cas correspondant :
HOST=10.0.112.4
ping -c 3 -W 2 $HOST # 1. Joignabilité réseau
nc -vz $HOST 22 # 2. Port SSH ouvert ?
nc -vz $HOST 443 # 3. Port HTTPS ouvert ?
ssh -o BatchMode=yes \
-o ConnectTimeout=5 \
-o StrictHostKeyChecking=no \
root@$HOST exit # 4. Auth réelle
Arbre de décision :
Permission denied (password) → Cas B — DIVERGENCE (sec. 6)Permission denied (publickey) sans password → SSH par clé uniquement, voir sec. 6 (sshd_config)ℹ️ Tracer le diagnostic. Garder un horodatage et la sortie brute des tests : cela alimentera les notes Vaultwarden (sec. 7) et permettra de comparer dans le temps si le même item revient régulièrement.
Vérifier l'injoignabilité depuis plusieurs points pour exclure un problème local de routage VPN :
# Depuis le poste admin (via VPN)
ping -c 3 10.0.112.4
# Depuis OPNsense (autre point de vue)
ssh root@10.0.112.1 "ping -c 3 10.0.112.4"
# Verifier la couverture VPN
wg show wg-bts allowed-ips
Si tous les points retournent un échec, l'hôte est confirmé hors réseau.
| Symptôme | Hypothèse la plus probable |
|---|---|
ping timeout depuis tous les vantage points |
Machine éteinte ou débranchée |
ping OK depuis OPNsense, KO depuis VPN |
Plage non couverte par allowed-ips sur wg-bts |
ping KO partout sauf SuluCisco voisin |
Interface réseau de l'hôte tombée |
Plage entière injoignable (10.0.X.0/24) |
VLAN entier coupé ou switch éteint |
Dans l'ordre, jusqu'à obtenir un accès :
Tant que la rotation n'a pas pu se faire, l'item doit être annoté pour éviter qu'il soit oublié :
ITEM_ID=$(bw list items --search "Ferme HyperV" 2>/dev/null \
| jq -r '.[0].id')
bw get item $ITEM_ID \
| jq '.notes = "[BLOQUE 2026-04-15] Host 10.0.112.4 injoignable depuis VPN wg-bts. Rotation reportee. Action : ping check au prochain presentiel."' \
| bw encode \
| bw edit item $ITEM_ID
bw sync
Le préfixe [BLOQUE YYYY-MM-DD] est volontairement sans accent pour faciliter le grep ultérieur sur le vault.
L'auth réelle (SSH, web, WinRM) refusé le mot de passe du vault alors que le port répond. Avant d'investiguer côté serveur, exclure une coquille de saisie en testant depuis deux clients différents (ssh ligne de commande et navigateur ou client GUI).
Pour SSH (Linux) : pivoter via un compte non-root encore valide, vérifier la configuration sshd :
ssh admin@10.0.112.190
sudo grep -E '^(PermitRootLogin|PasswordAuthentication)' /etc/ssh/sshd_config
sudo last -n 5 root # date de la derniere connexion root reussie
Pour AD (Windows) : vérifier le statut du compte :
Get-ADUser -Identity <user> -Properties LockedOut, AccountExpired, PasswordExpired, PasswordLastSet
Pour une appliance web (OPNsense, NAS QNAP) : tester via l'UI web et regarder les journaux d'audit System→Log Files ou équivalent.
L'objectif est de prouver que le compte fonctionne réellement avec un autre mot de passe (cas du MDP changé hors-trace) ou qu'il est réellement cassé (cas où aucune méthode ne passe). Canaux : web UI, console physique (ESXi/HyperV), Recovery Mode, WinRM si compte AD, console série pour les firewalls.
Pour Zabbix sur HyperV (constaté le 15/04/2026) : la divergence vault/SSH est réellement résolue par la console HyperV, qui demande l'accès à la Ferme HyperV (10.0.112.4). Si cette dernière est elle-même injoignable (Cas A), l'item passe en Cas B bloqué par Cas A à signaler explicitement.
| Plate-forme | Méthode de reset |
|---|---|
| Linux (général) | Console single-user (init=/bin/bash), passwd, reboot |
| Active Directory | Mode DSRM (Directory Services Restore Mode) ou Set-ADAccountPassword via un autre DA |
| NAS QNAP | Bouton reset physique (3 s = reset administrateur) |
| OPNsense | Boot menu, option 3 ("Reset root password") |
| Cisco IOS | Mode rommon, contournement par changement de config-register |
Convention symétrique au Cas A :
ITEM_ID=$(bw list items --search "Zabbix" 2>/dev/null | jq -r '.[0].id')
bw get item $ITEM_ID \
| jq '.notes = "[DIVERGENCE 2026-04-15] Vault dit ancien-mdp mais SSH refuse (Permission denied). Hypotheses : (a) PermitRootLogin no, (b) MDP change hors-trace 2025-Q4. Procedure : reset console HyperV (depend de la Ferme HyperV 10.0.112.4 elle-meme injoignable)."' \
| bw encode \
| bw edit item $ITEM_ID
bw sync

⚠️ Risque d'auto-lockout. La plupart des appliances appliquent un verrouillage après 3-5 échecs d'authentification. Limiter les tests à deux tentatives par canal et attendre le délai de déverrouillage avant de retenter, sous peine de se retrouver bloqué même lorsque le bon mot de passe sera retrouvé.
| Préfixe | Cas | Modèle |
|---|---|---|
[BLOQUE YYYY-MM-DD] |
A | Host injoignable depuis . Rotation reportée. Action : . |
[DIVERGENCE YYYY-MM-DD] |
B | Vault dit X mais auth refusé. Hypothèses : (a)..., (b).... Procédure : . |
[RESOLU YYYY-MM-DD] |
post-traitement | Re-rotation OK. Préfixe antérieur purgé ; à effacer complètement à la rotation suivante. |
Pourquoi cette convention ?
grep facile sur le vault : bw list items | jq '.[] | select(.notes | test("BLOQUE|DIVERGENCE"))'ℹ️ Préfixes sans accent. Les préfixes
[BLOQUE],[DIVERGENCE]et[RESOLU]sont écrits sans accent pour éviter les problèmes d'encodage lors desgrepcross-platform et lors des recherches dans l'UI Vaultwarden.
L'item redevient joignable (présentiel, fix réseau, retour de la machine). Confirmer avec un ping + un test d'auth réel, puis vérifier que la note [BLOQUE] ou [DIVERGENCE] est bien encore présente sur l'item :
bw get item $ITEM_ID | jq -r '.notes'
Re-exécuter la portion concernée du MO d'origine :
krbtgt → MO-AD-002 (double rotation)Une re-rotation immédiate ne demande pas d'attendre la prochaine échéance : le but est de combler la fenêtre où l'ancien mot de passe a continué à être valide.
Remplacer le préfixe par [RESOLU YYYY-MM-DD] avec un résumé court :
bw get item $ITEM_ID \
| jq '.notes = "[RESOLU 2026-04-22] Re-rotation OK lors du presentiel S16."' \
| bw encode \
| bw edit item $ITEM_ID
bw sync
Le préfixe [RESOLU] sera lui-même purgé à la rotation programmée suivante (semestrielle), une fois confirmé qu'aucune régression n'est apparue.
Vérification finale :
[RESOLU]bw sync exécuté (la modification est poussée côté serveur)grep de la sec. 4| Symptôme | Solution |
|---|---|
bw edit retourne 400 Bad Request |
JSON malformé : vérifier l'échappement des guillemets dans la note (utiliser jq pour la construction plutôt qu'une concaténation string en bash). |
Note tronquée après bw edit |
Limite serveur Vaultwarden ~10 000 caractères. Raccourcir la note ou la préfixer d'un identifiant d'incident externe (Vikunja, ticket). |
| VPN remonté mais hôte toujours injoignable | Vérifier la route 10.0.112.0/24 dans wg show wg-bts allowed-ips ; certaines plages internes ne sont pas couvertes par défaut (cas OPNsense 2 sur 10.0.112.101). |
| SSH refusé même avec MDP correct | Tester avec ssh -v pour distinguer Permission denied (publickey) de (password). Si (publickey) seul, PasswordAuthentication no dans sshd_config. |
| NAS QNAP dont le bouton reset physique est inaccessible | Reporter au prochain présentiel ; en attendant, marquer [BLOQUE] avec une date butoir et bloquer toute tache planifiée qui dépend du compte concerné. |
NODE_TLS_REJECT_UNAUTHORIZED oublié |
bw échoue avec self-signed certificate. Toujours exporter la variable en début de session ou préfixer chaque commande. |
krbtgt permet de détecter les rotations manquantes)bw unlock)