> ## 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.

# 09 restore dns

# Runbook 09 — Restauration zone DNS snakysec.com

## 1. Quand activer

| Scénario                                                     | Activer ?                                 |
| ------------------------------------------------------------ | ----------------------------------------- |
| Records DNS supprimés accidentellement (OVH UI manipulation) | **OUI**                                   |
| Domaine entier injoignable (records corrompus côté OVH)      | **OUI**                                   |
| Migration vers un autre registrar (cas hors-DR)              | OUI mode contrôlé                         |
| Sous-domaine client absent post-onboarding                   | **NON** (re-créer le record manuellement) |

## 2. Objectifs

* **RPO** : 30 jours (export mensuel BIND zone)
* **RTO cible** : 1 heure (incl. propagation TTL)

## 3. Source de récupération

L'export mensuel de la zone est dans `artifacts/dns-zones/snakysec.com.<YYYY-MM>.bind`.
Backupé dans le restic OVH+Scaleway artifacts (cf. [03-backup-strategy.md §4.4](../03-backup-strategy.md)).

## 4. Procédure

### 4.1 Récupérer l'export le plus récent

```bash theme={null}
make dr-shell

# Localiser le dernier export
ls -la /artifacts/dns-zones/snakysec.com.*.bind | tail -3

# Si pas dispo localement (volume HS), restorer depuis backup
/dr/restore/artifacts-restore.sh \
  --include="/artifacts/dns-zones/**" \
  --target-dir="/dr-runtime/dns-restore"
```

### 4.2 Inspection du fichier zone

```bash theme={null}
cat /artifacts/dns-zones/snakysec.com.2026-04.bind
```

Format BIND standard :

```
$ORIGIN snakysec.com.
$TTL 3600
@                IN SOA  dns.ovh.net. tech.ovh.net. (
                          2026042601  ; Serial
                          86400       ; Refresh
                          3600        ; Retry
                          3600000     ; Expire
                          300 )       ; Minimum
@                IN NS   dns.ovh.net.
@                IN NS   ns.ovh.net.
@                IN A    51.91.X.Y
*                IN A    51.91.X.Y
www              IN CNAME snakysec.com.
openproject      IN A    51.91.X.Y
status           IN A    51.91.X.Y
@                IN MX   1 mx1.mail.ovh.net.
@                IN TXT  "v=spf1 include:_spf.snakysec.com -all"
_dmarc           IN TXT  "v=DMARC1; p=quarantine; rua=mailto:dmarc@snakysec.com"
default._domainkey IN TXT "v=DKIM1; k=rsa; p=..."
```

### 4.3 Re-import via OVH UI (rapide, manuel)

```
1. Login manager.ovh.com
2. Domaines → snakysec.com → DNS Zone
3. Cliquer "Modify zone in expert mode"
4. Copier-coller le contenu du fichier .bind dans le textarea
5. Vérifier les records contre la liste affichée précédemment
6. Apply
7. OVH propage en ~5 minutes
```

### 4.4 Re-import via OVH API (automatisable)

```bash theme={null}
# Depuis dr-runner (a curl + creds OVH API)
make dr-shell

# Lire les credentials OVH API depuis Vault
vault_export_dr_credentials_for_dns_restore() {
  OVH_APP_KEY=$(vault_read_dr ovh_api_app_key)
  OVH_APP_SECRET=$(vault_read_dr ovh_api_app_secret)
  OVH_CONSUMER_KEY=$(vault_read_dr ovh_api_consumer_key)
}
vault_export_dr_credentials_for_dns_restore

# Lire le fichier zone
ZONE_CONTENT=$(cat /artifacts/dns-zones/snakysec.com.2026-04.bind)

# POST le contenu via API (endpoint /domain/zone/<domain>/import)
TIMESTAMP=$(date +%s)
URL="https://eu.api.ovh.com/1.0/domain/zone/snakysec.com/import"
BODY="{\"zoneFile\":$(echo "${ZONE_CONTENT}" | jq -Rs .)}"
SIGNATURE=$(echo -n "${OVH_APP_SECRET}+${OVH_CONSUMER_KEY}+POST+${URL}+${BODY}+${TIMESTAMP}" | sha1sum | awk '{print "$1$" $1}')

curl -X POST \
  -H "X-Ovh-Application: ${OVH_APP_KEY}" \
  -H "X-Ovh-Consumer: ${OVH_CONSUMER_KEY}" \
  -H "X-Ovh-Timestamp: ${TIMESTAMP}" \
  -H "X-Ovh-Signature: ${SIGNATURE}" \
  -H "Content-Type: application/json" \
  -d "${BODY}" \
  "${URL}"
```

⚠️ **Attention** : `/domain/zone/<domain>/import` REMPLACE entièrement la
zone. Les records ajoutés depuis le dernier export mensuel seront perdus.
Privilégier la version manuelle si on a besoin de précision.

### 4.5 Validation

```bash theme={null}
# Wait propagation TTL (300s)
sleep 60

# Test depuis une résolution externe (Google DNS)
dig @8.8.8.8 snakysec.com +short
# attendu : <NEW_VPS_IP>

dig @8.8.8.8 *.snakysec.com +short
# attendu : <NEW_VPS_IP>

dig @8.8.8.8 snakysec.com TXT +short
# attendu : SPF, DMARC, DKIM records visibles
```

## 5. Communication client

Si la zone DNS a été corrompue, les emails sortants peuvent être bloqués
(SPF/DMARC fail). Ne pas envoyer d'email tant que validation §4.5 OK.

```
Suite à un incident de configuration DNS, certains accès à snakysec.com ont
pu être interrompus pendant N minutes. La situation est rétablie. Pour les
sous-domaines clients (votre-tenant.snakysec.com), vérifiez l'accès et
contactez-nous immédiatement si problème persistant.
```

## 6. Erreurs courantes

| Erreur                                        | Solution                                                     |
| --------------------------------------------- | ------------------------------------------------------------ |
| OVH API : "Invalid signature"                 | Vérifier que TIMESTAMP est en secondes Unix UTC, pas en ms   |
| Records visibles dans OVH UI mais pas résolus | Wait propagation TTL (5-30 min)                              |
| Sous-domaine client manquant après import     | Le record n'était pas dans l'export, à re-créer manuellement |
| MX records cassés (emails sortants en panne)  | Re-vérifier MX + SPF + DKIM dans la zone                     |

| Version | Date       | Auteur             |
| ------- | ---------- | ------------------ |
| 1.0     | 2026-04-26 | Nicolas Schiffgens |
