Перейти к содержимому

Безопасность микросервисов и приложений

Микросервис авторизации:

  • проверяет кто ты (аутентификация)
  • решает, что тебе можно делать (авторизация)
  • выдает и проверяет токены доступа (JWT и др.)
  • часто работает как Identity Provider (IdP) или часть API Gateway
  • Готовый сервер авторизации со своей админкой и пользователями.
  • Поддерживает OpenID Connect, OAuth2, SAML
  • Выдает JWT, управляет сессиями
  • Имеет UI для пользователей и админов
  • Поддерживает MFA, LDAP, Google Login и т.д.
  • Часто используется как SSO и центральный сервис авторизации

Используется как:

  • /auth сервис
  • Подключается к frontend и backend
  • Проверяет токены через middleware или API Gateway
  • Готовое облачное решение для аутентификации и авторизации.
  • Лёгкая интеграция через SDK
  • Поддерживает соц. логины, MFA, RBAC
  • Выдаёт JWT-токены
  • Подходит для SaaS, мобильных и SPA
  • Плюсы: быстро, UI готов
  • Минусы: платно, зависит от интернета
  • Для авторизации по политике (ABAC) — кто, к чему, при каких условиях.
  • OPA = движок правил (Rego язык)
  • Keto = open-source аналог Google Zanzibar (ACL-хранилище)
  • Позволяет проверять: «Может ли пользователь X делать Y с ресурсом Z?»
  • Используются вместе с другими сервисами
  • OPA — выносит бизнес-правила из кода
  • Open-source платформа для авторизации
  • Hydra — OAuth2 / OIDC сервер (только протоколы)
  • Kratos — управление пользователями (логин, регистрация, email)
  • Keto — хранение политик (RBAC/ABAC)
  • Oathkeeper — API Gateway с авторизацией
  • Гибко, мощно, но требует настройки
  • Идеально под микросервисную архитектуру
НазваниеВалидацияАутентификацияПолитики (ABAC)UI / АдминкаOpen-source
Keycloak✅ JWT✅ Да⚠️ Ограничено✅ Да✅ Да
Auth0✅ JWT✅ Да⚠️ Ограничено✅ Да❌ Нет
OPA + Keto⚠️ Через API❌ Нет✅ Очень гибко❌ Нет✅ Да
ORY Stack✅ Да✅ Да✅ Да✅ Да✅ Да
Firebase✅ Да✅ Да❌ Нет✅ Да❌ Нет

PI Gateway — это единая точка входа во все микросервисы.
Он принимает запросы от клиентов и:

  • перенаправляет их в нужный микросервис (routing)
  • проверяет авторизацию (например, JWT)
  • делает rate-limiting, логирование, CORS и т.д
  • Клиент общается только с Gateway
  • Gateway скрывает внутреннюю структуру
  • Он может добавить, убрать, переименовать заголовки, проверить токен и т.д.
[Клиент] → [API Gateway] ─→ [Микросервис A]
                        └→ [Микросервис B]
                        └→ [Auth Service]
  • Работает как обратный прокси
  • Можно добавить валидацию JWT (через Lua, njs, etc.)
  • Очень быстрый, простой в настройке
  • Хорош для low-level настройки (прямо через конфиг)
  • Построен на базе NGINX
  • Плагинная архитектура (авторизация, лимиты, логгеры)
  • Имеет UI, REST API, CLI
  • Поддерживает JWT, OAuth2, rate-limit, CORS, OpenID, gRPC и т.д.

Прост в использовании, особенно с Docker/Kubernetes
Автоматическое обнаружение сервисов (K8s ingress, Docker labels)
Поддерживает TLS, Let’s Encrypt, JWT, middlewares

Мощный прокси от Lyft
Используется в Istio, gRPC, AWS App Mesh
Поддержка сервисной сетки (service mesh)
Высокая производительность и гибкость

Полностью управляемый сервис от AWS
Интеграция с Lambda, IAM, Cognito, CloudWatch
Поддерживает REST, WebSocket, HTTP APIs

Сертификат — это удостоверение личности для компьютеров и серверов.
Он подтверждает, что сервер — тот, за кого себя выдаёт, и содержит его открытый ключ.

Сертификат — это файл в формате .crt, .pem, .cer, .der и т.п. Он содержит:

ПолеЗначение
SubjectКому выдан (домен, имя сервера и т.д.)
IssuerКто выдал (CA — удостоверяющий центр)
Public KeyОткрытый ключ сервера
Valid From / ToСрок действия
SignatureПодпись удостоверяющего центра
Serial NumberУникальный ID сертификата

При открытиии сайта браузер:
Получает сертификат сервера
Проверяет, подписан ли он доверенным центром (CA)
— например, Let’s Encrypt, DigiCert, Sectigo и др.
Использует публичный ключ из сертификата, чтобы:
проверить подлинность сервера
создать секретный ключ, с помощью которого будет зашифрован весь трафик
Дальнейший обмен данными идёт по шифрованному каналу (TLS)

  • HTTPS на сайтах
  • gRPC между микросервисами
  • mTLS (взаимная авторизация клиента и сервера)
  • OAuth2 / OpenID (подпись токенов через RSA/ECDSA)
  • Kubernetes (kube-apiserver, kubelet, etcd)
  • VPN (WireGuard, OpenVPN)

По назначению:

ТипДля чего используется
Сертификат сервера (SSL/TLS)Для HTTPS, защищает сайты и API
Сертификат клиентаДля проверки личности клиента (например, mTLS)
Сертификат подписи кодаДля подписи программ (например, .exe, .apk)
Сертификат email (S/MIME)Для подписи и шифрования email-сообщений
Сертификат PKI в ADДля Windows/LDAP авторизации

По структуре:

ТипОписание
Root CertificateКорневой, устанавливается в системе (Windows, браузер)
Intermediate CAПромежуточный, подписывает пользовательские сертификаты
Leaf / End-entityСам сертификат сайта/сервиса/пользователя
  • хранить пароль в открытом виде (plain text)
  • шифровать пароли «чтобы можно было расшифровать»
  • использовать быстрые хэши (MD5, SHA-1, чистый SHA-256)
  1. Хэшируем пароли, а не шифруем
    • Берём пароль и пропускаем через специальную медленную функцию (KDF).
    • Она делает подбор пароля очень дорогим.
    • Все проверки делать в одном auth-сервисе, а не в каждом микросервисе.
    • Микросервисы работают только с токенами, а не с паролями.
  2. Используем KDF (ключевые функции для паролей)
    • Argon2id (лучший современный вариант, рекомендован OWASP).
    • Если его нет — bcrypt или scrypt.
    • PBKDF2 можно использовать только для совместимости/гос. стандартов.
    • Для каждого пароля генерировать свою соль.
  3. Добавляем соль (salt)
    • Уникальная случайная строка для каждого пользователя.
    • Хранится вместе с хэшем (это нормально).
    • Делает так, что два одинаковых пароля у разных людей будут иметь разные хэши.
  4. Можно добавить перец (pepper)
    • Это общий секрет.
    • Он не хранится в базе.
    • Если база утекла, а перец нет — хэши бесполезны.
    • Перец хранить отдельно (например, в KMS или Vault).
  5. Храним итог в формате с параметрами
    Например, строка для bcrypt:
$2a$12$C6UzMDM.H6dfI/f/IKcEe.7WxoQ5y0CEajliV0z3yFNBPJzXeS.CW

Она содержит:

  • алгоритм (2a)
  • сложность (12)
  • соль
  • сам хэш
  • В централизованном сервисе авторизации (например, Keycloak, AWS Secrets Manager, свой Auth-сервис).
  • Остальные микросервисы не знают пароли, они проверяют токены (JWT).
  • Это снижает риск утечки: только один сервис работает с паролями.
  1. Пользователь присылает логин + пароль в сервис авторизации.
  2. Сервис:
    • находит хэш и соль в базе
    • хэширует присланный пароль тем же алгоритмом
    • сравнивает с хранимым значением (constant-time сравнение)
  3. Если совпало → выдается JWT токен.
  4. Остальные микросервисы проверяют только токен, а не пароли.

Сервис, который управляет ключами шифрования.
Его задача: ключи не лежат у тебя в коде или базе, а хранятся в защищённом месте.
Ты не забираешь ключ, а просто говоришь KMS:

  • «Зашифруй вот это»
  • «Расшифруй вот это»
  • «Подпиши вот это»

Ключ при этом не покидает хранилище.

1. Создание мастер-ключа

  • В KMS создаётся главный ключ (Master Key).
  • Это может быть симметричный (AES) или асимметричный (RSA/ECC).
  • Этот ключ нельзя скачать, он всегда остаётся внутри KMS.

2. Шифрование данных

  • Ты не шифруешь сами большие файлы в KMS (это дорого и медленно).
  • Вместо этого:
    1. KMS генерирует data key (временный ключ для шифрования).
    2. Data key используется в твоём приложении для шифрования данных (например, AES-256).
    3. Сам data key хранится у тебя в базе, но в зашифрованном виде (через мастер-ключ KMS).

3. Расшифровка данных

  • Когда надо прочитать данные:
    1. Ты отправляешь в KMS зашифрованный data key.
    2. KMS его расшифровывает и возвращает расшифрованный data key.
    3. Ты используешь этот data key, чтобы расшифровать данные у себя.

Таким образом, KMS никогда не видит твои данные — только ключи.

  • Ключи лежат в защищённом хранилище (HSM — железо для криптографии).
  • Ты не управляешь ключами вручную, ими управляет KMS.
  • Все действия (кто, когда шифровал/расшифровывал) логируются.
  • Можно настроить политику: «этот ключ может использовать только сервис А».
  • Можно делать ротацию ключей (новая версия каждые N дней).
  • AWS KMS (Amazon)
  • Google Cloud KMS
  • Azure Key Vault (KMS часть)
  • HashiCorp Vault (self-hosted альтернатива)

Для защиты микросервисов и API от brute-force атак (перебор паролей, токенов, логинов и т.д.) применяются стандартизованные решения, как на уровне кода, так и на уровне инфраструктуры (API Gateway, firewall, reverse proxy, etc). Ниже — систематизированный обзор.

ПодходУровеньКратко
Rate limitingGateway / ServiceОграничение количества запросов за период времени
CAPTCHA / Proof-of-workUI / BackendЗащита от ботов, увеличивает стоимость атаки
Account lockoutBackend / DBБлокировка после X неудачных попыток
Exponential backoffBackendУвеличение паузы между попытками
IP blacklist / geo-fencingGatewayБлокировка подозрительных источников
Device fingerprintingBackend / FrontendКонтекстная оценка (новое устройство → challenge)
Behavioral analysisSecurity serviceАнализ аномалий
WAF (Web Application Firewall)InfraЗащита от автоматических атак

mTLS = Mutual TLS, или «взаимный TLS».

Обычный TLS (HTTPS) работает так:

  • Клиент (браузер, сервис) проверяет сертификат сервера, чтобы убедиться, что это именно тот сайт/сервис.
  • Сервер не проверяет клиента, ему достаточно, что клиент знает пароль/токен.

В mTLS проверка двусторонняя:

  • Сервер предъявляет свой сертификат клиенту.
  • Клиент тоже предъявляет свой сертификат серверу.
  • Оба проверяют друг друга и убеждаются, что общаются с доверённым собеседником.
  1. Клиент подключается к серверу и начинает TLS-рукопожатие.
  2. Сервер отправляет свой сертификат → клиент проверяет его (подпись CA, срок действия, CN/SAN).
  3. Сервер в ответ просит у клиента сертификат.
  4. Клиент отправляет свой сертификат → сервер проверяет его по доверенному CA.
  5. Если оба сертификата валидны → устанавливается защищённое соединение.
  • Между микросервисами — чтобы один сервис точно знал, что к нему обращается именно доверенный сервис, а не злоумышленник.
  • В API для B2B — когда компании обмениваются данными, и нужно доверять не только паролю/токену, но и сертификату устройства/сервиса.
  • В IoT — устройства аутентифицируются по сертификатам.
  • В банковских системах — обязательное требование для защиты каналов.
  • Двусторонняя аутентификация (и сервер, и клиент проверены).
  • Ключи никогда не передаются, а только подтверждаются сертификатами.
  • Удобно для «machine-to-machine» сценариев (микросервисы, API, IoT).
  • Можно заменить пароли/токены на сертификаты (или использовать вместе).
  • AES (Advanced Encryption Standard) — самый популярный, стандарт де-факто
    • Режимы: AES-GCM (часто в TLS), AES-CBC, AES-CTR
    • Длина ключа: 128 / 192 / 256 бит
  • ChaCha20-Poly1305 — современный алгоритм, альтернатива AES
    • Быстрее на мобильных и ARM
    • Используется в TLS 1.3, WireGuard, Google сервисах
  • RSA — классика, широко используется для TLS, подписи, обмена ключами
    • Надёжность зависит от длины ключа (2048+ бит)
  • Elliptic Curve Cryptography (ECC) — более современный и лёгкий
    • ECDSA (цифровая подпись)
    • ECDH / ECDHE (обмен ключами, используется в TLS 1.3)
    • Ed25519, Ed448 (подписи, быстрые и безопасные)
  • SHA-2 (SHA-256, SHA-512) — стандарт в большинстве систем
  • SHA-3 (Keccak) — более новый стандарт от NIST
  • BLAKE2 / BLAKE3 — быстрые, современная альтернатива SHA
  • Argon2id — современный победитель Password Hashing Competition, лучший вариант сейчас
  • bcrypt — старый, но всё ещё широко используется
  • scrypt — лучше чем bcrypt, но реже используется
  • PBKDF2 — стандартный, но считается устаревающим (используется для совместимости, FIPS)
  • Для шифрования данных: AES-GCM или ChaCha20-Poly1305
  • Для обмена ключами: ECDHE (в TLS 1.3)
  • Для подписей: ECDSA или Ed25519
  • Для хэширования файлов: SHA-256 или BLAKE3
  • Для паролей: Argon2id (лучший выбор), либо bcrypt/scrypt