| Code | MO-SEC-003 |
| Version | 1.0 |
| Date | 15 avril 2026 |
| Auteur | Cedric LEGRAND |
| Classification | USAGE INTERNE — Equipe BTS SIO |
| Version | Date | Modifications |
|---|---|---|
| 1.0 | 15/04/2026 | Creation initiale — formalisation du traitement applique aux 4 items Colombo66 residuels du Sprint 2 (Ferme HyperV, OPNsense 2, SuluCisco Wifi, Zabbix root) |
Ce mode operatoire decrit la procedure d'investigation et de resolution des items du gestionnaire de mots de passe Vaultwarden qui ne peuvent pas etre rotates lors d'une operation de rotation periodique (cf. MO-AD-008) ou d'une rotation krbtgt (cf. MO-AD-002). Deux situations sont distinguees :
PermitRootLogin no, mot de passe change hors-trace, compte verrouille).L'enjeu n'est pas anodin : sans procedure formalisee, ces residus s'accumulent silencieusement et l'on aboutit a une situation "rotate en vault mais inoperant en reel", 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 Colombo66 residuels ont ete identifies : 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 procedure est issue du traitement applique a ces quatre items.
| Public concerne | Administrateurs de l'infrastructure BTS SIO |
| Vault | Vaultwarden auto-heberge https://10.0.112.10 (CT 127 ProxMox) |
| Outils | bw CLI (Bitwarden CLI), ping/nc/ssh, navigateur web, jq |
| Authentification | Vault Vaultwarden deverrouille (admin@bts.sio) ; acces LAN/console pour les pivots |
| Duree | 15-30 min par item, ~2 h pour un lot complet de quatre items |
| Presentiel requis | Depend du cas : Cas A (souvent oui), Cas B (souvent non) |
Ce MO est complementaire, et non substitutif, des MO-AD-002 et MO-AD-008. Il couvre exclusivement la phase "residu post-rotation".
export BW_SESSION=$(bw unlock --raw) (cf. MO-PLT-009)wg-bts actif (bts vpn status)ℹ️ Certificat self-signed. Vaultwarden heberge un certificat auto-signe. Prefixer toute commande
bwparNODE_TLS_REJECT_UNAUTHORIZED=0ou exporter cette variable une fois pour la session. Pas de fallback gracieux dansbwen cas d'erreur TLS.
Apres une rotation, identifier les items qui contiennent encore l'ancien mot de passe (ex. recherche Colombo66) :
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 a traiter avec leur identifiant Vaultwarden, leur nom et le compte concerne.

Pour chaque item identifie, executer les quatre tests dans cet ordre. Le premier qui echoue declenche 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 decision :
Permission denied (password) → Cas B — DIVERGENCE (sec. 6)Permission denied (publickey) sans password → SSH par cle 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 meme item revient regulierement.
Verifier l'injoignabilite depuis plusieurs points pour exclure un probleme 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 echec, l'hote est confirme hors reseau.
| Symptome | Hypothese la plus probable |
|---|---|
ping timeout depuis tous les vantage points |
Machine eteinte ou debranchee |
ping OK depuis OPNsense, KO depuis VPN |
Plage non couverte par allowed-ips sur wg-bts |
ping KO partout sauf SuluCisco voisin |
Interface reseau de l'hote tombee |
Plage entiere injoignable (10.0.X.0/24) |
VLAN entier coupe ou switch eteint |
Dans l'ordre, jusqu'a obtenir un acces :
Tant que la rotation n'a pas pu se faire, l'item doit etre annote pour eviter qu'il soit oublie :
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 prefixe [BLOQUE YYYY-MM-DD] est volontairement sans accent pour faciliter le grep ulterieur sur le vault.
L'auth reelle (SSH, web, WinRM) refuse le mot de passe du vault alors que le port repond. Avant d'investiguer cote serveur, exclure une coquille de saisie en testant depuis deux clients differents (ssh ligne de commande et navigateur ou client GUI).
Pour SSH (Linux) : pivoter via un compte non-root encore valide, verifier 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) : verifier 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 equivalent.
L'objectif est de prouver que le compte fonctionne reellement avec un autre mot de passe (cas du MDP change hors-trace) ou qu'il est reellement casse (cas ou aucune methode ne passe). Canaux : web UI, console physique (ESXi/HyperV), Recovery Mode, WinRM si compte AD, console serie pour les firewalls.
Pour Zabbix sur HyperV (constate le 15/04/2026) : la divergence vault/SSH est reellement resolue par la console HyperV, qui demande l'acces a la Ferme HyperV (10.0.112.4). Si cette derniere est elle-meme injoignable (Cas A), l'item passe en Cas B bloque par Cas A a signaler explicitement.
| Plate-forme | Methode de reset |
|---|---|
| Linux (general) | 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 symetrique 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 Colombo66 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 apres 3-5 echecs d'authentification. Limiter les tests a deux tentatives par canal et attendre le delai de deverrouillage avant de retenter, sous peine de se retrouver bloque meme lorsque le bon mot de passe sera retrouve.
| Prefixe | Cas | Modele |
|---|---|---|
[BLOQUE YYYY-MM-DD] |
A | Host injoignable depuis . Rotation reportee. Action : . |
[DIVERGENCE YYYY-MM-DD] |
B | Vault dit X mais auth refuse. Hypotheses : (a)..., (b).... Procedure : . |
[RESOLU YYYY-MM-DD] |
post-traitement | Re-rotation OK. Prefixe anterieur purge ; a effacer completement a la rotation suivante. |
Pourquoi cette convention ?
grep facile sur le vault : bw list items | jq '.[] | select(.notes | test("BLOQUE|DIVERGENCE"))'ℹ️ Prefixes sans accent. Les prefixes
[BLOQUE],[DIVERGENCE]et[RESOLU]sont ecrits sans accent pour eviter les problemes d'encodage lors desgrepcross-platform et lors des recherches dans l'UI Vaultwarden.
L'item redevient joignable (presentiel, fix reseau, retour de la machine). Confirmer avec un ping + un test d'auth reel, puis verifier que la note [BLOQUE] ou [DIVERGENCE] est bien encore presente sur l'item :
bw get item $ITEM_ID | jq -r '.notes'
Re-executer la portion concernee du MO d'origine :
krbtgt → MO-AD-002 (double rotation)Une re-rotation immediate ne demande pas d'attendre la prochaine echeance : le but est de combler la fenetre ou l'ancien mot de passe a continue a etre valide.
Remplacer le prefixe par [RESOLU YYYY-MM-DD] avec un resume 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 prefixe [RESOLU] sera lui-meme purge a la rotation programmee suivante (semestrielle), une fois confirme qu'aucune regression n'est apparue.
Verification finale :
[RESOLU]bw sync execute (la modification est poussee cote serveur)grep de la sec. 4| Symptome | Solution |
|---|---|
bw edit retourne 400 Bad Request |
JSON malforme : verifier l'echappement des guillemets dans la note (utiliser jq pour la construction plutot qu'une concatenation string en bash). |
Note tronquee apres bw edit |
Limite serveur Vaultwarden ~10 000 caracteres. Raccourcir la note ou la prefixer d'un identifiant d'incident externe (Vikunja, ticket). |
| VPN remonte mais hote toujours injoignable | Verifier la route 10.0.112.0/24 dans wg show wg-bts allowed-ips ; certaines plages internes ne sont pas couvertes par defaut (cas OPNsense 2 sur 10.0.112.101). |
| SSH refuse meme 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 presentiel ; en attendant, marquer [BLOQUE] avec une date butoir et bloquer toute tache planifiee qui depend du compte concerne. |
NODE_TLS_REJECT_UNAUTHORIZED oublie |
bw echoue avec self-signed certificate. Toujours exporter la variable en debut de session ou prefixer chaque commande. |
krbtgt permet de detecter les rotations manquantes)bw unlock)