SiamCafe.net Blog
Cybersecurity

mTLS Service Mesh CDN Configuration End-to-End Encryption สำหรับ Microservices

mtls service mesh cdn configuration
mTLS Service Mesh CDN Configuration | SiamCafe Blog
2026-03-23· อ. บอม — SiamCafe.net· 1,257 คำ

mTLS ????????? Service Mesh ????????? CDN ?????????????????????

mTLS (Mutual TLS) ????????? TLS ????????????????????? client ????????? server ???????????????????????????????????????????????????????????????????????????????????? certificates ????????????????????? TLS ???????????????????????????????????? server ????????????????????????????????? Service Mesh ???????????? Istio, Linkerd ?????????????????? mTLS ????????????????????? microservices ??????????????????????????? CDN ???????????? Cloudflare, AWS CloudFront ??????????????????????????? cache ????????? deliver content ???????????? users

?????????????????????????????? ???????????????????????? CDN ????????????????????? Service Mesh ??????????????? mTLS CDN terminate TLS ????????? client ???????????????????????? establish connection ??????????????????????????? origin ????????? origin ???????????????????????? service mesh ??????????????????????????? mTLS CDN ???????????? present client certificate ????????? origin ???????????? ????????????????????????????????? connection ??????????????? reject

??????????????????????????? deploy Client ??? CDN (TLS) ??? Origin/Ingress (mTLS) ??? Service Mesh (mTLS) ??? Backend Services ???????????????????????????????????? configure certificates ??????????????????????????????

????????????????????? Istio Service Mesh ????????? mTLS

Configure Istio ?????????????????? mTLS enforcement

# === Istio mTLS Configuration ===

# 1. Install Istio with mTLS enabled
istioctl install --set profile=default \
  --set meshConfig.defaultConfig.holdApplicationUntilProxyStarts=true

# 2. Enable namespace injection
kubectl label namespace production istio-injection=enabled

# 3. Strict mTLS Policy (namespace-level)
cat > istio/peer-authentication.yaml << 'EOF'
apiVersion: security.istio.io/v1beta1
kind: PeerAuthentication
metadata:
  name: default
  namespace: production
spec:
  mtls:
    mode: STRICT
---
# Allow plaintext for health checks from CDN/LB
apiVersion: security.istio.io/v1beta1
kind: PeerAuthentication
metadata:
  name: ingress-gateway-mtls
  namespace: istio-system
spec:
  selector:
    matchLabels:
      istio: ingressgateway
  mtls:
    mode: PERMISSIVE
  portLevelMtls:
    8443:
      mode: STRICT
EOF

# 4. Destination Rule for mTLS
cat > istio/destination-rule.yaml << 'EOF'
apiVersion: networking.istio.io/v1beta1
kind: DestinationRule
metadata:
  name: default
  namespace: production
spec:
  host: "*.production.svc.cluster.local"
  trafficPolicy:
    tls:
      mode: ISTIO_MUTUAL
---
# Origin TLS for CDN connection
apiVersion: networking.istio.io/v1beta1
kind: DestinationRule
metadata:
  name: cdn-origin
  namespace: istio-system
spec:
  host: "api.example.com"
  trafficPolicy:
    tls:
      mode: MUTUAL
      clientCertificate: /etc/certs/cdn/client.pem
      privateKey: /etc/certs/cdn/client-key.pem
      caCertificates: /etc/certs/cdn/ca.pem
EOF

# 5. Gateway for CDN origin
cat > istio/gateway.yaml << 'EOF'
apiVersion: networking.istio.io/v1beta1
kind: Gateway
metadata:
  name: cdn-origin-gateway
  namespace: istio-system
spec:
  selector:
    istio: ingressgateway
  servers:
    - port:
        number: 443
        name: https
        protocol: HTTPS
      tls:
        mode: MUTUAL
        credentialName: origin-tls-cert
      hosts:
        - "api.example.com"
EOF

kubectl apply -f istio/
echo "Istio mTLS configured"

CDN Configuration ????????? Origin mTLS

????????????????????? CDN ??????????????????????????? origin ???????????? mTLS

# === CDN Origin mTLS Configuration ===

# 1. Cloudflare Authenticated Origin Pulls
cat > cloudflare_config.sh << 'BASH'
#!/bin/bash
CF_API_KEY=""
CF_EMAIL=""
ZONE_ID=""

# Enable Authenticated Origin Pulls (mTLS to origin)
curl -X PATCH "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/settings/tls_client_auth" \
  -H "X-Auth-Email: $CF_EMAIL" \
  -H "X-Auth-Key: $CF_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"value":"on"}'

# Upload custom client certificate for origin
curl -X POST "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/origin_tls_client_auth" \
  -H "X-Auth-Email: $CF_EMAIL" \
  -H "X-Auth-Key: $CF_API_KEY" \
  -F "certificate=@origin-client-cert.pem" \
  -F "private_key=@origin-client-key.pem"

echo "Cloudflare mTLS to origin configured"
BASH

# 2. AWS CloudFront with Origin mTLS (via ALB)
cat > cloudfront_config.json << 'EOF'
{
  "DistributionConfig": {
    "Origins": {
      "Items": [
        {
          "Id": "api-origin",
          "DomainName": "origin.example.com",
          "CustomOriginConfig": {
            "HTTPPort": 80,
            "HTTPSPort": 443,
            "OriginProtocolPolicy": "https-only",
            "OriginSslProtocols": {
              "Items": ["TLSv1.2"],
              "Quantity": 1
            }
          },
          "OriginShield": {
            "Enabled": true,
            "OriginShieldRegion": "ap-southeast-1"
          }
        }
      ]
    },
    "ViewerCertificate": {
      "AcmCertificateArn": "arn:aws:acm:us-east-1:123456:certificate/abc-123",
      "SslSupportMethod": "sni-only",
      "MinimumProtocolVersion": "TLSv1.2_2021"
    },
    "DefaultCacheBehavior": {
      "ViewerProtocolPolicy": "redirect-to-https",
      "AllowedMethods": ["GET", "HEAD", "OPTIONS", "PUT", "POST", "PATCH", "DELETE"],
      "ForwardedValues": {
        "Headers": ["Authorization", "Host"]
      }
    }
  }
}
EOF

# 3. Nginx origin server with client cert verification
cat > nginx/origin-mtls.conf << 'EOF'
server {
    listen 443 ssl;
    server_name origin.example.com;

    # Server certificate
    ssl_certificate /etc/nginx/certs/server.pem;
    ssl_certificate_key /etc/nginx/certs/server-key.pem;

    # Client certificate verification (mTLS)
    ssl_client_certificate /etc/nginx/certs/cloudflare-ca.pem;
    ssl_verify_client on;
    ssl_verify_depth 2;

    # TLS settings
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers on;

    # Reject if no valid client cert
    if ($ssl_client_verify != SUCCESS) {
        return 403;
    }

    # Pass client cert info to upstream
    location / {
        proxy_pass http://istio-ingressgateway:8080;
        proxy_set_header X-Client-Cert-DN $ssl_client_s_dn;
        proxy_set_header X-Client-Cert-Verify $ssl_client_verify;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto https;
    }
}
EOF

echo "CDN origin mTLS configured"

End-to-End Encryption Architecture

??????????????? architecture ???????????????????????????????????????????????????

#!/usr/bin/env python3
# e2e_encryption.py ??? End-to-End Encryption Architecture
import json
import logging
from typing import Dict, List

logging.basicConfig(level=logging.INFO)
logger = logging.getLogger("e2e")

class E2EEncryptionArchitecture:
    def __init__(self):
        pass
    
    def architecture_layers(self):
        return {
            "layer_1_client_to_cdn": {
                "protocol": "TLS 1.3",
                "certificate": "Public CA (Let's Encrypt / DigiCert)",
                "cdn_provider": "Cloudflare / CloudFront",
                "features": [
                    "DDoS protection",
                    "WAF rules",
                    "Rate limiting",
                    "Bot management",
                    "Edge caching",
                ],
            },
            "layer_2_cdn_to_origin": {
                "protocol": "mTLS",
                "certificate": "Cloudflare Origin CA / Custom CA",
                "verification": "Both CDN and origin verify each other",
                "features": [
                    "Authenticated Origin Pulls",
                    "Origin Shield (reduce origin load)",
                    "Custom client certificates",
                ],
            },
            "layer_3_ingress_to_mesh": {
                "protocol": "mTLS (Istio/Linkerd)",
                "certificate": "Istio CA (citadel) auto-generated",
                "rotation": "Automatic every 24 hours",
                "features": [
                    "Zero-trust networking",
                    "SPIFFE identity",
                    "Authorization policies",
                    "Traffic encryption",
                ],
            },
            "layer_4_service_to_service": {
                "protocol": "mTLS (automatic via sidecar)",
                "certificate": "Istio workload certificates",
                "rotation": "Automatic",
                "features": [
                    "Transparent to application",
                    "No code changes needed",
                    "Per-service identity",
                    "Fine-grained access control",
                ],
            },
            "layer_5_service_to_datastore": {
                "protocol": "TLS 1.2+ / mTLS",
                "certificate": "Database server cert + client cert",
                "examples": [
                    "PostgreSQL: sslmode=verify-full",
                    "Redis: TLS with client auth",
                    "Elasticsearch: xpack.security.transport.ssl",
                ],
            },
        }
    
    def security_checklist(self):
        return {
            "certificates": [
                "All certificates use RSA 2048+ or ECDSA P-256",
                "No self-signed certs in production",
                "Certificate pinning for mobile apps",
                "HSTS enabled with max-age 1 year",
            ],
            "tls_config": [
                "Minimum TLS 1.2",
                "Disable weak ciphers (RC4, DES, 3DES)",
                "Enable OCSP stapling",
                "Certificate Transparency logs",
            ],
            "monitoring": [
                "Certificate expiry alerts (30, 14, 7 days)",
                "TLS handshake error monitoring",
                "mTLS authorization failure alerts",
                "Certificate rotation audit logs",
            ],
        }

arch = E2EEncryptionArchitecture()
layers = arch.architecture_layers()
print("End-to-End Encryption Layers:")
for name, info in layers.items():
    print(f"\n  {name}:")
    print(f"    Protocol: {info['protocol']}")
    print(f"    Certificate: {info['certificate']}")

checklist = arch.security_checklist()
print("\nSecurity Checklist:")
for category, items in checklist.items():
    print(f"  {category}:")
    for item in items:
        print(f"    - {item}")

Troubleshooting ????????? Debugging

???????????????????????? mTLS ????????? CDN

# === mTLS Troubleshooting ===

# 1. Test mTLS connection
cat > test_mtls.sh << 'BASH'
#!/bin/bash
# Test server certificate
echo | openssl s_client -servername api.example.com \
  -connect api.example.com:443 2>/dev/null | \
  openssl x509 -noout -subject -issuer -dates

# Test mTLS with client certificate
curl -v --cert client.pem --key client-key.pem \
  --cacert ca.pem https://origin.example.com/health

# Test Istio mTLS
istioctl authn tls-check default.production

# Check Istio proxy status
istioctl proxy-status

# Debug Istio sidecar
kubectl exec -it deploy/my-app -c istio-proxy -- \
  openssl s_client -connect other-service:443 \
  -cert /etc/certs/cert-chain.pem \
  -key /etc/certs/key.pem \
  -CAfile /etc/certs/root-cert.pem
BASH

# 2. Common Issues and Fixes
cat > troubleshooting.yaml << 'EOF'
common_issues:
  cdn_503_error:
    symptom: "CDN returns 503 when connecting to origin"
    cause: "Origin rejects CDN connection (missing client cert)"
    fix:
      - "Enable Authenticated Origin Pulls in CDN"
      - "Upload correct client certificate to CDN"
      - "Verify origin trusts CDN CA certificate"
      - "Check Nginx ssl_client_certificate path"
    debug: "curl -v --cert cdn-client.pem --key cdn-key.pem https://origin"

  istio_connection_refused:
    symptom: "503 Upstream connect error or disconnect/reset"
    cause: "mTLS mode mismatch (STRICT vs PERMISSIVE)"
    fix:
      - "Check PeerAuthentication mode"
      - "Ensure sidecar is injected (istio-proxy container exists)"
      - "Use PERMISSIVE for ingress gateway"
    debug: "istioctl authn tls-check ."

  certificate_expired:
    symptom: "TLS handshake failure, certificate has expired"
    cause: "Certificate not renewed before expiry"
    fix:
      - "Renew certificate (certbot renew)"
      - "Update Kubernetes secret"
      - "Restart pods to pick up new cert"
    prevention: "Use cert-manager with auto-renewal"

  cert_chain_incomplete:
    symptom: "unable to verify the first certificate"
    cause: "Missing intermediate CA in certificate chain"
    fix:
      - "Include full chain: server cert + intermediate CA"
      - "openssl verify -CAfile ca.pem -untrusted intermediate.pem server.pem"
    debug: "openssl s_client -showcerts -connect host:443"
EOF

echo "Troubleshooting guide ready"

Monitoring ????????? Security Auditing

???????????????????????????????????????????????? mTLS

#!/usr/bin/env python3
# mtls_monitor.py ??? mTLS Monitoring and Auditing
import json
import logging
from typing import Dict, List

logging.basicConfig(level=logging.INFO)
logger = logging.getLogger("monitor")

class MTLSMonitor:
    def __init__(self):
        pass
    
    def metrics(self):
        return {
            "tls_metrics": {
                "handshake_success_total": 125000,
                "handshake_failure_total": 23,
                "failure_rate": "0.018%",
                "avg_handshake_ms": 12.5,
                "p99_handshake_ms": 45.2,
            },
            "certificate_status": [
                {"name": "cdn-origin-cert", "expires_in": "45 days", "status": "OK"},
                {"name": "istio-gateway-cert", "expires_in": "23 hours", "status": "AUTO_RENEW"},
                {"name": "api-server-cert", "expires_in": "89 days", "status": "OK"},
                {"name": "db-client-cert", "expires_in": "12 days", "status": "WARNING"},
            ],
            "mtls_auth_failures": {
                "last_24h": 15,
                "top_sources": [
                    {"ip": "10.0.5.23", "count": 8, "reason": "no client certificate"},
                    {"ip": "10.0.3.11", "count": 5, "reason": "certificate expired"},
                    {"ip": "192.168.1.50", "count": 2, "reason": "unknown CA"},
                ],
            },
            "protocol_distribution": {
                "TLS_1.3": "78%",
                "TLS_1.2": "22%",
                "TLS_1.1": "0% (disabled)",
                "TLS_1.0": "0% (disabled)",
            },
        }
    
    def audit_report(self):
        return {
            "compliance": {
                "all_services_mtls": True,
                "no_plaintext_traffic": True,
                "min_tls_1_2": True,
                "cert_auto_rotation": True,
                "cert_expiry_monitoring": True,
            },
            "findings": [
                {"severity": "LOW", "finding": "1 service using TLS 1.2 instead of 1.3", "recommendation": "Upgrade client library"},
                {"severity": "MEDIUM", "finding": "db-client-cert expires in 12 days", "recommendation": "Renew certificate immediately"},
            ],
            "score": "95/100 ??? Excellent",
        }

monitor = MTLSMonitor()
data = monitor.metrics()
print("mTLS Monitoring Dashboard:")
tls = data["tls_metrics"]
print(f"  Handshakes: {tls['handshake_success_total']:,} OK, {tls['handshake_failure_total']} failed ({tls['failure_rate']})")
print(f"  Latency: avg={tls['avg_handshake_ms']}ms, p99={tls['p99_handshake_ms']}ms")

print(f"\nCertificate Status:")
for cert in data["certificate_status"]:
    print(f"  [{cert['status']}] {cert['name']}: expires in {cert['expires_in']}")

audit = monitor.audit_report()
print(f"\nAudit Score: {audit['score']}")
for finding in audit["findings"]:
    print(f"  [{finding['severity']}] {finding['finding']}")

FAQ ??????????????????????????????????????????

Q: CDN ????????? mTLS ??????????????????????????????????????????????????????????

A: CDN ??????????????????????????????????????? reverse proxy ????????????????????????????????? client ????????? origin server TLS connection ???????????????????????? 2 ???????????? Client ??? CDN ????????? TLS ???????????? (CDN ?????? public certificate) CDN ????????????????????? cache ?????????????????? ???????????? forward ?????? origin CDN ??? Origin ????????? mTLS CDN present client certificate ????????? origin origin verify ????????? client cert ??????????????? CDN ????????? trust ???????????????????????????????????????????????????????????? origin ?????????????????? (bypass CDN) Cloudflare ???????????????????????? Authenticated Origin Pulls ?????? built-in CA certificate ????????? ????????????????????? custom client certificate ??????????????? CloudFront ??????????????????????????? mTLS to origin ?????????????????? ????????????????????? Lambda@Edge ???????????? ALB ????????? verify client cert

Q: Service Mesh ?????????????????????????????????????????? CDN mTLS ?????????????

A: ?????????????????? ??????????????? CDN mTLS ???????????????????????????????????? CDN ??? Origin connection ???????????????????????? cluster services ???????????????????????????????????? plaintext ???????????????????????? service mesh Service Mesh (Istio/Linkerd) ????????? mTLS ?????????????????????????????? services ??????????????? cluster ??????????????????????????? ?????????????????????????????????????????? code Zero trust ????????? service ???????????? authenticate Certificate rotation ??????????????????????????? (????????? 24 ?????????????????????) Authorization policies ???????????????????????? service ??????????????????????????? service ?????????????????? ???????????? CDN mTLS = protect edge (internet ??? origin), Service Mesh mTLS = protect internal (service ??? service) ???????????????????????????????????????????????????????????? end-to-end security

Q: Performance impact ????????? mTLS ???????????????????

A: mTLS ??????????????? overhead ???????????????????????? TLS handshake ????????????????????????????????? 5-15ms (????????????????????????) ?????????????????????????????????????????? session resumption ???????????????????????? CPU overhead ?????????????????? encryption/decryption ?????????????????? 1-3% (modern CPUs ?????? AES-NI hardware acceleration) Memory ????????????????????????????????????????????????????????? certificate storage Service Mesh sidecar (Envoy) ??????????????? latency ?????????????????? 0.5-2ms per hop ?????????????????? application ???????????????????????? impact ??????????????????????????????????????? ??????????????????????????? ultra-low-latency systems (HFT, gaming) ?????????????????????????????????????????? Tips ?????? impact ????????? TLS 1.3 (handshake ???????????????????????? 1.2), ????????? ECDSA certificates (???????????????????????? RSA), Enable session resumption, ????????? connection pooling

Q: Istio ????????? Linkerd ??????????????????????????????????????????????????? mTLS?

A: Istio ?????? features ????????????????????? (traffic management, security, observability) ?????????????????? mTLS + authorization policies ????????????????????? ?????? Envoy proxy (resource heavy ????????????) community ???????????? plugins ????????? ??????????????? large enterprise ?????????????????????????????? features ????????? Linkerd ????????????????????? (Rust-based proxy) ???????????????????????? setup, mTLS by default ????????????????????? install resource usage ????????????????????? Istio 50-80% ??????????????? teams ?????????????????????????????? mTLS + basic traffic management ????????????????????? features ???????????? ?????????????????? mTLS ?????????????????????????????? Linkerd ?????????????????????????????????????????????????????? ?????????????????? complex traffic management + security policies ??????????????? Istio

📖 บทความที่เกี่ยวข้อง

Flatcar Container Linux Service Mesh Setupอ่านบทความ → Rust Serde CDN Configurationอ่านบทความ → mTLS Service Mesh Machine Learning Pipelineอ่านบทความ → OPA Gatekeeper Service Mesh Setupอ่านบทความ → MetalLB Load Balancer CDN Configurationอ่านบทความ →

📚 ดูบทความทั้งหมด →