GH GambleHub

S2S-аутентифікація

S2S-аутентифікація доводить, який саме сервіс/ворклоад робить запит, і дає йому мінімально необхідні права на обмежений час. На відміну від користувацьких потоків, тут немає людини - тому критичні короткий термін життя облікових даних, криптографічна прив'язка до ворклоаду/каналу і чітка спостережуваність.

1) Цілі та принципи

Zero Trust за замовчуванням: не довіряти мережі, тільки атестації ворклоада і криптографії.
Короткоживучі креденшли: хвилини, а не дні/місяці.
Прив'язка до контексту: tenant/region/licence/audience/scopes.
Централізована видача, децентралізована перевірка: STS/IdP + локальна верифікація.
Мінімальні привілеї та явне делегування: тільки потрібні скоупи і аудит.
Ротація «без болю»: dual-key/dual-cert вікна та автоматизація.

2) Модель загроз (мінімум)

Крадіжка довговічних секретів (API-keys, long-lived RT).
Підміна сервісу всередині VPC/кластера.
Міжрегійні атаки при зламаній сегментації.
Replay/підміна трафіку на проксі.
Supply-chain/підміна образу контейнера.
Помилки конфігурації (широкі правила firewall/mesh, загальний JWKS для всіх).

3) Базові патерни S2S

3. 1 mTLS (взаємні сертифікати)

Хто ви: доводить каналом.
Сертифікати короткоживучі (година-доба) з внутрішньої PKI; випуском/ротацією управляє mesh/sidecar або SPIRE-агент.
Хороший для «сусідів» в одному trust-домені і для binding токенів.

3. 2 Сервісні JWT (STS)

Хто ви: доводить повідомленням.
Короткий Access JWT (2-5 хв) з'aud','scp','tenant','region'.
Підписує KMS/HSM, публічні ключі - через JWKS з'kid'і ротацією.
Перевірка локально (без мережевого виклику IdP).

3. 3 SPIFFE/SPIRE (SVID)

Універсальна ідентичність ворклоадів: `spiffe://trust-domain/ns/<ns>/sa/<sa>`.
Автоматичний issuance/rotation X.509/JWT-SVID, інтеграція з Istio/Linkerd.

3. 4 OAuth 2. 1 Client Credentials / Token Exchange (RFC 8693)

Машинні клієнти отримують токен від STS; для дій «від імені» користувача - OBO (token exchange).

Комбінуємо: mTLS для каналу, JWT для повідомлення, SPIFFE - для стійких ідентичностей.

4) Референс-архітектура


[KMS/HSM]       [Policy Store / PDP]

[STS/IdP (issuer)] ── JWKS ──[Gateway/PEP] ─────[Services/PEP]
│
SVID/JWT │         │    │      │
(SPIRE/Istio)│      mTLS/DPoP  │    mTLS/DPoP
│         │    │      │
[Workload/Sidecar]─────────┴───────┴────────────┘

Issuer (STS/IdP): випускає короткі сервісні JWT/CVID, публікує JWKS.
Gateway (PEP): термін мережі, валідує mTLS/JWT, збагачує контекстом, запитує PDP.
Services (PEP): повторна перевірка (defense in depth), кеш рішень PDP.
SPIRE/mesh: авто-сертифікати та SVID для mTLS.

5) Формат сервісного JWT (приклад)

json
{
"iss": "https://sts. core",
"sub": "svc. catalog, "//service identity
"aud": ["svc. search"] ,//target service/domain
"exp": 1730390100, "iat": 1730389800,
"tenant": "brand_eu",
"region": "EE",
"scp": ["catalog:read:public","catalog:read:tenant"],
"mtls": { "bound": true, "spiffe": "spiffe://core/ns/prod/sa/catalog" }
}

Підписаний ES256/EdDSA,'kid'вказує активний ключ.
Опціонально binding до каналу: прапор, hash cert, SVID.

6) Політики видачі (STS) і верифікація

Видача:
  • Subject береться з SVID/клієнтського сертифіката/регістра клієнта.
  • Термін життя 2-5 хв, refresh немає - замість цього заново просити STS.
  • Скоупи/аудиторії беруться з Policy Store (GitOps), а не із запиту клієнта.
Перевірка (PEP):

1. Перевірити mTLS (опціонально) і валідність ланцюжка.

2. Перевірити підпис JWT по JWKS (по'kid').

3. Звірити'exp/nbf/iss/aud', tenant/region/licence.

4. Збагатити контекст і запитати PDP (RBAC/ABAC/ReBAC).

5. Кешувати рішення PDP (TTL 30-120 c), інвалідація по подіям.

7) Мульти-тенант і регіони (trust domains)

Розділяйте trust-domain'и: `spiffe://eu. core`, `spiffe://latam. core`.
Роздільні JWKS/PKI по регіонах; міжрегіон - тільки через довірені шлюзи.
Включайте в клейми'tenant/region/licence'і перевіряйте відповідність ресурсу.
Логи/аудит сегментуйте по тенантах і регіонах.

8) Mesh/sidecar і без-mesh режим

Istio/Linkerd: mTLS «з коробки», policy-enforcement на рівні L4/L7, інтеграція зі SPIRE.
Без mesh: бібліотека-клієнт + mutual TLS в додатку; складніше управляти ротацією - автоматизуйте через агента.

9) Ключі, JWKS і ротація

Приватні ключі тільки в KMS/HSM; підпис - віддаленим викликом/апаратом.
Rotation кожні N днів; dual-key: старий + новий приймаються, issuer підписує новим після прогріву кешів.
Моніторинг: частка споживання по'kid', «завислі» клієнти на старому ключі.

Приклад конфігурації (YAML):
yaml issuer:
jwks:
alg: ES256 rotation_days: 30 publish_cache_ttl: 60s sts:
access_ttl: 5m audience_policies:
- subject: "svc. catalog"
allow: ["svc. search","svc. wallet"]
scopes: ["catalog:read:"]
tenancy:
claims: ["tenant","region","licence"]
jwks_per_region: true

10) Прив'язка до каналу (DPoP/mTLS-bound)

mTLS-bound tokens: в JWT додавати hash клієнтського сертифіката; на прийомі звіряти.
DPoP: для HTTP-клієнтів без mTLS - підписувати кожен запит DPoP-ключем, в AT поміщати thumbprint DPoP.

11) Помилки і політика повернення

Стандартизуйте коди:
  • `401 INVALID_TOKEN`/`EXPIRED_TOKEN`/`AUD_MISMATCH`.
  • `401 MTLS_REQUIRED`/`MTLS_CERT_INVALID`.
  • `403 INSUFFICIENT_SCOPE`/`POLICY_DENY`.
  • `429 RATE_LIMITED`.

Відповідь містить machine-readable'error _ code'і'as _ of'( версія ключа/політики).

12) Спостережуваність і аудит

Метрики:
  • `s2s_auth_p95_ms`, `verify_jwt_p95_ms`, `jwks_skew_ms`,
  • `invalid_token_rate`, `aud_mismatch_rate`, `insufficient_scope_rate`,
  • споживання по'kid', частка mTLS-bound запитів.
Логи/трейси:
  • `subject`, `aud`, `tenant`, `region`, `scp`, `kid`, `sid/svid`, `decision`, `policy_version`, `trace_id`.
Аудит (незмінний):
  • Видача токенів, ротації ключів, зміни політик, відхилені запити.

13) Продуктивність

Верифікація JWT - локально, JWKS кешуйте (TTL 30-60 с) з фоновим оновленням.
X.509-ланцюжки - пінінг CA і кеш OCSP/CRL.
Винесіть дороге валідаційне I/O на gateway/sidecar.
Використовуйте prefetch токенів/сертифікатів (за 10-20 с до закінчення).

14) Тестування

Contract/interop: різні ЯП/бібліотеки, clock skew ± 300 с.
Negative: прострочений/підроблений токен, невірний'aud', не той регіон/тенант, зламаний cert-chain.
Chaos: раптова ротація'kid', недоступність JWKS, експірація масово, обрив mTLS.
Load: пік видачі на STS, сплеск verify на gateway.
E2E: mTLS-only, JWT-only, комбінований режим, Token Exchange (OBO).

15) Плейбуки (runbooks)

1. Компрометація ключа підпису

Негайний revoke'kid', випуск нового, укорочений TTL токенів, аудит, пошук «завислих» клієнтів, примусовий deny для старого'kid'.

2. Масові'INVALID _ TOKEN '

Перевірити JWKS-кеш, розсинхрон годинника, витоки токенів (TTL занадто короткий), тимчасово розширити допуск skew, прогріти JWKS.

3. mTLS-відмови

Перевірка ланцюжка CA, термінів SVID, часу хоста; emergency-перевипуск через SPIRE/Istio, включити fallback-маршрути тільки всередині регіону.

4. Зростання'AUD _ MISMATCH '

Дрейф політик audience: порівняти STS-policy з фактичними викликами, тимчасово додати потрібний'aud', запланувати коригування архітектури викликів.

5. STS недоступний/сповільнений

Збільшити TTL вже виданих токенів (grace), включити prefetch/refresh-раніше, scale-out STS.

16) Типові помилки

Довгоживучі API-ключі/секрети в env/коді.
Загальний JWKS/PKI «на всі регіони і на всі часи».
Відсутність binding (mTLS/DPoP) → токен легко відвести.
Широкі'aud ='і «адмінські» scopes за замовчуванням.
Ротація без dual-key періоду → масові 401.
Перевірка токенів тільки на gateway (немає defense in depth).
«Німий» відмова (ні'error _ code'і'reason') - складно дебажити і навчати команди.

17) Міні-шаблони конфігурацій

PEP (gateway) - правила:
yaml auth:
require_mtls: true jwks:
url: https://sts. core/.well-known/jwks. json cache_ttl: 60s claims:
required: ["iss","sub","aud","exp","tenant","region"]
tenant_in_header: "x-tenant"
pdp:
endpoint: "opa:8181/v1/data/policy/allow"
decision_cache_ttl: 60s
STS Policy (фрагмент):
yaml subjects:
- id: "svc. catalog"
spiffe: "spiffe://core/ns/prod/sa/catalog"
audiences: ["svc. search","svc. wallet"]
scopes: ["catalog:read:"]
ttl: "5m"

18) Чек-лист перед продом

  • Короткі сервісні JWT (≤5 хв), локальна верифікація, кеш JWKS.
  • mTLS (або DPoP) включений; пріоритетно - mTLS-bound tokens.
  • SPIFFE/SPIRE або еквівалент для авто-видачі/ротації сертифікатів.
  • STS з політиками audience/scope; видача тільки за довіреною ідентичністю.
  • Розділення trust-domains і JWKS по регіонах; клейми tenant/region/licence перевіряються.
  • PDP/PEP інтегровані, кеш рішень + інвалідація по подіям.
  • Dual-key вікна, моніторинг споживання'kid', алерти на invalid/aud mismatch.
  • Повні логи/аудит S2S, включені метрики продуктивності/помилок.
  • Плейбуки на компрометацію ключа, падіння STS, збій mTLS.
  • Набір contract/negative/chaos/load/E2E тестів пройдено.

Висновок

S2S-аутентифікація - це комбінація канал-довіри (mTLS), повідомлення-довіри (короткі JWT) і стійкої ідентичності ворклоада (SPIFFE), керована централізованим STS і перевіряється локально. Додайте розділення trust-доменів, строгі audience/scopes, автоматичну ротацію і спостережуваність - і отримаєте контур, який надійний, пояснимо і масштабується разом з платформою і її географією.

Contact

Зв’яжіться з нами

Звертайтеся з будь-яких питань або за підтримкою.Ми завжди готові допомогти!

Telegram
@Gamble_GC
Розпочати інтеграцію

Email — обов’язковий. Telegram або WhatsApp — за бажанням.

Ваше ім’я необов’язково
Email необов’язково
Тема необов’язково
Повідомлення необов’язково
Telegram необов’язково
@
Якщо ви вкажете Telegram — ми відповімо й там, додатково до Email.
WhatsApp необов’язково
Формат: +код країни та номер (наприклад, +380XXXXXXXXX).

Натискаючи кнопку, ви погоджуєтесь на обробку даних.