# Document 5 : Opération DNS Fédérée ## L'Alliance Boréale **Version :** 1.0 **Date :** 23 octobre 2025 **Statut :** DRAFT - Validation requise par Cercle Technique **Prérequis :** `nomenclature_v2.md` (nommage et adressage) **Auteur :** Claude (profils #4 Architecte Réseau, #10 Auditeur Sécurité) **Licence :** CC-BY-SA 4.0 --- ## Table des Matières 1. [Introduction](#1-introduction) 2. [Principes de la Fédération DNS](#2-principes-de-la-fédération-dns) 3. [Architecture DNS Distribuée](#3-architecture-dns-distribuée) 4. [Standards Techniques Obligatoires](#4-standards-techniques-obligatoires) 5. [Processus de Délégation de Zones](#5-processus-de-délégation-de-zones) 6. [Niveaux de Service DNS](#6-niveaux-de-service-dns) 7. [Sécurité et Gestion des Incidents](#7-sécurité-et-gestion-des-incidents) 8. [Monitoring et Outils Mutualisés](#8-monitoring-et-outils-mutualisés) 9. [Retrait et Transition](#9-retrait-et-transition) 10. [Annexes](#10-annexes) --- ## 1. Introduction ### 1.1 Objectif de ce Document Ce document définit **comment les membres de L'Alliance Boréale opèrent et fédèrent leur infrastructure DNS**. Il couvre : - Les relations primaire/secondaire entre membres - Les standards techniques (AXFR, DNSSEC, TSIG) - Les processus de délégation de zones - La gestion collective des incidents DNS ### 1.2 Prérequis **Ce document s'appuie sur `nomenclature_v2.md`** pour : - Nommage des serveurs DNS (`dns-master.infra..alliance-boreale.ca`) - Plan d'adressage IP (10.0.2.0/24 pour DNS) - Structure des zones DNS fédérées **Lecture obligatoire** : `nomenclature_v2.md` avant de procéder. ### 1.3 Portée Ce document s'applique à **tous les membres actifs** de L'Alliance Boréale. Les membres en probation peuvent l'appliquer partiellement (DNSSEC optionnel). ### 1.4 Alignement avec les Valeurs **Autonomie :** Chaque membre gère ses zones de manière souveraine. **Résilience :** DNS secondaires mutuels entre pairs. **Standards ouverts :** RFCs DNS, DNSSEC, protocoles documentés. **Subsidiarité :** L'Alliance n'intervient que pour coordination minimale. --- ## 2. Principes de la Fédération DNS ### 2.1 Autonomie Locale **Chaque membre est autoritaire pour ses propres zones.** ``` czp.alliance-boreale.ca → Géré par Chezlepro nul.alliance-boreale.ca → Géré par Nuage Libre tli.alliance-boreale.ca → Géré par TechnoLibre ``` L'Alliance ne contrôle **aucun contenu** des zones membres. Elle coordonne uniquement : - Délégation depuis la zone parent (`alliance-boreale.ca`) - Standards techniques minimums (DNSSEC, AXFR) ### 2.2 Résilience par la Redondance **Minimum 2 serveurs DNS par membre.** Configuration type : ``` ns1.czp.alliance-boreale.ca → DNS Primaire (VMID 02001) ns2.czp.alliance-boreale.ca → DNS Secondaire (VMID 02002) ``` **Optionnel mais recommandé :** DNS secondaire croisé avec un autre membre. Exemple : ``` czp.alliance-boreale.ca: - ns1.czp.alliance-boreale.ca (primaire) - ns2.czp.alliance-boreale.ca (secondaire local) - ns1.nul.alliance-boreale.ca (secondaire croisé) ``` **Avantages :** - Résilience accrue (3 sites distincts) - Solidarité technique entre membres - Détection rapide de pannes (monitoring mutuel) ### 2.3 Standards Ouverts **L'Alliance privilégie exclusivement les standards RFC.** - RFC 1034/1035 : DNS de base - RFC 2136 : DNS UPDATE (optionnel) - RFC 4033-4035 : DNSSEC - RFC 5936 : AXFR - RFC 8945 : TSIG (authentification) **Aucune extension propriétaire** ne doit être requise pour interopérer. ### 2.4 Confiance Vérifiable **DNSSEC est obligatoire pour les zones critiques.** **Zones critiques :** - Zone racine membre (`czp.alliance-boreale.ca`) - Services d'infrastructure (`*.infra.czp.alliance-boreale.ca`) - Email (domaines avec enregistrements MX) **Zones optionnelles :** - Zones tenants (décision du membre) - Environnements dev/staging **Vérification :** DNSViz.net doit afficher une chaîne DNSSEC valide. --- ## 3. Architecture DNS Distribuée ### 3.1 Vue d'Ensemble ``` ┌─────────────────────────────────────────────────────────────┐ │ alliance-boreale.ca (Zone Parent) │ │ Géré par: Cercle Opérationnel │ │ Serveurs: ns1/ns2/ns3.alliance-boreale.ca │ └────────────┬────────────────────────────────────────────────┘ │ │ Délégations NS │ ┌───────┴────────┬─────────────┬──────────────┐ │ │ │ │ ┌────▼─────┐ ┌────▼─────┐ ┌───▼──────┐ ┌───▼──────┐ │ czp │ │ nul │ │ tli │ │ autres │ │ Zone │ │ Zone │ │ Zone │ │ membres │ └──────────┘ └──────────┘ └──────────┘ └──────────┘ ``` ### 3.2 Serveurs DNS Autoritaires **Minimum requis : 2 serveurs** **Configuration type (membre Chezlepro) :** | Serveur | VMID | IP Interne | IP Publique | Rôle | |---------|------|------------|-------------|------| | ns1.czp.alliance-boreale.ca | 02001 | 10.0.2.10 | 198.51.100.10 | Primaire (MASTER) | | ns2.czp.alliance-boreale.ca | 02002 | 10.0.2.11 | 198.51.100.11 | Secondaire (SLAVE) | **Recommandé : 3 serveurs (avec secondaire croisé)** | Serveur | Localisation | Rôle | |---------|--------------|------| | ns1.czp.alliance-boreale.ca | Datacenter Chezlepro | MASTER | | ns2.czp.alliance-boreale.ca | Datacenter Chezlepro | SLAVE | | ns1.nul.alliance-boreale.ca | Datacenter Nuage Libre | SLAVE (croisé) | ### 3.3 Relations Primaire/Secondaire **Architecture recommandée : Hub & Spoke modifié** ``` Membre A (czp) ├─ ns1.czp (MASTER) ├─ ns2.czp (SLAVE local) └─ ns1.nul (SLAVE croisé) ← AXFR depuis ns1.czp Membre B (nul) ├─ ns1.nul (MASTER) ├─ ns2.nul (SLAVE local) └─ ns1.tli (SLAVE croisé) ← AXFR depuis ns1.nul Membre C (tli) ├─ ns1.tli (MASTER) ├─ ns2.tli (SLAVE local) └─ ns1.czp (SLAVE croisé) ← AXFR depuis ns1.tli ``` **Avantages :** - Topologie en triangle (pas de point unique de défaillance) - Charge répartie (pas de "hub" central) - Latence réduite (géographiquement distribué) ### 3.4 Stratégies de Délégation de Zones **Principe : Délégation minimale nécessaire** **Zone parent (`alliance-boreale.ca`) :** ``` ; Délégation zone membre Chezlepro czp NS ns1.czp.alliance-boreale.ca. czp NS ns2.czp.alliance-boreale.ca. czp NS ns1.nul.alliance-boreale.ca. ; Secondaire croisé ns1.czp A 198.51.100.10 ns2.czp A 198.51.100.11 ns1.nul A 198.51.100.20 ; IP publique Nuage Libre ``` **Zone membre (`czp.alliance-boreale.ca`) :** ``` $ORIGIN czp.alliance-boreale.ca. ; SOA et NS @ SOA ns1.czp.alliance-boreale.ca. admin.czp.alliance-boreale.ca. ( 2025102301 ; Serial 3600 ; Refresh 1800 ; Retry 1209600 ; Expire 3600 ; Minimum TTL ) @ NS ns1.czp.alliance-boreale.ca. @ NS ns2.czp.alliance-boreale.ca. @ NS ns1.nul.alliance-boreale.ca. ; Sous-délégation infrastructure infra NS ns1.czp.alliance-boreale.ca. infra NS ns2.czp.alliance-boreale.ca. ``` **Pas de délégation récursive excessive.** Si un membre a besoin de sous-zones complexes, il les gère en interne (pas de nouvelle délégation depuis la zone parent). --- ## 4. Standards Techniques Obligatoires ### 4.1 Logiciel DNS Recommandé **Primaire : PowerDNS Authoritative Server** **Pourquoi PowerDNS ?** - Open source (GPLv2) - Backend SQL (PostgreSQL/MySQL) → auditable - DNSSEC natif - API REST (automatisation) - Support AXFR/NOTIFY robuste **Alternatives acceptées :** - BIND9 (si configuration validée par pair) - NSD (si DNSSEC géré manuellement) - Knot DNS **Inacceptable :** - DNS Windows Server (non open source) - Solutions cloud propriétaires sans AXFR (Route53, Cloudflare seul) ### 4.2 DNSSEC Obligatoire **Pour qui ?** - Membres actifs : **Obligatoire** pour zones critiques - Membres en probation : **Recommandé** (optionnel pendant probation) **Configuration minimale :** ```bash # Générer clés DNSSEC (PowerDNS) pdnsutil secure-zone czp.alliance-boreale.ca pdnsutil rectify-zone czp.alliance-boreale.ca # Vérifier pdnsutil check-zone czp.alliance-boreale.ca ``` **DS Records :** Le membre doit fournir ses DS records au Cercle Opérationnel pour insertion dans la zone parent. **Commande d'export :** ```bash pdnsutil show-zone czp.alliance-boreale.ca | grep DS ``` **Validation publique :** ```bash dig +dnssec czp.alliance-boreale.ca @8.8.8.8 # Doit afficher: flags: ad (Authenticated Data) ``` **Outil de validation :** DNSViz.net ### 4.3 AXFR Sécurisé **AXFR = Transfert de zone complet depuis primaire vers secondaires.** **Sécurité obligatoire :** 1. **ACL strictes** : Liste blanche des IPs autorisées 2. **TSIG** : Authentification cryptographique (recommandé) #### Configuration AXFR avec ACL (PowerDNS) **Sur le MASTER (ns1.czp) :** ```sql -- Table domainmetadata INSERT INTO domainmetadata (domain_id, kind, content) VALUES ( (SELECT id FROM domains WHERE name='czp.alliance-boreale.ca'), 'ALLOW-AXFR-FROM', '10.0.2.11' -- ns2.czp (secondaire local) ); INSERT INTO domainmetadata (domain_id, kind, content) VALUES ( (SELECT id FROM domains WHERE name='czp.alliance-boreale.ca'), 'ALLOW-AXFR-FROM', '198.51.100.20' -- ns1.nul (secondaire croisé) ); ``` **Sur le SLAVE (ns2.czp ou ns1.nul) :** ```conf # /etc/powerdns/pdns.conf slave=yes superslave=no ``` **Test AXFR :** ```bash dig @ns1.czp.alliance-boreale.ca czp.alliance-boreale.ca AXFR # Doit retourner toute la zone ``` #### Configuration AXFR avec TSIG (recommandé) **Générer clé TSIG :** ```bash tsig-keygen czp-nul-xfer > /etc/powerdns/tsig.key ``` **Contenu du fichier :** ``` key "czp-nul-xfer" { algorithm hmac-sha256; secret "Base64EncodedSecretHere=="; }; ``` **Configuration MASTER (ns1.czp) :** ```sql -- Ajouter TSIG key INSERT INTO tsigkeys (name, algorithm, secret) VALUES ('czp-nul-xfer', 'hmac-sha256', 'Base64EncodedSecretHere=='); -- Associer à la zone INSERT INTO domainmetadata (domain_id, kind, content) VALUES ( (SELECT id FROM domains WHERE name='czp.alliance-boreale.ca'), 'TSIG-ALLOW-AXFR', 'czp-nul-xfer' ); ``` **Configuration SLAVE (ns1.nul) :** ```conf # /etc/powerdns/pdns.conf (ajouter) include-dir=/etc/powerdns/tsig.d # /etc/powerdns/tsig.d/czp.conf zone "czp.alliance-boreale.ca" { type slave; masters { 198.51.100.10 key czp-nul-xfer; }; }; ``` **Test AXFR avec TSIG :** ```bash dig @ns1.czp.alliance-boreale.ca czp.alliance-boreale.ca AXFR -y hmac-sha256:czp-nul-xfer:Base64EncodedSecretHere== ``` ### 4.4 Notifications (NOTIFY) **RFC 1996 : DNS NOTIFY** Quand la zone primaire change, elle envoie un NOTIFY aux secondaires pour déclencher AXFR immédiat. **Configuration (PowerDNS) :** ```sql -- Activer NOTIFY vers secondaires INSERT INTO domainmetadata (domain_id, kind, content) VALUES ( (SELECT id FROM domains WHERE name='czp.alliance-boreale.ca'), 'ALSO-NOTIFY', '10.0.2.11' -- ns2.czp ); INSERT INTO domainmetadata (domain_id, kind, content) VALUES ( (SELECT id FROM domains WHERE name='czp.alliance-boreale.ca'), 'ALSO-NOTIFY', '198.51.100.20' -- ns1.nul (secondaire croisé) ); ``` **Vérification :** ```bash # Modifier un enregistrement sur MASTER # Vérifier logs SLAVE pour "NOTIFY received" tail -f /var/log/pdns.log | grep NOTIFY ``` ### 4.5 TTL Raisonnables **Équilibre cache / réactivité** **Recommandations :** | Type d'enregistrement | TTL Recommandé | Rationale | |----------------------|----------------|-----------| | SOA (minimum) | 3600s (1h) | Cache raisonnable | | NS | 86400s (24h) | Changent rarement | | A/AAAA (services) | 3600s (1h) | Migration possible | | A/AAAA (infra critique) | 1800s (30min) | Réactivité incidents | | MX | 3600s (1h) | Standard email | | TXT (SPF, DKIM) | 3600s (1h) | Changent occasionnellement | | CNAME | 3600s (1h) | Flexibilité | **À éviter :** - TTL < 300s (5min) : Charge excessive sur DNS - TTL > 86400s (24h) pour services : Lenteur migration/incident **Exception :** Pendant migration planifiée, réduire temporairement TTL à 300s, puis revenir à 3600s après. --- ## 5. Processus de Délégation de Zones ### 5.1 Demande de Délégation **Qui ?** Nouveau membre en onboarding (semaines 3-4) **Prérequis :** 1. ✅ Serveurs DNS configurés (ns1, ns2) 2. ✅ Zone membre créée localement 3. ✅ AXFR fonctionnel entre ns1 et ns2 4. ✅ IPs publiques stables et documentées 5. ✅ (Optionnel) DNSSEC activé et DS records disponibles **Procédure :** 1. **Soumettre demande via Matrix (#technique)** Template : ``` Demande de délégation DNS =========================== Membre : Chezlepro (czp) Zone demandée : czp.alliance-boreale.ca Parrain : Nuage Libre (nul) Serveurs NS : - ns1.czp.alliance-boreale.ca (198.51.100.10) - ns2.czp.alliance-boreale.ca (198.51.100.11) - ns1.nul.alliance-boreale.ca (198.51.100.20) [secondaire croisé] DNSSEC : Oui DS Records : (joint en annexe) Tests effectués : ✅ dig @ns1.czp.alliance-boreale.ca czp.alliance-boreale.ca SOA ✅ dig @ns2.czp.alliance-boreale.ca czp.alliance-boreale.ca SOA ✅ AXFR ns1 → ns2 fonctionnel ✅ DNSViz.net validé (si DNSSEC) Délai souhaité : 2025-10-28 ``` 2. **Validation technique par un pair** Un membre actif (idéalement le parrain) vérifie : - [ ] Résolution SOA sur ns1 et ns2 - [ ] AXFR fonctionne - [ ] DNSSEC valide (si activé) - [ ] Pas de conflit de nommage **Commandes de validation :** ```bash # Test SOA dig @198.51.100.10 czp.alliance-boreale.ca SOA +short # Test AXFR dig @198.51.100.10 czp.alliance-boreale.ca AXFR +short | wc -l # Test DNSSEC dig @198.51.100.10 czp.alliance-boreale.ca DNSKEY +dnssec # Validation DNSViz (manuel) # https://dnsviz.net/d/czp.alliance-boreale.ca/dnssec/ ``` 3. **Approbation Cercle Opérationnel** Vote de consentement (asynchrone, Matrix ou réunion). Critères : - Validation technique OK - Membre en règle (probation active) - Pas d'objection motivée **Délai** : 48-72h maximum 4. **Insertion dans zone parent** Membre du Cercle Opérationnel (rotation) effectue : ```bash # Éditer zone alliance-boreale.ca pdnsutil edit-zone alliance-boreale.ca # Ajouter délégation czp NS ns1.czp.alliance-boreale.ca. czp NS ns2.czp.alliance-boreale.ca. czp NS ns1.nul.alliance-boreale.ca. ns1.czp A 198.51.100.10 ns2.czp A 198.51.100.11 # Si DNSSEC activé, ajouter DS records czp DS 12345 13 2 (hash SHA256) # Incrémenter serial SOA pdnsutil increase-serial alliance-boreale.ca # Vérifier pdnsutil check-zone alliance-boreale.ca ``` 5. **Notification et tests publics** Post Matrix (#annonces) : ``` 🎉 Nouvelle délégation DNS : czp.alliance-boreale.ca Serveurs : ns1/ns2.czp.alliance-boreale.ca + ns1.nul (croisé) DNSSEC : Activé ✅ Tests publics bienvenus ! ``` **Tests publics (par tous) :** ```bash # Depuis n'importe où sur Internet dig czp.alliance-boreale.ca NS @8.8.8.8 dig mail.czp.alliance-boreale.ca A @8.8.8.8 dig +dnssec czp.alliance-boreale.ca @1.1.1.1 ``` ### 5.2 Enregistrement au Registraire Une fois la délégation active, mettre à jour le fichier YAML du membre. **Fichier : `registraire/membres/m001-chezlepro.yml`** ```yaml dns: primary: - name: ns1.czp.alliance-boreale.ca ip: 198.51.100.10 vmid: 02001 - name: ns2.czp.alliance-boreale.ca ip: 198.51.100.11 vmid: 02002 secondary_cross: - name: ns1.nul.alliance-boreale.ca ip: 198.51.100.20 member: nul zones_delegated: - czp.alliance-boreale.ca dnssec: true dnssec_ds_records: - "12345 13 2 ABC123..." last_delegation_date: "2025-10-28" validated_by: m002 # Parrain ou pair ``` ### 5.3 Propagation et Tests **Délai de propagation :** 24-48h (selon TTL des NS records parent) **Tests progressifs :** | Temps | Test | Commande | |-------|------|----------| | T+0 | Résolution depuis DNS autoritaires Alliance | `dig @ns1.alliance-boreale.ca czp.alliance-boreale.ca NS` | | T+1h | Résolution depuis Google DNS | `dig @8.8.8.8 czp.alliance-boreale.ca NS` | | T+24h | Résolution depuis Cloudflare | `dig @1.1.1.1 czp.alliance-boreale.ca NS` | | T+48h | Validation DNSSEC globale | DNSViz.net | --- ## 6. Niveaux de Service DNS ### 6.1 Disponibilité Cible **Membres actifs : ≥ 99.5% (uptime annuel)** Calcul : ``` 99.5% = 43.8 heures de downtime/an maximum = 3.65 heures/mois = ~50 minutes/semaine ``` **Mesure :** Monitoring Prometheus avec probe externe (Blackbox Exporter) **Exclusions (downtime justifié) :** - Maintenance planifiée (notifiée 48h à l'avance) - Incident majeur hors contrôle (DDoS massif, panne datacenter) ### 6.2 Temps de Réponse Acceptable **Requêtes DNS simples (A, AAAA, NS) :** - Médiane : < 50ms - P95 : < 100ms - P99 : < 200ms **Requêtes DNSSEC (avec validation) :** - Médiane : < 100ms - P95 : < 200ms - P99 : < 500ms **Mesure :** Prometheus `probe_duration_seconds` histogram ### 6.3 Maintenance Planifiée **Notification requise : 48h minimum** **Canaux de notification :** 1. Matrix #annonces 2. Status page (status.czp.alliance-boreale.ca) 3. Email liste membres (si critique) **Template notification :** ``` 🔧 Maintenance DNS planifiée Membre : Chezlepro (czp) Date : 2025-10-30 03:00-05:00 UTC Durée estimée : 2 heures Impact : Résolution DNS czp.alliance-boreale.ca (secondaires actifs : ns2.czp + ns1.nul) Services affectés : ns1.czp.alliance-boreale.ca (MASTER) Services maintenus : ns2.czp.alliance-boreale.ca (SLAVE) Raison : Migration serveur physique Contact : admin@chezlepro.tech ``` **Bonne pratique :** - Planifier entre 2h-6h du matin (heure locale) - Vérifier que secondaires sont opérationnels avant - Monitoring actif pendant maintenance ### 6.4 Gestion des Incidents DNS **Classification :** | Priorité | Définition | SLA Réponse | SLA Résolution | |----------|------------|-------------|----------------| | P0 | Tous DNS down (zone inaccessible) | 15 min | 2 heures | | P1 | DNS primaire down (secondaires OK) | 30 min | 4 heures | | P2 | Lenteur résolution (>500ms) | 1 heure | 8 heures | | P3 | Anomalie non critique | 4 heures | 24 heures | **Procédure incident :** 1. **Détection** - Monitoring Prometheus (AlertManager) - Rapport Matrix (#incidents) - Signalement utilisateur 2. **Notification** - Post Matrix #incidents immédiat - Mention @dns-oncall si configuré - Update status page 3. **Investigation** - Logs DNS serveur : `tail -f /var/log/pdns.log` - Métriques Grafana - Tests externes : `dig`, `nslookup` 4. **Résolution** - Corriger ou basculer sur secondaire - Valider résolution publique - Post Matrix résolution 5. **Post-Mortem (si P0/P1, >1h downtime)** - Documenter cause racine - Corrective actions - Publier sur wiki (transparence) **Template Post-Mortem :** ```markdown # Post-Mortem : Panne DNS czp.alliance-boreale.ca **Date :** 2025-10-25 **Durée :** 1h30 **Impact :** Résolution DNS czp.alliance-boreale.ca indisponible **Priorité :** P0 ## Chronologie - 14:23 UTC : Alerte Prometheus "DNS ns1.czp down" - 14:25 UTC : Confirmation manuelle (dig timeout) - 14:30 UTC : Basculement manuel vers ns2.czp - 14:45 UTC : Identification cause (OOM serveur ns1) - 15:20 UTC : Redémarrage ns1, AXFR sync OK - 15:53 UTC : Retour normal, monitoring OK ## Cause Racine Out-of-Memory sur ns1.czp (processus PowerDNS tué par OOM killer). Cause : Fuite mémoire dans module expérimental (dnsdist). ## Impact - Zone czp.alliance-boreale.ca inaccessible : 1h30 - Secondaire ns2.czp actif, mais non prioritaire dans délégation - ~50% requêtes timeouts (clients avec cache OK) ## Actions Correctives ✅ Désactivation dnsdist (immédiat) ✅ Augmentation RAM VM ns1 : 2GB → 4GB 🔄 Configuration monitoring OOM (en cours) 🔄 Rééquilibrage priorité NS (ns2 en premier) ## Leçons Apprises - Secondaires fonctionnent, mais délégation ordre NS critique - Besoin alerte proactive RAM/CPU (pas juste down/up) **Auteur :** admin@chezlepro.tech **Publié :** wiki.alliance-boreale.ca/postmortems/2025-10-25-dns-czp ``` --- ## 7. Sécurité et Gestion des Incidents ### 7.1 Protection contre DDoS **Couches de protection :** 1. **Firewall (iptables/nftables)** ```bash # Limiter requêtes DNS/sec par IP source iptables -A INPUT -p udp --dport 53 -m state --state NEW \ -m recent --set --name dns_limit iptables -A INPUT -p udp --dport 53 -m state --state NEW \ -m recent --update --seconds 1 --hitcount 20 --name dns_limit \ -j DROP ``` 2. **Rate Limiting PowerDNS** ```ini # /etc/powerdns/pdns.conf max-queue-length=5000 max-tcp-clients=128 max-tcp-per-client=5 # Limiter réponses NXDOMAIN (cache poisoning) max-cache-entries=1000000 negquery-cache-ttl=60 ``` 3. **Anycast (avancé, optionnel)** Si plusieurs membres dans régions distinctes, anycast BGP pour distribuer charge. **Note :** Complexe, recommandé seulement si >10 membres actifs. ### 7.2 Détection d'Anomalies **Monitoring Prometheus : Métriques clés** ```yaml # prometheus.yml (extrait) - job_name: 'dns-czp' static_configs: - targets: ['198.51.100.10:9153'] # PowerDNS Exporter metric_relabel_configs: - source_labels: [__name__] regex: 'pdns_(up|queries_total|latency_seconds.*)' action: keep ``` **Alertes AlertManager :** ```yaml groups: - name: dns rules: - alert: DNSDown expr: probe_success{job="dns"} == 0 for: 5m labels: severity: critical annotations: summary: "DNS {{ $labels.instance }} down" - alert: DNSSlowQueries expr: histogram_quantile(0.95, rate(pdns_latency_seconds_bucket[5m])) > 0.5 for: 10m labels: severity: warning annotations: summary: "DNS {{ $labels.instance }} slow (P95 > 500ms)" - alert: DNSHighQueryRate expr: rate(pdns_queries_total[5m]) > 1000 for: 5m labels: severity: warning annotations: summary: "DNS {{ $labels.instance }} high query rate (potential DDoS)" ``` ### 7.3 Réponse à Incident **Escalade :** 1. **Auto-détection (Prometheus) :** Post Matrix #incidents automatique 2. **Membre concerné** : Investigate (15-30 min) 3. **Si bloqué** : Demande support Matrix #support 4. **Si P0 non résolu <1h** : Escalade Cercle Opérationnel 5. **Si attaque coordonnée** : Communication collective (tous membres alertés) **Communication pendant incident :** ✅ **Faire :** - Updates régulières (toutes les 30 min si P0) - Être transparent sur cause (même si embarrassant) - Documenter actions prises ❌ **Éviter :** - Silence prolongé (anxiété collective) - Minimiser impact (crédibilité) - Blâmer outils/tiers sans preuve ### 7.4 Post-Mortem Obligatoire **Quand ?** - Tout incident P0 (zone complètement down) - Incident P1 > 1h (primaire down, même si secondaires OK) - Incident sécurité (compromission, DDoS majeur) **Délai :** 7 jours après résolution **Publication :** Wiki public (transparence) **Template :** Voir Section 6.4 --- ## 8. Monitoring et Outils Mutualisés ### 8.1 Tableau de Bord Partagé **Objectif :** Visibilité collective sur santé DNS de la fédération **Outil recommandé :** Grafana mutualisé (hébergé par un membre volontaire) **URL exemple :** `https://monitoring.alliance-boreale.ca/d/dns-federation` **Panels :** 1. **Statut Membres (heatmap)** - Vert : DNS UP (100%) - Jaune : Dégradé (secondaires OK, primaire down) - Rouge : DOWN complet 2. **Latence Résolution (par membre)** - Graphe timeseries P50/P95/P99 - Alerte visuelle si >200ms 3. **Volume Requêtes (stacked area)** - Requêtes/sec par membre - Détection pics anormaux 4. **DNSSEC Status** - Validation chain OK/KO - Expiration clés KSK/ZSK **Source données :** Prometheus federation ### 8.2 Alerting Inter-Pairs **Principe :** Un membre peut monitorer le DNS d'un autre (avec consentement) **Configuration Prometheus (membre A monitore membre B) :** ```yaml # prometheus.yml (membre A) scrape_configs: - job_name: 'dns-czp-external' metrics_path: '/probe' params: module: [dns_soa] target: ['czp.alliance-boreale.ca'] static_configs: - targets: - ns1.czp.alliance-boreale.ca - ns2.czp.alliance-boreale.ca relabel_configs: - source_labels: [__address__] target_label: __param_target - source_labels: [__param_target] target_label: instance - target_label: __address__ replacement: 127.0.0.1:9115 # Blackbox Exporter local ``` **Alertes envoyées à membre concerné :** ```yaml # alertmanager.yml route: receiver: 'matrix' routes: - match: job: 'dns-czp-external' receiver: 'matrix-czp' continue: true receivers: - name: 'matrix-czp' webhook_configs: - url: 'https://matrix.alliance-boreale.ca/webhook/czp-alerts' ``` ### 8.3 Tests Automatisés (DNS Probes) **Smokeping pour latence historique** ```bash # Installation apt install smokeping # Configuration ++ DNS-czp menu = DNS Chezlepro title = Latence DNS czp.alliance-boreale.ca probe = DNS host = ns1.czp.alliance-boreale.ca ++ DNS-nul menu = DNS Nuage Libre title = Latence DNS nul.alliance-boreale.ca probe = DNS host = ns1.nul.alliance-boreale.ca ``` **Healthchecks.io (optionnel)** Pour monitoring externe (hors infrastructure Alliance) : ```bash # Cron job teste DNS toutes les 5 min */5 * * * * dig @ns1.czp.alliance-boreale.ca czp.alliance-boreale.ca SOA +short > /dev/null && curl -fsS -m 10 --retry 5 https://hc-ping.com/UUID-czp-dns ``` **DNSViz automatisé** ```bash # Script hebdomadaire vérifie DNSSEC #!/bin/bash # /etc/cron.weekly/dnsviz-check ZONE="czp.alliance-boreale.ca" REPORT_URL="https://dnsviz.net/d/${ZONE}/dnssec/" curl -s "$REPORT_URL" | grep -q "No errors" if [ $? -eq 0 ]; then echo "✅ DNSSEC OK pour ${ZONE}" else echo "❌ DNSSEC ERREUR pour ${ZONE}" # Notification Matrix curl -X POST https://matrix.alliance-boreale.ca/webhook/dns-alerts \ -d "{\"zone\": \"${ZONE}\", \"status\": \"dnssec_error\", \"url\": \"${REPORT_URL}\"}" fi ``` --- ## 9. Retrait et Transition ### 9.1 Procédure de Retrait Propre **Cas 1 : Retrait volontaire d'un membre** **Étapes :** 1. **Notification préalable : 14 jours minimum** Post Matrix #annonces : ``` 📢 Notification de retrait Membre : Chezlepro (czp) Date effective : 2025-11-15 Zone concernée : czp.alliance-boreale.ca Transition planifiée : - Délégation DNS maintenue jusqu'au 2025-11-15 23:59 UTC - Après cette date, zone supprimée de alliance-boreale.ca - Secondaires croisés désactivés Contact pour questions : admin@chezlepro.tech ``` 2. **Migration des zones déléguées (si applicable)** Si d'autres membres utilisaient `*.czp.alliance-boreale.ca` : - Coordonner migration vers nouveau domaine - Délai suffisant (14 jours minimum) 3. **Désactivation progressive** | Jour | Action | |------|--------| | J-14 | Notification publique | | J-7 | Désactivation AXFR croisé vers autres membres | | J-3 | TTL réduits à 300s (préparation suppression) | | J-0 | Suppression enregistrements NS dans zone parent | | J+1 | Désactivation serveurs DNS membre | 4. **Nettoyage Registraire** ```yaml # registraire/membres/m001-chezlepro.yml status: withdrawn withdrawn_date: "2025-11-15" dns: status: deactivated last_active: "2025-11-15" ``` **Cas 2 : Retrait forcé (non-conformité grave)** **Cas exceptionnels :** - Compromission sécurité non résolue (>30 jours) - Violation répétée standards techniques - Indisponibilité prolongée (>99% downtime sur 3 mois) **Procédure :** 1. Décision Cercle Éthique & Conformité (vote consentement) 2. Notification membre concerné (7 jours pour remédiation) 3. Si non-remédiation : Retrait forcé (délégation supprimée sous 48h) 4. Communication publique (transparence, mais sans humiliation) ### 9.2 Délais de Préavis | Type de retrait | Préavis | Rationale | |----------------|---------|-----------| | Volontaire (membre actif) | 14 jours | Temps migration utilisateurs | | Volontaire (membre probation) | 7 jours | Moins d'impact | | Forcé (sécurité) | 48h | Urgence | | Forcé (non-conformité) | 7 jours | Chance remédiation | ### 9.3 Archivage des Configurations **Responsabilité : Membre sortant** **À conserver (membre) :** - Export complet zone DNS (AXFR dump) - Configuration serveurs (PowerDNS, BIND) - Clés DNSSEC (backup sécurisé) - Logs incidents (6 derniers mois minimum) **À fournir (Alliance) :** - Post-mortem si applicable - Documentation leçons apprises - Playbooks Ansible (si contribués) **Responsabilité : Alliance** **À archiver (Registraire) :** - Fiche membre (status: withdrawn) - Historique labels - Contributions (timebank, audits) - Décisions liées au membre **Rétention :** 5 ans (conformité juridique OBNL) --- ## 10. Annexes ### Annexe A : Checklist Onboarding DNS **Pour nouveau membre :** - [ ] Serveurs DNS installés (ns1, ns2 minimum) - [ ] Zone créée localement (`[slug].alliance-boreale.ca`) - [ ] SOA configuré (serial, refresh, retry, expire, minimum) - [ ] NS records configurés - [ ] AXFR fonctionnel ns1 → ns2 - [ ] IPs publiques stables et documentées - [ ] Firewall configuré (port 53 UDP/TCP ouvert) - [ ] (Optionnel) DNSSEC activé + DS records générés - [ ] (Optionnel) TSIG configuré pour AXFR - [ ] Tests résolution locale réussis - [ ] Demande délégation soumise Matrix - [ ] Validation technique par pair - [ ] Délégation active dans zone parent - [ ] Tests résolution publique réussis - [ ] Enregistrement Registraire mis à jour ### Annexe B : Commandes de Diagnostic **Test résolution depuis Internet :** ```bash dig @8.8.8.8 czp.alliance-boreale.ca NS dig @1.1.1.1 mail.czp.alliance-boreale.ca A ``` **Test AXFR (depuis serveur autorisé) :** ```bash dig @ns1.czp.alliance-boreale.ca czp.alliance-boreale.ca AXFR ``` **Test DNSSEC :** ```bash dig +dnssec @8.8.8.8 czp.alliance-boreale.ca SOA delv @8.8.8.8 czp.alliance-boreale.ca SOA ``` **Vérification chaîne DNSSEC :** ```bash drill -TD czp.alliance-boreale.ca @8.8.8.8 ``` **Test latence :** ```bash time dig @ns1.czp.alliance-boreale.ca czp.alliance-boreale.ca SOA +short ``` **Vérification propagation globale :** ```bash # Tool: whatsmydns.net # https://www.whatsmydns.net/#A/mail.czp.alliance-boreale.ca ``` ### Annexe C : Configuration PowerDNS Référence **Installation (Debian/Ubuntu) :** ```bash apt update apt install pdns-server pdns-backend-pgsql postgresql ``` **Configuration minimale (`/etc/powerdns/pdns.conf`) :** ```ini launch=gpgsql gpgsql-host=/var/run/postgresql gpgsql-dbname=powerdns gpgsql-user=pdns gpgsql-password=SecurePasswordHere local-address=0.0.0.0 local-port=53 master=yes slave=yes api=yes api-key=SecureAPIKeyHere webserver=yes webserver-address=0.0.0.0 webserver-port=8081 webserver-allow-from=10.0.0.0/8 dnssec=yes default-soa-content=ns1.@ admin.@ 0 3600 1800 1209600 3600 log-dns-queries=no log-dns-details=yes loglevel=4 ``` **Création base de données :** ```bash sudo -u postgres createdb powerdns sudo -u postgres createuser pdns sudo -u postgres psql powerdns < /usr/share/doc/pdns-backend-pgsql/schema.pgsql.sql ``` **Création zone :** ```bash pdnsutil create-zone czp.alliance-boreale.ca pdnsutil add-record czp.alliance-boreale.ca @ NS ns1.czp.alliance-boreale.ca pdnsutil add-record czp.alliance-boreale.ca @ NS ns2.czp.alliance-boreale.ca pdnsutil add-record czp.alliance-boreale.ca ns1 A 198.51.100.10 pdnsutil add-record czp.alliance-boreale.ca ns2 A 198.51.100.11 ``` **Activation DNSSEC :** ```bash pdnsutil secure-zone czp.alliance-boreale.ca pdnsutil set-nsec3 czp.alliance-boreale.ca '1 0 10 ab' narrow pdnsutil rectify-zone czp.alliance-boreale.ca ``` **Export DS records :** ```bash pdnsutil show-zone czp.alliance-boreale.ca | grep DS ``` ### Annexe D : Glossaire | Terme | Définition | |-------|------------| | **AXFR** | Transfert complet de zone DNS depuis primaire vers secondaires | | **DS Record** | Delegation Signer - Lie zone enfant DNSSEC à zone parent | | **KSK** | Key Signing Key - Clé maître DNSSEC (signe ZSK) | | **NOTIFY** | Notification envoyée par primaire aux secondaires lors de changement | | **SOA** | Start of Authority - Enregistrement définissant zone autoritaire | | **TSIG** | Transaction Signature - Authentification cryptographique AXFR | | **ZSK** | Zone Signing Key - Clé DNSSEC qui signe les enregistrements | ### Annexe E : Références **RFCs :** - RFC 1034, 1035 : DNS (Domain Name System) - RFC 1996 : DNS NOTIFY - RFC 2136 : DNS UPDATE - RFC 4033-4035 : DNSSEC - RFC 5936 : AXFR - RFC 8945 : TSIG **Documentation PowerDNS :** - https://doc.powerdns.com/authoritative/ - https://doc.powerdns.com/authoritative/dnssec/ **Outils de validation :** - DNSViz : https://dnsviz.net - Zonemaster : https://zonemaster.net - IntoDNS : https://intodns.com **Monitoring :** - PowerDNS Exporter : https://github.com/janeczku/powerdns_exporter - Blackbox Exporter : https://github.com/prometheus/blackbox_exporter --- ## MÉTADONNÉES **Document :** 05_Operation_DNS_Federee.md **Version :** 1.0 **Date de création :** 23 octobre 2025 **Auteur :** Claude (profils #4 Architecte Réseau, #10 Auditeur Sécurité) **Révision par :** Cercle Technique **Statut :** DRAFT - À valider **Longueur :** ~10 000 mots (20 pages) **Licence :** CC BY-SA 4.0 **Sources utilisées :** - `00_Glossaire_et_Definitions.md` (AXFR, DNSSEC, DNS autoritaire) - `nomenclature_v2.md` (nommage serveurs DNS, adressage IP) - `devis_alliance_boreale_v2.md` (structure Document 5) - `08_Processus_Onboarding_Membres.md` (critères DNS onboarding) - `01_Charte_Fondatrice_v2_1.md` (Couche 2, valeurs) **Prochaine révision prévue :** Avril 2026 (après 6 mois d'opération) --- **Changelog :** - 2025-10-23 v1.0 : Création initiale Document 5 (Option B) --- **FIN DE L'OPÉRATION DNS FÉDÉRÉE** *"Chaque membre gère ses propres zones. Ensemble, nous assurons leur résilience."* 🌲 **L'Alliance Boréale** *DNS fédéré, autonomie locale, résilience collective.*