Безпека мікросервісів і вебзастосунків
Що таке мікросервіс авторизації
Мікросервіс авторизації:
- перевіряє, хто ти (автентифікація)
- вирішує, що тобі можна робити (авторизація)
- видає та перевіряє токени доступу (JWT та ін.)
- часто працює як Identity Provider (IdP) або частина API Gateway
Популярні рішення
Keycloak (open-source, від Red Hat)
- Готовий сервер авторизації з власною адмінкою та користувачами.
- Підтримує OpenID Connect, OAuth2, SAML
- Видає JWT, керує сесіями
- Має UI для користувачів і адміністраторів
- Підтримує MFA, LDAP, Google Login тощо
- Часто використовується як SSO і центральний сервіс авторизації
Використовується як:
- /auth сервіс
- Підключається до frontend і backend
- Перевіряє токени через middleware або API Gateway
Auth0 (хмарний, комерційний)
- Готове хмарне рішення для автентифікації та авторизації.
- Легка інтеграція через SDK
- Підтримує соц. логіни, MFA, RBAC
- Видає JWT-токени
- Підходить для SaaS, мобільних і SPA
- Плюси: швидко, UI готовий
- Мінуси: платно, залежить від інтернету
OPA (Open Policy Agent) + Keto
- Для авторизації за політикою (ABAC) — хто, до чого, за яких умов.
- OPA = рушій правил (мова Rego)
- Keto = open-source аналог Google Zanzibar (ACL-сховище)
- Дозволяє перевіряти: "Чи може користувач X робити Y з ресурсом Z?"
- Використовуються разом з іншими сервісами
- OPA — виносить бізнес-правила з коду
ORY Stack (Hydra, Kratos, Keto, Oathkeeper)
- 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 | ✅ Так | ✅ Так | ❌ Ні | ✅ Так | ❌ Ні |
Що таке API Gateway
API Gateway — це єдина точка входу до всіх мікросервісів.
Він приймає запити від клієнтів і:
- перенаправляє їх у потрібний мікросервіс (routing)
- перевіряє авторизацію (наприклад, JWT)
- робить rate-limiting, логування, CORS тощо
- Клієнт спілкується лише з Gateway
- Gateway приховує внутрішню структуру
- Він може додати, прибрати, перейменувати заголовки, перевірити токен тощо
[Клієнт] → [API Gateway] ─→ [Мікросервіс A] └→ [Мікросервіс B] └→ [Auth Service]Популярні рішення
NGINX
- Працює як зворотний проксі
- Можна додати валідацію JWT (через Lua, njs, etc.)
- Дуже швидкий, простий у налаштуванні
- Добрий для low-level налаштування (прямо через конфіг)
Kong
- Побудований на базі NGINX
- Плагінна архітектура (авторизація, ліміти, логери)
- Має UI, REST API, CLI
- Підтримує JWT, OAuth2, rate-limit, CORS, OpenID, gRPC тощо
Traefik
Простий у використанні, особливо з Docker/Kubernetes
Автоматичне виявлення сервісів (K8s ingress, Docker labels)
Підтримує TLS, Let’s Encrypt, JWT, middlewares
Envoy
Потужний проксі від Lyft
Використовується в Istio, gRPC, AWS App Mesh
Підтримка сервісної сітки (service mesh)
Висока продуктивність і гнучкість
AWS API Gateway (хмарний)
Повністю керований сервіс від 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)
Як потрібно зберігати паролі
- Хешуємо паролі, а не шифруємо<!-- wp:list -->
- Беремо пароль і пропускаємо через спеціальну повільну функцію (KDF).
- Вона робить підбір пароля дуже дорогим.
- Усі перевірки робити в одному auth-сервісі, а не в кожному мікросервісі.
- Мікросервіси працюють лише з токенами, а не з паролями.
- Використовуємо KDF (ключові функції для паролів)<!-- wp:list -->
- Argon2id (найкращий сучасний варіант, рекомендований OWASP).
- Якщо його немає — bcrypt або scrypt.
- PBKDF2 можна використовувати лише для сумісності/держ. стандартів.
- Для кожного пароля генерувати власну сіль.
- Додаємо сіль (salt)<!-- wp:list -->
- Унікальний випадковий рядок для кожного користувача.
- Зберігається разом із хешем (це нормально).
- Робить так, що два однакові паролі в різних людей матимуть різні хеші.
- Можна додати перець (pepper)<!-- wp:list -->
- Це спільний секрет.
- Він не зберігається в базі.
- Якщо база витекла, а перець ні — хеші марні.
- Перець зберігати окремо (наприклад, у KMS або Vault).
- Зберігаємо результат у форматі з параметрами Наприклад, рядок для bcrypt:
$2a$12$C6UzMDM.H6dfI/f/IKcEe.7WxoQ5y0CEajliV0z3yFNBPJzXeS.CWВона містить:
- алгоритм (2a)
- складність (12)
- сіль
- сам хеш
Де зберігати паролі
- У централізованому сервісі авторизації (наприклад, Keycloak, AWS Secrets Manager, власний Auth-сервіс).
- Інші мікросервіси не знають паролів, вони перевіряють токени (JWT).
- Це знижує ризик витоку: лише один сервіс працює з паролями.
Алгоритм для автентифікації
- Користувач надсилає логін + пароль у сервіс авторизації.
- Сервіс:<!-- wp:list -->
- знаходить хеш і сіль у базі
- хешує надісланий пароль тим самим алгоритмом
- порівнює зі збереженим значенням (constant-time порівняння)
- Якщо збіглося → видається JWT токен.
- Інші мікросервіси перевіряють лише токен, а не паролі.
Що таке KMS (Key Management Service)
Сервіс, який керує ключами шифрування.
Його завдання: ключі не лежать у тебе в коді чи базі, а зберігаються в захищеному місці.
Ти не забираєш ключ, а просто кажеш KMS:
- «Зашифруй ось це»
- «Розшифруй ось це»
- «Підпиши ось це»
Ключ при цьому не залишає сховища.
Як це працює покроково
1. Створення майстер-ключа
- У KMS створюється головний ключ (Master Key).
- Це може бути симетричний (AES) або асиметричний (RSA/ECC).
- Цей ключ не можна завантажити, він завжди залишається всередині KMS.
2. Шифрування даних
- Ти не шифруєш самі великі файли в KMS (це дорого й повільно).
- Замість цього:<!-- wp:list {"ordered":true} -->
- KMS генерує data key (тимчасовий ключ для шифрування).
- Data key використовується у твоєму застосунку для шифрування даних (наприклад, AES-256).
- Сам data key зберігається в тебе в базі, але в зашифрованому вигляді (через майстер-ключ KMS).
3. Розшифрування даних
- Коли треба прочитати дані:<!-- wp:list {"ordered":true} -->
- Ти надсилаєш у KMS зашифрований data key.
- KMS його розшифровує та повертає розшифрований data key.
- Ти використовуєш цей data key, щоб розшифрувати дані в себе.
Таким чином, KMS ніколи не бачить твоїх даних — лише ключі.
Чому це безпечно
- Ключі лежать у захищеному сховищі (HSM — залізо для криптографії).
- Ти не керуєш ключами вручну, ними керує KMS.
- Усі дії (хто, коли шифрував/розшифровував) логуються.
- Можна налаштувати політику: «цей ключ може використовувати лише сервіс А».
- Можна робити ротацію ключів (нова версія кожні N днів).
Де це використовується
- AWS KMS (Amazon)
- Google Cloud KMS
- Azure Key Vault (KMS частина)
- HashiCorp Vault (self-hosted альтернатива)
Які є рішення для захисту від brute-force атак
Для захисту мікросервісів і API від brute-force атак (перебір паролів, токенів, логінів тощо) застосовуються стандартизовані рішення, як на рівні коду, так і на рівні інфраструктури (API Gateway, firewall, reverse proxy, etc). Нижче — систематизований огляд.
| Підхід | Рівень | Стисло |
|---|---|---|
| Rate limiting | Gateway / Service | Обмеження кількості запитів за період часу |
| CAPTCHA / Proof-of-work | UI / Backend | Захист від ботів, збільшує вартість атаки |
| Account lockout | Backend / DB | Блокування після X невдалих спроб |
| Exponential backoff | Backend | Збільшення паузи між спробами |
| IP blacklist / geo-fencing | Gateway | Блокування підозрілих джерел |
| Device fingerprinting | Backend / Frontend | Контекстна оцінка (новий пристрій → challenge) |
| Behavioral analysis | Security service | Аналіз аномалій |
| WAF (Web Application Firewall) | Infra | Захист від автоматичних атак |
Що таке mTLS
mTLS = Mutual TLS, або «взаємний TLS».
Звичайний TLS (HTTPS) працює так:
- Клієнт (браузер, сервіс) перевіряє сертифікат сервера, щоб переконатися, що це саме той сайт/сервіс.
- Сервер не перевіряє клієнта, йому достатньо, що клієнт знає пароль/токен.
У mTLS перевірка двостороння:
- Сервер пред'являє свій сертифікат клієнту.
- Клієнт теж пред'являє свій сертифікат серверу.
- Обидва перевіряють один одного і переконуються, що спілкуються з довіреним співрозмовником.
Як це працює покроково
- Клієнт підключається до сервера і починає TLS-рукостискання.
- Сервер надсилає свій сертифікат → клієнт перевіряє його (підпис CA, строк дії, CN/SAN).
- Сервер у відповідь просить у клієнта сертифікат.
- Клієнт надсилає свій сертифікат → сервер перевіряє його за довіреним CA.
- Якщо обидва сертифікати валідні → встановлюється захищене з'єднання.
Де використовується mTLS
- Між мікросервісами — щоб один сервіс точно знав, що до нього звертається саме довірений сервіс, а не зловмисник.
- В API для B2B — коли компанії обмінюються даними, і треба довіряти не лише паролю/токену, а й сертифікату пристрою/сервісу.
- В IoT — пристрої автентифікуються за сертифікатами.
- У банківських системах — обов'язкова вимога для захисту каналів.
Чим корисний mTLS
- Двостороння автентифікація (і сервер, і клієнт перевірені).
- Ключі ніколи не передаються, а лише підтверджуються сертифікатами.
- Зручно для «machine-to-machine» сценаріїв (мікросервіси, API, IoT).
- Можна замінити паролі/токени на сертифікати (або використовувати разом).
Які є популярні алгоритми шифрування та хешування
Алгоритми шифрування (encryption)
Симетричні (один ключ для шифрування і дешифрування)
- AES (Advanced Encryption Standard) — найпопулярніший, стандарт де-факто<!-- wp:list -->
- Режими: AES-GCM (часто в TLS), AES-CBC, AES-CTR
- Довжина ключа: 128 / 192 / 256 біт
- ChaCha20-Poly1305 — сучасний алгоритм, альтернатива AES<!-- wp:list -->
- Швидший на мобільних і ARM
- Використовується в TLS 1.3, WireGuard, сервісах Google
Асиметричні (різні ключі: публічний і приватний)
- RSA — класика, широко використовується для TLS, підписів, обміну ключами<!-- wp:list -->
- Надійність залежить від довжини ключа (2048+ біт)
- Elliptic Curve Cryptography (ECC) — сучасніший і легший<!-- wp:list -->
- ECDSA (цифровий підпис)
- ECDH / ECDHE (обмін ключами, використовується в TLS 1.3)
- Ed25519, Ed448 (підписи, швидкі та безпечні)
Алгоритми хешування (hashing)
Загальні (для даних)
- SHA-2 (SHA-256, SHA-512) — стандарт у більшості систем
- SHA-3 (Keccak) — новіший стандарт від NIST
- BLAKE2 / BLAKE3 — швидкі, сучасна альтернатива SHA
Для зберігання паролів (спеціальні KDF)
- 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