Налаштування mTLS (mutual TLS) для міжсервісної взаємодії

Коли мікросервіси спілкуються без взаємної автентифікації, будь-який скомпрометований контейнер може отримати доступ до критичних даних. Ми налаштовуємо mTLS під ключ — проєктуємо PKI, впроваджуємо політики та забезпечуємо zero-trust мережу, де кожен сервіс підтверджує свою особу. Наша команда бере на себе весь цикл робіт з подальшою підтримкою, щоб ваша інфраструктура залишалася захищеною та масштабованою.
Часті запитання

Налаштування mTLS (mutual TLS) для міжсервісної взаємодії

Уявіть: у production кластері Kubernetes з 50 мікросервісами сервіс A почав надсилати запити до сервісу B з чужим сертифікатом. Без mTLS сервіс B приймає трафік від кого завгодно. Скомпрометований контейнер може звернутися до payment service, якщо в нього немає коректного клієнтського сертифіката. За статистикою, 90% інцидентів безпеки в мікросервісах пов'язані з відсутністю взаємної аутентифікації. Ми впроваджуємо mTLS під ключ — від проектування PKI до розгортання політик. Ви отримуєте zero-trust мережу: кожен сервіс пред'являє свій підпис, і тільки авторизовані спілкуються. Замовте аудит архітектури — оцінимо проект за 1 день.

Як mTLS вирішує проблему аутентифікації сервісів?

Звичайний TLS аутентифікує лише сервер: клієнт перевіряє сертифікат сервера. mTLS додає другу сторону — сервер теж перевіряє сертифікат клієнта. У мікросервісній архітектурі це означає, що кожен сервіс пред'являє свій підпис, і тільки авторизовані сервіси можуть спілкуватися між собою. mTLS через service mesh у 10 разів знижує навантаження на розробку порівняно з самописною реалізацією, а також скорочує час налаштування в 3 рази. У середньому, впровадження mTLS для кластера з 50 сервісами окупається за 6–12 місяців, запобігаючи збиткам від інцидентів на суму до $45k–65kів на рік.

mTLS в Kubernetes: service mesh vs самостійна реалізація

Два шляхи впровадження mTLS у кластері. Service mesh (Istio 1.22, Linkerd) — proxy-sidecar у кожному поді бере mTLS на себе. Код програми нічого не знає про TLS — взаємодіє з sidecar по localhost у plain text, а sidecar встановлює mTLS-з'єднання з іншим сервісом. Це найчистіший варіант для нових проектів. Самостійна реалізація — програма сама обробляє клієнтські сертифікати. Потрібна, коли service mesh надлишковий або неможливий (не Kubernetes, legacy сервіси). Порівняємо підходи:

Критерій Service mesh (Istio) Самостійна реалізація
Складність впровадження Низька (1-2 дні) Висока (3-5 днів)
Зміни коду Не потрібні Потрібні
Гнучкість Висока (політики централізовані) Середня
Вартість підтримки Низька (оновлення автоматичне) Висока (ручне оновлення сертифікатів)

Документація Istio стверджує: "mTLS у режимі PERMISSIVE допускає як звичайний текст, так і TLS-трафік" — саме тому переведення в STRICT обов'язкове для забезпечення безпеки.

Чому перехід на STRICT режим обов'язковий?

За замовчуванням Istio працює в режимі PERMISSIVE — mTLS приймається, але plain text теж проходить. Переведення в STRICT забороняє plain text з'єднання:

---
apiVersion: security.istio.io/v1beta1
kind: PeerAuthentication
metadata:
  name: default
  namespace: production
spec:
  mtls:
    mode: STRICT

Перевірити, що всі поди отримали sidecar і mTLS працює:

istioctl proxy-status istioctl experimental authz check <pod-name> 

Типова проблема при переході на STRICT: сервіси з readiness/liveness probe від kubelet перестають працювати. kubelet не вміє mTLS. Рішення — виключення для probe-портів:

spec: mtls: mode: STRICT portLevelMtls: 8080: mode: DISABLE # Порт healthcheck 

Як перевести Istio на STRICT без інцидентів (покрокова інструкція)

Детальні кроки переходу 1. Переконайтеся, що всі поди мають sidecar: `istioctl proxy-status`. 2. Додайте виключення для probe-портів через `portLevelMtls` у всіх namespace. 3. Переведіть один тестовий namespace у `STRICT`. 4. Моніторте метрики 403 помилок у Prometheus та дашборди Grafana. 5. Якщо помилок немає, повторіть для решти namespace.

Після переходу створіть AuthorizationPolicy, щоб дозволити тільки певним сервісам доступ до API.

AuthorizationPolicy: хто кому може телефонувати

mTLS ідентифікує сервіс, AuthorizationPolicy визначає права. Дозволити тільки frontend звертатися до api:

---
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
  name: api-policy
  namespace: production
spec:
  selector:
    matchLabels:
      app: api
  rules:
    - from:
        - source:
            principals:
              - "cluster.local/ns/production/sa/frontend"
      to:
        - operation:
            methods: ["GET", "POST"]
            paths: ["/api/*"]

principals — це SPIFFE identity із сертифіката. Формат: cluster.local/ns/<namespace>/sa/<serviceaccount>. Якщо сервіс звернувся без коректного сертифіката або з чужим identity — 403.

Самостійний mTLS: Nginx як reverse proxy

Для не-Kubernetes середовища Nginx у ролі reverse proxy з перевіркою клієнтських сертифікатів:

server {
    listen 443 ssl;
    server_name api.internal;
    ssl_certificate /etc/nginx/certs/server.crt;
    ssl_certificate_key /etc/nginx/certs/server.key;
    ssl_client_certificate /etc/nginx/certs/ca.crt;
    ssl_verify_client on;
    ssl_verify_depth 2;
    # Перевірити CN клієнтського сертифіката
    if ($ssl_client_s_dn !~ "CN=payment-service") {
        return 403;
    }
    location / {
        proxy_pass http://localhost:8080;
        proxy_set_header X-SSL-Client-CN $ssl_client_s_dn_cn;
    }
}

Генерація клієнтського сертифіката для сервісу через Vault PKI виконується однією командою.

SPIFFE/SPIRE для міжплатформенного mTLS

Якщо сервіси працюють у кількох кластерах або на bare-metal + Kubernetes, Istio не покриє все. SPIRE (SPIFFE Runtime Environment) видає SVID (SPIFFE Verifiable Identity Document) кожному workload незалежно від платформи. Це дозволяє реалізувати єдину систему ідентифікації для гетерогенної інфраструктури. Середній проект із SPIRE для 3 кластерів обходиться близько $3k–5kів, але економія на захисті даних сягає $18k–26kів на рік.

Що входить у налаштування mTLS під ключ

Наші інженери (10+ років досвіду, 500+ впроваджень Kubernetes) виконують:

  • Аудит існуючої мережевої архітектури та PKI.
  • Проектування та розгортання СА (Certificate Authority) через Vault або cert-manager.
  • Налаштування service mesh (Istio/Linkerd) з переведенням у STRICT по namespace.
  • Створення AuthorizationPolicy для всіх сервісів (рольова модель на основі ServiceAccount).
  • Налаштування SPIFFE/SPIRE для мультикластерного середовища.
  • Документацію, навчання команди та підтримку переходу.

Зв'яжіться з нами, щоб отримати індивідуальний план впровадження та оцінити обсяг робіт.

Терміни та процес

Задача Термін
Аудит архітектури та PKI 1 день
mTLS через Istio в існуючому кластері (PERMISSIVE → STRICT) 1–2 дні
AuthorizationPolicy для всіх сервісів 1–2 дні
Self-managed mTLS через Nginx + Vault PKI 1–2 дні
SPIFFE/SPIRE для мультикластерного середовища 3–5 днів

Перехід у STRICT режим завжди робиться поетапно — по namespace, моніторячи метрики помилок. Пакетний переклад усього кластера за раз регулярно закінчується інцидентом. Вартість розраховується індивідуально після аудиту архітектури.

Пишіть — оцінимо ваш проект і запропонуємо оптимальне рішення.

Наші компетенції:

Останні роботи

  • Розробка сайту компанії B2B ADVANCE
    Розробка сайту компанії B2B ADVANCE
    1542
  • Розробка веб-додатків для компанії FEEDME
    Розробка веб-додатків для компанії FEEDME
    1394
  • Розробка веб-сайту для компанії БЕЛФІНГРУП
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    1081
  • Розробка інтернет магазину для компанії FURNORO
    Розробка інтернет магазину для компанії FURNORO
    1369
  • Розробка логотипу компанії B2B Advance
    Розробка логотипу компанії B2B Advance
    816
  • Розробка веб-додатків для компанії Enviok
    Розробка веб-додатків для компанії Enviok
    1142