> ## Documentation Index
> Fetch the complete documentation index at: https://docs.snakysec.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Key rotation

# Runbook — Rotation des clés et certificats

**Criticité:** Haute — effectuer en maintenance window
**Temps estimé:** 30–60 min selon le type de rotation

***

## 1. Rotation ENCRYPTION\_KEY (clés de chiffrement client secrets)

> ⚠️ Une rotation d'ENCRYPTION\_KEY nécessite de re-chiffrer tous les secrets clients en base.

### Procédure

```bash theme={null}
# 1. Générer une nouvelle clé AES-256 (32 bytes = 64 hex)
NEW_KEY=$(openssl rand -hex 32)
echo "Nouvelle clé: $NEW_KEY"

# 2. Re-chiffrer tous les secrets en base AVANT de patcher Vault
# Lancer le script de migration (à créer si nécessaire)
# node platform/scripts/rotate-encryption-key.js --old-key $OLD_KEY --new-key $NEW_KEY

# 3. Mettre à jour Vault
docker exec mssp-vault vault kv patch mssp/platform \
  encryption_key="$NEW_KEY"

# 4. Redémarrer la plateforme pour recharger les secrets Vault
docker compose restart platform
```

***

## 2. Rotation certificat Entra ID (plateforme)

> Certificat de l'app registration principale SnakySec sur le tenant MSSP.

```bash theme={null}
# 1. Générer un nouveau certificat (365 jours)
openssl req -x509 -newkey rsa:2048 \
  -keyout entra-app-new.key.pem \
  -out entra-app-new.cert.pem \
  -days 365 -nodes -subj "/CN=mssp-platform"

# 2. Uploader le nouveau certificat dans Azure Portal
#    App registrations → SnakySec Platform → Certificates & secrets
#    → Upload certificate → entra-app-new.cert.pem
#    NE PAS supprimer l'ancien tant que la rotation n'est pas validée

# 3. Mettre à jour Vault
docker exec mssp-vault vault kv patch mssp/platform \
  entra_cert_private_key="$(cat entra-app-new.key.pem)" \
  entra_cert_pem="$(cat entra-app-new.cert.pem)"

# 4. Redémarrer
docker compose restart platform

# 5. Valider (tester un audit ou refresh token)
# 6. Supprimer l'ancien certificat dans Azure Portal
# 7. Supprimer les fichiers locaux
rm entra-app-new.key.pem entra-app-new.cert.pem
```

***

## 3. Rotation certificat Entra ID (client)

Pour un client spécifique :

```bash theme={null}
CLIENT_SLUG="nom-client"

# 1. Générer le nouveau certificat
openssl req -x509 -newkey rsa:2048 \
  -keyout ${CLIENT_SLUG}.key.pem \
  -out ${CLIENT_SLUG}.cert.pem \
  -days 365 -nodes -subj "/CN=snakysec-${CLIENT_SLUG}"

# 2. Uploader dans le tenant client (Azure Portal)

# 3. Mettre à jour Vault
docker exec mssp-vault vault kv patch mssp/clients/${CLIENT_SLUG} \
  cert_private_key="$(cat ${CLIENT_SLUG}.key.pem)" \
  cert_pem="$(cat ${CLIENT_SLUG}.cert.pem)"

# 4. Vérifier avec un audit de test
# 5. Nettoyer
rm ${CLIENT_SLUG}.key.pem ${CLIENT_SLUG}.cert.pem
```

***

## 4. Rotation AUTH\_SECRET (NextAuth)

> Invalide toutes les sessions actives — prévoir une coupure courte.

```bash theme={null}
NEW_SECRET=$(openssl rand -base64 48)

# Mettre à jour .env ou Vault selon votre config
# Redémarrer la plateforme
docker compose restart platform

# Les utilisateurs devront se reconnecter
```

***

## 5. Rotation GitLab Token

```bash theme={null}
# 1. Générer un nouveau token GitLab (Project Access Token, scopes: api, read_repository)
# 2. Mettre à jour Vault
docker exec mssp-vault vault kv patch mssp/platform \
  gitlab_token="glpat-XXXX"

# 3. Mettre à jour le webhook secret si nécessaire
docker exec mssp-vault vault kv patch mssp/platform \
  gitlab_webhook_secret="$(openssl rand -hex 32)"

# 4. Redémarrer
docker compose restart platform
```

***

## Calendrier recommandé

| Secret                         | Fréquence                                    | Prochain |
| ------------------------------ | -------------------------------------------- | -------- |
| Certificats Entra (plateforme) | Annuel                                       | —        |
| Certificats Entra (clients)    | Annuel                                       | —        |
| ENCRYPTION\_KEY                | Tous les 2 ans ou si compromis               | —        |
| AUTH\_SECRET                   | Tous les 2 ans                               | —        |
| GitLab Token                   | Annuel                                       | —        |
| Vault Root Token               | Jamais utilisé en prod (unsealed via Shamir) | —        |
