SSL-терминация и балансировщики
Краткое резюме
SSL/TLS-терминация снимает крипто-нагрузку с приложений и открывает путь к L7-маршрутизации, WAF, rate-limit, mTLS, канареечным релизам. Ключевые решения: где завершать TLS (edge/ingress/внутри mesh), как балансировать (L4 vs L7), какие профили шифров использовать, как обновлять сертификаты без даунтайма и как держать p95 латентности и ошибки в SLO.
Где завершать TLS
На краю (CDN/Anycast/WAF): минимальная латентность пользователю, глобальная защита, кеш/бот-контроль. Дальше — re-encrypt до бэкенда.
На ingress L7 (Nginx/Envoy/HAProxy/ALB): тонкая маршрутизация по URI/заголовкам, mTLS, JWT-валидация.
Сквозной TLS (passthrough L4): когда нужен end-to-end mTLS до pod/сервиса (например, строгая комплаенс-зона).
Service Mesh (Envoy/Istio/Linkerd): автоматизированный mTLS внутри кластера, политики и телеметрия.
Практика: чаще — edge terminate → re-encrypt до ingress; для PII/платежей — mTLS до сервиса.
L4 vs L7 балансировка
L4 (TCP/UDP): минимальная задержка, простые health-checks (порт/TCP), passthrough TLS. Подходит для gRPC на TLS при нехватке L7-фич.
L7 (HTTP/HTTPS/HTTP3): маршрутизация по хосту/пути/заголовкам/cookies, WAF, rate-limits, канареечные релизы, sticky-сессии, ретраи/таймауты.
TLS: версии, ключи, шифры
Версии: TLS 1.3 везде, TLS 1.2 как fallback. Отключайте 1.0/1.1.
Ключи/серты: ECDSA (P-256) — быстрее RSA; можно двойной-стек (ECDSA+RSA) для старины.
ALPN: `h2` и `http/1.1`; для HTTP/3 — `h3` (QUIC/UDP).
OCSP Stapling: включать; HSTS на публичных доменах.
Пулы ключей: хранение в KMS/HSM; автоматическое продление (ACME/дерево доверия).
0-RTT (TLS 1.3): включать точечно (GET/идемпотентные), учитывать риск replay.
Базовый профиль шифров (TLS 1.2): `ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-CHACHA20-POLY1305`
Производительность TLS
Resumption: session tickets/IDs — снижают handshake-стоимость.
ECDSA + ChaCha20 помогают на мобильных/без AES-NI.
OCSP Stapling + короткие цепочки уменьшают p95.
HTTP/2/3: мультиплексирование, меньше соединений → ниже p95.
Offload: pin CPU-ядер под crypto, включить reuseport, tune socket-буферы.
Безопасность
mTLS: требуйте client-cert для админок/API операторов; CRL/OCSP для отзыва.
SNI/ECH: SNI — стандарт; ECH (Encr. ClientHello) скрывает домен (если поддерживает edge-провайдер).
Strict Transport Security (HSTS): прод-домены, с осторожностью на старте.
TLS между hop-ами: re-encrypt до сервиса, даже внутри DC (Zero-Trust).
Rate-limit/грей-волы: на L7 защищают апи от ботов/брутфорса.
Наблюдаемость и SLO
SLO (примеры)
p95 TLS-handshake ≤ 80–120 мс (глобально), p95 TTFB ≤ 200–300 мс.
Ошибки TLS (handshake/peer-verify) ≤ 0.1%.
Доля резюмпшенов ≥ 70% для повторных визитов.
Метрики
`handshake_time`, `tls_version`, `alpn`, `cert_expiry_days`, `ocsp_staple_status`.
L7: `p50/p95/p99`, `5xx`, `429`, `upstream_rq_time`, `retry_budget`.
Capacity: активные коннекты, CPS (connections per second), RPS.
Типовые конфиги
Nginx (L7 terminate + HTTP/2 + OCSP stapling)
nginx server {
listen 443 ssl http2 reuseport;
server_name api.example.com;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:...:ECDHE-RSA-CHACHA20-POLY1305';
ssl_ecdh_curve X25519:P-256;
ssl_certificate /etc/ssl/cert.pem; # полная цепочка ssl_certificate_key /etc/ssl/key.pem;
ssl_stapling on; ssl_stapling_verify on;
ssl_session_cache shared:SSL:50m; ssl_session_timeout 1d;
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
location / {
proxy_set_header Host $host;
proxy_set_header X-Forwarded-Proto https;
proxy_pass https://upstream_pool;
}
}
upstream upstream_pool {
zone backends 64k;
server 10.0.1.10:8443 max_fails=3 fail_timeout=10s;
server 10.0.1.11:8443 max_fails=3 fail_timeout=10s;
keepalive 256;
}
HAProxy (L7 terminate + stickiness + mTLS к бэкенду)
haproxy frontend fe_https bind:443 ssl crt /etc/haproxy/certs/ alpn h2,http/1.1 mode http http-response set-header Strict-Transport-Security max-age=31536000 default_backend be_api
backend be_api mode http balance roundrobin cookie SRV insert indirect nocache option httpchk GET /healthz server s1 10.0.1.10:8443 check ssl verify required ca-file /etc/haproxy/ca.pem server s2 10.0.1.11:8443 check ssl verify required ca-file /etc/haproxy/ca.pem
Envoy (L7 terminate + mTLS от клиента + канарейка)
yaml static_resources:
listeners:
- name: https address: { socket_address: { address: 0.0.0.0, port_value: 443 } }
filter_chains:
- filters:
- name: envoy.filters.network.http_connection_manager typed_config:
"@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager stat_prefix: ingress route_config:
virtual_hosts:
- name: api domains: ["api.example.com"]
routes:
- match: { prefix: "/" }
route:
weighted_clusters:
clusters:
- name: api-stable weight: 95
- name: api-canary weight: 5 http_filters:
- name: envoy.filters.http.router transport_socket:
name: envoy.transport_sockets.tls typed_config:
"@type": type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.DownstreamTlsContext common_tls_context:
tls_certificates:
- certificate_chain: { filename: "/etc/tls/cert.pem" }
private_key: { filename: "/etc/tls/key.pem" }
validation_context: # mTLS (опционально)
trusted_ca: { filename: "/etc/tls/ca.pem" }
require_client_certificate: true
AWS ALB/NLB (концепт)
ALB (L7 terminate): HTTPS listener 443 (TLS 1.2/1.3), target group HTTPs:8443, health-check `/healthz`, stickiness (cookie).
NLB (L4 passthrough): TLS listener 443, TCP health-checks, сквозной SNI до pod.
CloudFront/Cloudflare: TLS edge + WAF + Bot-менеджмент; origin — HTTPS only.
Обновление сертификатов без даунтайма
ACME (Let’s Encrypt/частный CA) с автоматическим обновлением и горячей перезагрузкой (Nginx `reload`, Envoy SDS).
Двойные сертификаты (ECDSA+RSA) при миграциях.
Контроль цепочек: проверка промежуточных CA; OCSP stapling после ротации.
Алерты: `cert_expiry_days < 21` и `ocsp_status!= good`.
Health-checks и маршрутизация
L4: TCP connect, TLS handshake.
L7: HTTP 200/JSON-маркер версии, gRPC health.
Политики: failover, weighted, latency, consistent-hash (cookie/IP) для sticky.
Ретраи/таймауты: баланс между устойчивостью и дубликатами запросов (идемпотентность!).
Kubernetes-паттерны
Ingress Controller (Nginx/Envoy/HAProxy): терминация на ингрессе, `ExternalDNS` для DNS-записей, `cert-manager` для ACME.
Gateway API: декларативные TLSRoute/HTTPRoute с канарейками.
Service Mesh: автоматический mTLS pod↔pod, политики на уровне `PeerAuthentication`/`DestinationRule`.
Чек-лист безопасности
- TLS 1.3 включен; 1.0/1.1 выключены.
- Современные шифры; ECDSA-серты там, где поддержка позволяет.
- OCSP stapling, полные цепочки, HSTS.
- mTLS для админок/интерконнектов; ревокация клиентских сертов.
- Rate-limit/бот-фильтры на краю; защита от slowloris/oversized headers.
- Re-encrypt до бэкендов (Zero-Trust).
- Секреты/ключи в KMS/HSM; ротация и аудит выдачи.
Наблюдаемость и алерты
Метрики: TLS handshakes/sec, failure rate, session resumption rate, OCSP, p95/99, open conns, CPS, RPS.
Логи: SNI/ALPN/версия TLS, cipher, сертификат клиента (для mTLS), upstream-коды, latency breakdown.
Алерты: рост `5xx/525`, падение resumption, `cert_expiry_days`, `ocsp_failed`, превышение p95, всплески `429`.
Типичные ошибки
Терминация на краю и plain HTTP внутрь без защиты.
Чрезмерно длинные цепочки CA → рост p95 handshake.
Отсутствие OCSP stapling → блокировки на клиентах/браузерах.
Sticky-сессии без учета failover → «залипание» на деградном узле.
0-RTT включен для изменяющих запросов → риск повторной подачи.
Отсутствие hot-reload сертов → секундные дропы при ротации.
Специфика для iGaming/финтех
Пики (турниры/матчи): прогрев TLS-сессий (pre-connect), короткие цепочки, высокая доля resumption, HTTP/2/3 для фронтов.
Платежные шлюзы/PSP: mTLS, строгие ciphers/версии, pinned CA, отдельные домены/ALB с жесткими правилами.
Антифрод/бот-фильтры: L7-rate-limit по IP/ASN/device-fingerprint, канареечные грей-волы (челлендж/капча) на отдельном домене.
Регуляторика: HSTS, аудируемые журналы TLS-параметров, отчеты по версиям, отзыв клиентских сертов по инцидентам.
Мини-плейбуки
Канареечный релиз через L7-балансировщик
1. Добавьте кластер `api-canary` с весом 5%; 2) следите за p95/ошибками; 3) 5→25→50→100%; 4) автосворачивание при деградации.
Экстренная ротация сертификата
1. Загрузите новый cert/key; 2) `reload` без падения коннектов (SDS/горячая замена); 3) проверка OCSP; 4) дашборд p95 handshake.
Включение HTTP/3
1. Откройте UDP/443; 2) добавьте ALPN `h3`; 3) отдельные метрики QUIC loss/RTT; 4) A/B по доле клиентов.
Итог
Эффективная SSL-терминация — это современный TLS-профиль, правильное место завершения, умная L7-маршрутизация, наблюдаемость и строгая безопасность (mTLS, HSTS, re-encrypt). Зафиксируйте все в IaC, автоматизируйте ротации, измеряйте p95/ошибки и используйте канарейки — так фронт переживет пики и будет предсказуемо быстрым и безопасным.