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 (порт/ТСР), 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; автоматичне продовження (АСМЕ/дерево довіри).
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) стежте за р95/помилками; 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, автоматизуйте ротації, вимірюйте р95/помилки і використовуйте канарки - так фронт переживе піки і буде передбачувано швидким і безпечним.