Skip to content

DNSSEC: Validation & Key Management

Tại sao điều này quan trọng

DNSSEC = DNS-level cryptographic security. Prevent DNS spoofing, cache poisoning, man-in-the-middle.

When critical: High-security environments (banking, government, healthcare).

DNSSEC Fundamentals

What DNSSEC Does

Without DNSSEC:
  Client: DNS query: api.example.com
  Attacker intercepts: Returns 10.0.0.100 (malicious IP)
  Client: Trusts response (no verification)
  Result: Compromised!

With DNSSEC:
  Client: DNS query: api.example.com
  Attacker intercepts: Returns 10.0.0.100 (malicious IP) + bad signature
  Client: Verifies signature → FAILS
  Result: Query rejected (SERVFAIL), client uses fallback

DNSSEC Chain of Trust

Root Zone
  ├─ DNSKEY (root public key)
  ├─ DS records (child zone digests)
  
.com Zone
  ├─ DNSKEY (.com public key)
  ├─ RRSIG (signed by root)
  ├─ DS records (example.com digests)
  
example.com Zone
  ├─ DNSKEY (example.com public key)
  ├─ RRSIG (signed by .com)
  ├─ A records (api.example.com)
  ├─ RRSIG (A records signed)
  
Validation:
  1. Validate example.com DNSKEY using root trust anchor
  2. Validate example.com A records using example.com DNSKEY
  3. If all signatures valid → Response trusted

Cloud DNS DNSSEC Support

Enable DNSSEC

bash
# Create zone with DNSSEC
gcloud dns managed-zones create example-zone \
  --dns-name=example.com \
  --visibility=public \
  --dnssec-state on

# Or update existing zone
gcloud dns managed-zones update example-zone \
  --dnssec-state on

# Get DS records
gcloud dns managed-zones describe example-zone \
  --format="get(dnssecConfig.dsRecords[].dsData)"

Key Signing Procedure

  1. Cloud DNS automatically generates:

    • KSK (Key Signing Key) - private, never exported
    • ZSK (Zone Signing Key) - rotated by GCP
  2. DS records (Delegation Signer):

    • Provided by Cloud DNS
    • Upload to parent zone (domain registrar)
  3. Signing process:

    • Cloud DNS auto-signs all records
    • Signatures include in responses
    • TTL for signatures synchronized with records

GCP Cloud DNS DNSSEC Details

Automation

GCP handles:
  ✓ Key generation (KSK, ZSK)
  ✓ Record signing (RRSIG generation)
  ✓ Key rotation (automatic)
  ✓ Signature refresh (as TTL approaches)
  
You provide:
  ✓ DS records to registrar
  ✓ Monitor signing status
  ✓ Ensure chain of trust maintained

Monitoring DNSSEC Status

bash
# Check DNSSEC config
gcloud dns managed-zones describe example-zone \
  --format="get(dnssecConfig)"

# Test DNSSEC validation
dig api.example.com +dnssec

# Check signatures
dig api.example.com +dnssec +multi

# Validate chain of trust
dig example.com DNSKEY +dnssec

Operational Considerations

Challenge 1: DS Record Management

Procedure:
  1. Enable DNSSEC on Cloud DNS zone
  2. Get DS records
     gcloud dns managed-zones describe example-zone \
       --format="get(dnssecConfig.dsRecords)"
  3. Login to domain registrar
  4. Add DS records to .com zone delegation
  5. Wait 24-48 hours for propagation

If DS records not updated:
  → DNSSEC validation fails
  → Query returns SERVFAIL
  → Clients see service as unavailable

Challenge 2: Key Rotation

Cloud DNS automatically rotates ZSK (Zone Signing Key) every ~30 days.

During rotation:
  1. New ZSK generated
  2. Both old+new ZSK published (overlap period)
  3. Records signed with both keys
  4. Old KSK invalidated after period
  5. Clients transparently validate

Implication: No manual action needed, but monitor status.

Challenge 3: Migration to/from DNSSEC

Enabling DNSSEC:
  1. Enable on Cloud DNS
  2. Get DS records
  3. Add to registrar
  4. Wait 24-48h
  5. Test: dig +dnssec
  
Disabling DNSSEC:
  1. Remove DS records from registrar
  2. Wait 24-48h for propagation
  3. Disable on Cloud DNS
  4. Clients no longer validate

DNSSEC Validation

Client-Side Validation

Most clients (browsers, apps) don't validate DNSSEC. Validation typically happens at:

  • Recursive resolver (8.8.8.8)
  • Stub resolver with DNSSEC support (rare)
Query path:
  Pod → CoreDNS (no validation by default)
      → VPC Resolver (169.254.169.254, no validation)
      → Cloud DNS (no validation)
      → Public resolver (8.8.8.8, validates)

Enabling Validation in CoreDNS

corefile
.:53 {
    cache 30
    errors
    kubernetes cluster.local in-addr.arpa ip6.arpa {
      pods insecure
      fallthrough in-addr.arpa ip6.arpa
      ttl 30
    }
    
    # Enable DNSSEC validation
    dnssec {
      key file /etc/coredns/keys
    }
    
    forward . /etc/resolv.conf {
      max_concurrent 1000
    }
}

Troubleshooting

Issue 1: SERVFAIL After Enabling DNSSEC

bash
# Symptom: dig example.com +dnssec returns SERVFAIL

Debug:
  1. Check DNSSEC enabled
     gcloud dns managed-zones describe example-zone | grep dnssec
  
  2. Check DS records in registrar
     dig example.com DS
  
  3. Validate chain
     dig example.com +dnssec +trace
  
  4. Check propagation time (24-48h)
  
  5. If still failing: Contact registrar, ensure DS records correct

Issue 2: Signature Verification Failures

bash
# Test query
dig api.example.com +dnssec

# If BOGUS (signature invalid):
  1. Check if transitioning DNSSEC state
     Wait 48-72h, try again
  
  2. Check if zone misconfigured
     gcloud dns managed-zones describe
  
  3. Force re-signing
     gcloud dns managed-zones update --dnssec-state off
     (wait 1h)
     gcloud dns managed-zones update --dnssec-state on

Performance Impact

Latency

DNSSEC validation adds ~2-5ms per query.

With caching, impact minimal:
  First query: +5ms (validation)
  Cached queries: 0ms impact

CPU/Memory

Validation requires cryptographic operations:
  CPU spike: During signature verification (~0.1-1ms per query)
  Memory: DNSKEY stored in memory (~1KB per zone)
  
At scale (millions QPS): Consider caching resolver to offload

Best Practices

  1. Enable DNSSEC for production (especially public APIs)
  2. Upload DS records to registrar (critical step often missed)
  3. Monitor validation status (check regularly)
  4. Plan key rotation (automatic, but be aware)
  5. Test before production (ensure no SERVFAIL)
  6. Graceful migration (24-48h propagation time)
  7. Document DS records (for disaster recovery)

When NOT to Use DNSSEC

Cases where DNSSEC overhead not justified:

✗ Internal-only DNS (no need for public validation)
✗ High-frequency, latency-critical queries (5ms adds up at scale)
✗ Simple DNS setup (few zones, few records)
✗ Not compliance-required
✓ Use instead: VPN/mTLS for internal security

Cases where DNSSEC critical:

✓ Public APIs (customers access)
✓ Domain-critical (financial, healthcare)
✓ Compliance requirement (some frameworks)
✓ High-value target (worth cost)

References