Назад ΠΊ микросСрвисам вмСстС с Istio. Π§Π°ΡΡ‚ΡŒ 3

Назад ΠΊ микросСрвисам вмСстС с Istio. Π§Π°ΡΡ‚ΡŒ 3

ΠŸΡ€ΠΈΠΌ. ΠΏΠ΅Ρ€Π΅Π².: ΠŸΠ΅Ρ€Π²Π°Ρ Ρ‡Π°ΡΡ‚ΡŒ этого Ρ†ΠΈΠΊΠ»Π° Π±Ρ‹Π»Π° посвящСна знакомству с возмоТностями Istio ΠΈ ΠΈΡ… дСмонстрации Π² дСйствии, вторая β€” Ρ‚ΠΎΠ½ΠΊΠΎ настраиваСмой ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΈ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΡŽ сСтСвым Ρ‚Ρ€Π°Ρ„ΠΈΠΊΠΎΠΌ. Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΆΠ΅ Ρ€Π΅Ρ‡ΡŒ ΠΏΠΎΠΉΠ΄Ρ‘Ρ‚ ΠΏΡ€ΠΎ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡ‚ΡŒ: для дСмонстрации связанных с Π½Π΅ΠΉ Π±Π°Π·ΠΎΠ²Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π°Π²Ρ‚ΠΎΡ€ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ identity-сСрвис Auth0, ΠΎΠ΄Π½Π°ΠΊΠΎ ΠΏΠΎ Π°Π½Π°Π»ΠΎΠ³ΠΈΠΈ с Π½ΠΈΠΌ ΠΌΠΎΠ³ΡƒΡ‚ Π½Π°ΡΡ‚Ρ€Π°ΠΈΠ²Π°Ρ‚ΡŒΡΡ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΏΡ€ΠΎΠ²Π°ΠΉΠ΄Π΅Ρ€Ρ‹.

ΠœΡ‹ настроили Kubernetes-кластСр, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Ρ€Π°Π·Π²Π΅Ρ€Π½ΡƒΠ»ΠΈ Istio ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ микросСрвисного прилоТСния Sentiment Analysis, β€” Ρ‚Π°ΠΊ Π±Ρ‹Π»ΠΈ продСмонстрированы возмоТности Istio.

Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Istio Π½Π°ΠΌ ΡƒΠ΄Π°Π»ΠΎΡΡŒ ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ нСбольшой Ρ€Π°Π·ΠΌΠ΅Ρ€ сСрвисов, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ½ΠΈ Π½Π΅ Π½ΡƒΠΆΠ΄Π°ΡŽΡ‚ΡΡ Π² Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Ρ‚Π°ΠΊΠΈΡ… «слоёв», ΠΊΠ°ΠΊ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½Ρ‹Π΅ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠΈ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ (Retries), Ρ‚Π°ΠΉΠΌΠ°ΡƒΡ‚Ρ‹ (Timeouts), автоматичСский Π²Ρ‹ΠΊΠ»ΡŽΡ‡Π°Ρ‚Π΅Π»ΠΈ (Circuit Breakers), трассировка (Tracing), ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³ (Monitoring). ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, ΠΌΡ‹ задСйствовали Ρ‚Π΅Ρ…Π½ΠΈΠΊΠΈ ΠΏΡ€ΠΎΠ΄Π²ΠΈΠ½ΡƒΡ‚ΠΎΠ³ΠΎ тСстирования ΠΈ дСплоя: A/B-тСстированиС, Π·Π΅Ρ€ΠΊΠ°Π»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈ ΠΊΠ°Π½Π°Ρ€Π΅Π΅Ρ‡Π½Ρ‹Π΅ Π²Ρ‹ΠΊΠ°Ρ‚Ρ‹.

Назад ΠΊ микросСрвисам вмСстС с Istio. Π§Π°ΡΡ‚ΡŒ 3

Π’ Π½ΠΎΠ²ΠΎΠΌ ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»Π΅ ΠΌΡ‹ разбСрёмся с Ρ„ΠΈΠ½Π°Π»ΡŒΠ½Ρ‹ΠΌΠΈ слоями Π½Π° ΠΏΡƒΡ‚ΠΈ ΠΊ business value: Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠ΅ΠΉ ΠΈ Π°Π²Ρ‚ΠΎΡ€ΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ β€” ΠΈ Π² Istio это сплошноС ΡƒΠ΄ΠΎΠ²ΠΎΠ»ΡŒΡΡ‚Π²ΠΈΠ΅!

АутСнтификация ΠΈ авторизация Π² Istio

Никогда Π±Ρ‹ Π½Π΅ ΠΏΠΎΠ²Π΅Ρ€ΠΈΠ», Ρ‡Ρ‚ΠΎ Π²Π΄ΠΎΡ…Π½ΠΎΠ²Π»ΡŽΡΡŒ Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠ΅ΠΉ ΠΈ Π°Π²Ρ‚ΠΎΡ€ΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ. Π§Ρ‚ΠΎ ΠΆΠ΅ Ρ‚Π°ΠΊΠΎΠ³ΠΎ с тСхнологичСской Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠΈΡ‚ΡŒ Istio для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ эти Ρ‚Π΅ΠΌΡ‹ ΡƒΠ²Π»Π΅ΠΊΠ°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ ΠΈ Π΄Π°ΠΆΠ΅ Π±ΠΎΠ»Π΅Π΅ Ρ‚ΠΎΠ³ΠΎ β€” Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½ΠΈ Π²Π΄ΠΎΡ…Π½ΠΎΠ²ΠΈΠ»ΠΈ ΠΈ вас?

ΠžΡ‚Π²Π΅Ρ‚ прост: Istio пСрСносит ΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²Π΅Π½Π½ΠΎΡΡ‚ΡŒ Π·Π° эти возмоТности с Π²Π°ΡˆΠΈΡ… сСрвисов Π½Π° прокси Envoy. Ко Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, ΠΊΠΎΠ³Π΄Π° запросы Π΄ΠΎΡΡ‚ΠΈΠ³Π°ΡŽΡ‚ сСрвисов, ΠΎΠ½ΠΈ ΡƒΠΆΠ΅ Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Π½Ρ‹ ΠΈ Π°Π²Ρ‚ΠΎΡ€ΠΈΠ·ΠΎΠ²Π°Π½Ρ‹, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ Π²Π°ΠΌ остаётся просто ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ΠΉ для бизнСса ΠΊΠΎΠ΄.

Π—Π²ΡƒΡ‡ΠΈΡ‚ Π½Π΅ΠΏΠ»ΠΎΡ…ΠΎ? ЗаглянСм ΠΆΠ΅ Π²Π½ΡƒΡ‚Ρ€ΡŒ!

АутСнтификация с Auth0

Π’ качСствС сСрвСра для управлСния ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠ΅ΠΉ ΠΈ доступом Π±ΡƒΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Auth0, Ρƒ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π΅ΡΡ‚ΡŒ пробная вСрсия, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΠ½Ρ‚ΡƒΠΈΡ‚ΠΈΠ²Π½ΠΎ понятСн Π² использовании ΠΈ попросту нравится ΠΌΠ½Π΅. Π’ΠΏΡ€ΠΎΡ‡Π΅ΠΌ, Ρ‚Π΅ ΠΆΠ΅ самыС ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΡ‹ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΈ ΠΏΠΎ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΡŽ ΠΊ любой Π΄Ρ€ΡƒΠ³ΠΎΠΉ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ OpenID Connect: KeyCloak, IdentityServer ΠΈ ΠΌΠ½ΠΎΠ³ΠΈΠΌ Π΄Ρ€ΡƒΠ³ΠΈΠΌ.

Для Π½Π°Ρ‡Π°Π»Π° Π·Π°ΠΉΠ΄ΠΈΡ‚Π΅ Π½Π° Auth0 Portal со своим Π°ΠΊΠΊΠ°ΡƒΠ½Ρ‚ΠΎΠΌ, создайтС tenant (tenant β€” Β«Π°Ρ€Π΅Π½Π΄Π°Ρ‚ΠΎΡ€Β», ­логичСская Π΅Π΄ΠΈΠ½ΠΈΡ†Π° изоляции, ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ см. Π² Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ β€” ΠΏΡ€ΠΈΠΌ. ΠΏΠ΅Ρ€Π΅Π².) ΠΈ Π·Π°ΠΉΠ΄ΠΈΡ‚Π΅ Π² Applications > Default App, Π²Ρ‹Π±Ρ€Π°Π² Domain, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π½Π° ΡΠΊΡ€ΠΈΠ½ΡˆΠΎΡ‚Π΅ Π½ΠΈΠΆΠ΅:

Назад ΠΊ микросСрвисам вмСстС с Istio. Π§Π°ΡΡ‚ΡŒ 3

Π£ΠΊΠ°ΠΆΠΈΡ‚Π΅ этот Π΄ΠΎΠΌΠ΅Π½ Π² Ρ„Π°ΠΉΠ»Π΅ resource-manifests/istio/security/auth-policy.yaml (исходник):

apiVersion: authentication.istio.io/v1alpha1
kind: Policy
metadata:
  name: auth-policy
spec:
  targets:
  - name: sa-web-app
  - name: sa-feedback
  origins:
  - jwt:
      issuer: "https://{YOUR_DOMAIN}/"
      jwksUri: "https://{YOUR_DOMAIN}/.well-known/jwks.json"
  principalBinding: USE_ORIGIN

Располагая Ρ‚Π°ΠΊΠΈΠΌ рСсурсом, Pilot (ΠΎΠ΄ΠΈΠ½ ΠΈΠ· Ρ‚Ρ€Ρ‘Ρ… Π±Π°Π·ΠΎΠ²Ρ‹Ρ… ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² Control Plane Π² Istio β€” ΠΏΡ€ΠΈΠΌ. ΠΏΠ΅Ρ€Π΅Π².) настраиваСт Envoy’ΠΈ Π½Π° Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡŽ запросов ΠΏΠ΅Ρ€Π΅Π΄ Ρ‚Π΅ΠΌ, ΠΊΠ°ΠΊ ΠΏΠ΅Ρ€Π΅Π½Π°ΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ ΠΈΡ… Π½Π° сСрвисы: sa-web-app ΠΈ sa-feedback. Π’ Ρ‚ΠΎ ΠΆΠ΅ самоС врСмя конфигурация Π½Π΅ примСняСтся ΠΊ Envoy’ям сСрвиса sa-frontend, позволяя Π½Π°ΠΌ ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Ρ„Ρ€ΠΎΠ½Ρ‚Π΅Π½Π΄ Π½Π΅Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΌ. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΡƒ (Policy), Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ:

$ kubectl apply -f resource-manifests/istio/security/auth-policy.yaml
policy.authentication.istio.io β€œauth-policy” created

Π’Π΅Ρ€Π½ΠΈΡ‚Π΅ΡΡŒ Π½Π° страницу ΠΈ сдСлайтС запрос β€” ΡƒΠ²ΠΈΠ΄ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎ ΠΎΠ½ закончится статусом 401 Unauthorized. Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΠ΅Ρ€Π΅Π½Π°ΠΏΡ€Π°Π²ΠΈΠΌ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ Ρ„Ρ€ΠΎΠ½Ρ‚Π΅Π½Π΄Π° Π½Π° Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡŽ с Auth0.

АутСнтификация запросов с Auth0

Π§Ρ‚ΠΎΠ±Ρ‹ Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ запросы ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠ³ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ API Π² Auth0, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ сСрвисы (reviews, details ΠΈ ratings). Для создания API ΠΏΠ΅Ρ€Π΅ΠΉΠ΄ΠΈΡ‚Π΅ Π² Auth0 Portal > APIs > Create API ΠΈ Π·Π°ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ Ρ„ΠΎΡ€ΠΌΡƒ:

Назад ΠΊ микросСрвисам вмСстС с Istio. Π§Π°ΡΡ‚ΡŒ 3

Π’Π°ΠΆΠ½ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠ΅ΠΉ здСсь являСтся Identifier, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠΎΠ·ΠΆΠ΅ ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² скриптС. Π’Ρ‹ΠΏΠΈΡˆΠ΅ΠΌ Π΅Π³ΠΎ сСбС Ρ‚Π°ΠΊ:

  • Audience: {YOUR_AUDIENCE}

ΠžΡΡ‚Π°Π²ΡˆΠΈΠ΅ΡΡ Π½ΡƒΠΆΠ½Ρ‹Π΅ Π½Π°ΠΌ Π΄Π΅Ρ‚Π°Π»ΠΈ располоТСны Π½Π° Auth0 Portal Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ Applications β€” Π²Ρ‹Π±Π΅Ρ€ΠΈΡ‚Π΅ Test Application (создаётся автоматичСски вмСстС с API).

Π—Π΄Π΅ΡΡŒ ΠΌΡ‹ запишСм:

  • Domain: {YOUR_DOMAIN}
  • Client Id: {YOUR_CLIENT_ID}

ΠŸΡ€ΠΎΠΊΡ€ΡƒΡ‚ΠΈΡ‚Π΅ Π² Test Application Π΄ΠΎ тСкстового поля Allowed Callback URLs (Ρ€Π°Π·Ρ€Π΅ΡˆΡ‘Π½Π½Ρ‹Π΅ URL’Ρ‹ для callback’Π°), Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΌΡ‹ ΡƒΠΊΠ°ΠΆΠ΅ΠΌ URL, ΠΊΡƒΠ΄Π° Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΎΡ‚ΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒΡΡ Π²Ρ‹Π·ΠΎΠ² послС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ аутСнтификация Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½Π°. Π’ нашСм случаС это:

http://{EXTERNAL_IP}/callback

А для Allowed Logout URLs (Ρ€Π°Π·Ρ€Π΅ΡˆΡ‘Π½Π½Ρ‹Π΅ URL’Ρ‹ для разлогинивания) Π΄ΠΎΠ±Π°Π²ΠΈΠΌ:

http://{EXTERNAL_IP}/logout

ΠŸΠ΅Ρ€Π΅ΠΉΠ΄Ρ‘ΠΌ ΠΊ Ρ„Ρ€ΠΎΠ½Ρ‚Π΅Π½Π΄Ρƒ.

ОбновлСниС Ρ„Ρ€ΠΎΠ½Ρ‚Π΅Π½Π΄Π°

ΠŸΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅ΡΡŒ Π½Π° Π²Π΅Ρ‚ΠΊΡƒ auth0 рСпозитория [istio-mastery]. Π’ этой Π²Π΅Ρ‚ΠΊΠ΅ ΠΊΠΎΠ΄ Ρ„Ρ€ΠΎΠ½Ρ‚Π΅Π½Π΄Π° ΠΈΠ·ΠΌΠ΅Π½Ρ‘Π½ Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠ΅Ρ€Π΅Π½Π°ΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ Π² Auth0 для Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ JWT-Ρ‚ΠΎΠΊΠ΅Π½ Π² запросах ΠΊ ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹ΠΌ сСрвисам. ПослСднСС Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ΠΎ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ (App.js):

analyzeSentence() {
    fetch('/sentiment', {
        method: 'POST',
        headers: {
            'Content-Type': 'application/json',
            'Authorization': `Bearer ${auth.getAccessToken()}` // Access Token
        },
        body: JSON.stringify({ sentence: this.textField.getValue() })
    })
        .then(response => response.json())
        .then(data => this.setState(data));
}

Π§Ρ‚ΠΎΠ±Ρ‹ пСрСвСсти Ρ„Ρ€ΠΎΠ½Ρ‚Π΅Π½Π΄ Π½Π° использованиС Π΄Π°Π½Π½Ρ‹Ρ… tenant’Π° Π² Auth0, ΠΎΡ‚ΠΊΡ€ΠΎΠΉΡ‚Π΅ sa-frontend/src/services/Auth.js ΠΈ Π·Π°ΠΌΠ΅Π½ΠΈΡ‚Π΅ Π² Π½Ρ‘ΠΌ значСния, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΡ‹ записали Π²Ρ‹ΡˆΠ΅ (Auth.js):

const Config = {
    clientID: '{YOUR_CLIENT_ID}',
    domain:'{YOUR_DOMAIN}',
    audience: '{YOUR_AUDIENCE}',
    ingressIP: '{EXTERNAL_IP}' // Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для Ρ€Π΅Π΄ΠΈΡ€Π΅ΠΊΡ‚Π° послС Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ
}

ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π³ΠΎΡ‚ΠΎΠ²ΠΎ. Π£ΠΊΠ°ΠΆΠΈΡ‚Π΅ свой Docker ID Π² ΠΊΠΎΠΌΠ°Π½Π΄Π°Ρ… Π½ΠΈΠΆΠ΅ ΠΏΡ€ΠΈ сборкС ΠΈ Π΄Π΅ΠΏΠ»ΠΎΠ΅ ΠΏΡ€ΠΎΠΈΠ·Π²Π΅Π΄Ρ‘Π½Π½Ρ‹Ρ… ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ:

$ docker build -f sa-frontend/Dockerfile 
 -t $DOCKER_USER_ID/sentiment-analysis-frontend:istio-auth0 
 sa-frontend

$ docker push $DOCKER_USER_ID/sentiment-analysis-frontend:istio-auth0

$ kubectl set image deployment/sa-frontend 
 sa-frontend=$DOCKER_USER_ID/sentiment-analysis-frontend:istio-auth0

ΠŸΠΎΠΏΡ€ΠΎΠ±ΡƒΠΉΡ‚Π΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅! Вас пСрСнаправят Π½Π° Auth0, Π³Π΄Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π·Π°Π»ΠΎΠ³ΠΈΠ½ΠΈΡ‚ΡŒΡΡ (ΠΈΠ»ΠΈ Π·Π°Ρ€Π΅Π³ΠΈΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ), послС Ρ‡Π΅Π³ΠΎ вас отправят ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ Π½Π° страницу, с ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ ΡƒΠΆΠ΅ Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ запросы. Если ΠΆΠ΅ Π²Ρ‹ ΠΏΠΎΠΏΡ€ΠΎΠ±ΡƒΠ΅Ρ‚Π΅ упомянутыС Π² ΠΏΠ΅Ρ€Π²Ρ‹Ρ… частях ΡΡ‚Π°Ρ‚ΡŒΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ с curl β€” ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚Π΅ ΠΊΠΎΠ΄ 401 Status Code, ΡΠΈΠ³Π½Π°Π»ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ запрос Π½Π΅ Π°Π²Ρ‚ΠΎΡ€ΠΈΠ·ΠΎΠ²Π°Π½.

Π‘Π΄Π΅Π»Π°Π΅ΠΌ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ шаг β€” Π°Π²Ρ‚ΠΎΡ€ΠΈΠ·ΡƒΠ΅ΠΌ запросы.

Авторизация с Auth0

АутСнтификация позволяСт Π½Π°ΠΌ ΠΏΠΎΠ½ΡΡ‚ΡŒ, ΠΊΠ΅ΠΌ являСтся ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ, Π½ΠΎ для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ·Π½Π°Ρ‚ΡŒ, ΠΊ Ρ‡Π΅ΠΌΡƒ Ρƒ Π½Π΅Π³ΠΎ Π΅ΡΡ‚ΡŒ доступ, трСбуСтся авторизация. Istio ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅Ρ‚ инструмСнты ΠΈ для этого.

Π’ качСствС ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° создадим Π΄Π²Π΅ Π³Ρ€ΡƒΠΏΠΏΡ‹ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ (см. Π½Π° схСмС Π½ΠΈΠΆΠ΅):

  • ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΠΈ (users) β€” с доступом Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊ сСрвисам SA-WebApp ΠΈ SA-Frontend;
  • ΠœΠΎΠ΄Π΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ (moderators) β€” с доступом ΠΊΠΎ всСм Ρ‚Ρ€Ρ‘ΠΌ сСрвисам.

Назад ΠΊ микросСрвисам вмСстС с Istio. Π§Π°ΡΡ‚ΡŒ 3
ΠšΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΡ Π°Π²Ρ‚ΠΎΡ€ΠΈΠ·Π°Ρ†ΠΈΠΈ

Для создания этих Π³Ρ€ΡƒΠΏΠΏ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡΡ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ΠΌ Auth0 Authorization ΠΈ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Istio прСдоставим ΠΈΠΌ Ρ€Π°Π·Π½Ρ‹Π΅ ΡƒΡ€ΠΎΠ²Π½ΠΈ доступа.

Установка ΠΈ конфигурация Auth0 Authorization

На ΠΏΠΎΡ€Ρ‚Π°Π»Π΅ Auth0 ΠΏΠ΅Ρ€Π΅ΠΉΠ΄ΠΈΡ‚Π΅ ΠΊ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡΠΌ (Extensions) ΠΈ установитС Auth0 Authorization. ПослС установки ΠΏΠ΅Ρ€Π΅ΠΉΠ΄ΠΈΡ‚Π΅ ΠΊ Authorization Extension, Π° Ρ‚Π°ΠΌ β€” ΠΊ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ tenant’Π° ΠΏΠΎ ΠΊΠ»ΠΈΠΊΡƒ справа Π½Π°Π²Π΅Ρ€Ρ…Ρƒ ΠΈ Π²Ρ‹Π±ΠΎΡ€Ρƒ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ ΠΎΠΏΡ†ΠΈΠΈ мСню (Configuration). АктивируйтС Π³Ρ€ΡƒΠΏΠΏΡ‹ (Groups) ΠΈ Π½Π°ΠΆΠΌΠΈΡ‚Π΅ Π½Π° ΠΊΠ½ΠΎΠΏΠΊΡƒ ΠΏΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΠΈ ΠΏΡ€Π°Π²ΠΈΠ»Π° (Publish rule).

Назад ΠΊ микросСрвисам вмСстС с Istio. Π§Π°ΡΡ‚ΡŒ 3

Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π³Ρ€ΡƒΠΏΠΏ

Π’ Authorization Extension ΠΏΠ΅Ρ€Π΅ΠΉΠ΄ΠΈΡ‚Π΅ Π² Groups ΠΈ создайтС Π³Ρ€ΡƒΠΏΠΏΡƒ Moderators. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ всСх Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ ΠΊΠ°ΠΊ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Ρ…, потрСбности Π² создании для Π½ΠΈΡ… Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ Π³Ρ€ΡƒΠΏΠΏΡ‹ Π½Π΅Ρ‚.

Π’Ρ‹Π±Π΅Ρ€ΠΈΡ‚Π΅ Π³Ρ€ΡƒΠΏΠΏΡƒ Moderators, Π½Π°ΠΆΠΌΠΈΡ‚Π΅ Π½Π° Add Members, Π΄ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ свой основной Π°ΠΊΠΊΠ°ΡƒΠ½Ρ‚. ΠžΡΡ‚Π°Π²ΡŒΡ‚Π΅ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ Π±Π΅Π· ΠΊΠ°ΠΊΠΎΠΉ-Π»ΠΈΠ±ΠΎ Π³Ρ€ΡƒΠΏΠΏΡ‹, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ доступ для Π½ΠΈΡ… Π·Π°ΠΏΡ€Π΅Ρ‰Ρ‘Π½. (Новых ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ Ρ‡Π΅Ρ€Π΅Π· Auth0 Portal > Users > Create User.)

Π”ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ Group Claim Π² Access Token

ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΠΈ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Ρ‹ Π² Π³Ρ€ΡƒΠΏΠΏΡ‹, ΠΎΠ΄Π½Π°ΠΊΠΎ эта информация Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ ΠΎΡ‚Ρ€Π°ΠΆΠ΅Π½Π° ΠΈ Π² Ρ‚ΠΎΠΊΠ΅Π½Π°Ρ… для доступа. Π§Ρ‚ΠΎΠ±Ρ‹ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ OpenID Connect ΠΈ Π² Ρ‚ΠΎ ΠΆΠ΅ врСмя Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ Π³Ρ€ΡƒΠΏΠΏΡ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π°ΠΌ Π½ΡƒΠΆΠ½Ρ‹, Ρ‚ΠΎΠΊΠ΅Π½Ρƒ потрСбуСтся Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ свой custom claim. РСализуСтся Ρ‡Π΅Ρ€Π΅Π· ΠΏΡ€Π°Π²ΠΈΠ»Π° Auth0.

Для создания ΠΏΡ€Π°Π²ΠΈΠ»Π° ΠΏΠ΅Ρ€Π΅ΠΉΠ΄ΠΈΡ‚Π΅ Π½Π° Auth0 Portal ΠΊ Rules, Π½Π°ΠΆΠΌΠΈΡ‚Π΅ Π½Π° Create Rule ΠΈ Π²Ρ‹Π±Π΅Ρ€ΠΈΡ‚Π΅ пустоС ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ ΠΈΠ· шаблонов.

Назад ΠΊ микросСрвисам вмСстС с Istio. Π§Π°ΡΡ‚ΡŒ 3

Π‘ΠΊΠΎΠΏΠΈΡ€ΡƒΠΉΡ‚Π΅ ΠΊΠΎΠ΄ Π½ΠΈΠΆΠ΅ ΠΈ сохранитС Π΅Π³ΠΎ ΠΊΠ°ΠΊ Π½ΠΎΠ²ΠΎΠ΅ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ Add Group Claim (namespacedGroup.js):

function (user, context, callback) {
    context.accessToken['https://sa.io/group'] = user.groups[0];
    return callback(null, user, context);
}

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅: этот ΠΊΠΎΠ΄ Π±Π΅Ρ€Ρ‘Ρ‚ ΠΏΠ΅Ρ€Π²ΡƒΡŽ Π³Ρ€ΡƒΠΏΠΏΡƒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½ΡƒΡŽ Π² Authorization Extension, ΠΈ добавляСт Π΅Ρ‘ Π² access-Ρ‚ΠΎΠΊΠ΅Π½ ΠΊΠ°ΠΊ custom claim (ΠΏΠΎΠ΄ своим пространством ΠΈΠΌΡ‘Π½, ΠΊΠ°ΠΊ Ρ‚ΠΎΠ³ΠΎ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ Auth0).

Π’Π΅Ρ€Π½ΠΈΡ‚Π΅ΡΡŒ ΠΊ страницС Rules ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅, Ρ‡Ρ‚ΠΎ Ρƒ вас Π΅ΡΡ‚ΡŒ Π΄Π²Π° ΠΏΡ€Π°Π²ΠΈΠ»Π°, записанныС Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ порядкС:

  • auth0-authorization-extension
  • Add Group Claim

ΠŸΠΎΡ€ΡΠ΄ΠΎΠΊ Π²Π°ΠΆΠ΅Π½, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ»Π΅ Π³Ρ€ΡƒΠΏΠΏΡ‹ асинхронно ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ auth0-authorization-extension ΠΈ послС этого добавляСтся ΠΊΠ°ΠΊ claim Π²Ρ‚ΠΎΡ€Ρ‹ΠΌ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎΠΌ. Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ получаСтся Ρ‚Π°ΠΊΠΎΠΉ access-Ρ‚ΠΎΠΊΠ΅Π½:

{
 "https://sa.io/group": "Moderators",
 "iss": "https://sentiment-analysis.eu.auth0.com/",
 "sub": "google-oauth2|196405271625531691872"
 // [сокращСно для наглядности]
}

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ Envoy-прокси Π½Π° ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ доступа, для Ρ‡Π΅Π³ΠΎ Π³Ρ€ΡƒΠΏΠΏΠ° Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Ρ‚Π°ΡΠΊΠΈΠ²Π°Ρ‚ΡŒΡΡ ΠΈΠ· claim (https://sa.io/group) Π² Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠΌ access-Ρ‚ΠΎΠΊΠ΅Π½Π΅. Π­Ρ‚ΠΎ Ρ‚Π΅ΠΌΠ° для ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ Ρ€Π°Π·Π΄Π΅Π»Π° ΡΡ‚Π°Ρ‚ΡŒΠΈ.

ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ Π°Π²Ρ‚ΠΎΡ€ΠΈΠ·Π°Ρ†ΠΈΠΈ Π² Istio

Π§Ρ‚ΠΎΠ±Ρ‹ авторизация Π·Π°Ρ€Π°Π±ΠΎΡ‚Π°Π»Π°, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ RBAC для Istio. Для этого Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡΡ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠ΅ΠΉ:

apiVersion: "rbac.istio.io/v1alpha1"
kind: RbacConfig
metadata:
  name: default
spec:
  mode: 'ON_WITH_INCLUSION'                     # 1
  inclusion:
    services:                                   # 2
    - "sa-frontend.default.svc.cluster.local"
    - "sa-web-app.default.svc.cluster.local"
    - "sa-feedback.default.svc.cluster.local" 

ПояснСния:

  • 1 β€” Π²ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌ RBAC Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для сСрвисов ΠΈ пространств ΠΈΠΌΡ‘Π½, пСрСчислСнных Π² ΠΏΠΎΠ»Π΅ Inclusion;
  • 2 β€” пСрСчисляСм список Π½Π°ΡˆΠΈΡ… сСрвисов.

ΠŸΡ€ΠΈΠΌΠ΅Π½ΠΈΠΌ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ Ρ‚Π°ΠΊΠΎΠΉ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ:

$ kubectl apply -f resource-manifests/istio/security/enable-rbac.yaml
rbacconfig.rbac.istio.io/default created

Π’Π΅ΠΏΠ΅Ρ€ΡŒ всС сСрвисы Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ управлСния доступом Π½Π° основС Ρ€ΠΎΠ»Π΅ΠΉ (Role-Based Access Control). Π”Ρ€ΡƒΠ³ΠΈΠΌΠΈ словами, доступ ΠΊΠΎ всСм сСрвисам Π·Π°ΠΏΡ€Π΅Ρ‰Ρ‘Π½ ΠΈ ΠΏΡ€ΠΈΠ²Π΅Π΄Ρ‘Ρ‚ ΠΊ ΠΎΡ‚Π²Π΅Ρ‚Ρƒ RBAC: access denied. Π’Π΅ΠΏΠ΅Ρ€ΡŒ Ρ€Π°Π·Ρ€Π΅ΡˆΠΈΠΌ доступ Π°Π²Ρ‚ΠΎΡ€ΠΈΠ·ΠΎΠ²Π°Π½Π½Ρ‹ΠΌ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡΠΌ.

ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ доступа для ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Ρ… ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ

ВсС ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΈΠΌΠ΅Ρ‚ΡŒ доступ ΠΊ сСрвисам SA-Frontend ΠΈ SA-WebApp. РСализуСтся с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… рСсурсов Istio:

  • ServiceRole β€” опрСдСляСт ΠΏΡ€Π°Π²Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΅ΡΡ‚ΡŒ Ρƒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ;
  • ServiceRoleBinding β€” опрСдСляСт, ΠΊ ΠΊΠΎΠΌΡƒ эта ServiceRole относится.

Для ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Ρ… ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ Ρ€Π°Π·Ρ€Π΅ΡˆΠΈΠΌ доступ ΠΊ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½Ρ‹ΠΌ сСрвисам (servicerole.yaml):

apiVersion: "rbac.istio.io/v1alpha1"
kind: ServiceRole
metadata:
  name: regular-user
  namespace: default
spec:
  rules:
  - services: 
    - "sa-frontend.default.svc.cluster.local" 
    - "sa-web-app.default.svc.cluster.local"
    paths: ["*"]
    methods: ["*"]

А Ρ‡Π΅Ρ€Π΅Π· regular-user-binding ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠΌ ServiceRole ΠΊΠΎ всСм посСтитСлям страницы (regular-user-service-role-binding.yaml):

apiVersion: "rbac.istio.io/v1alpha1"
kind: ServiceRoleBinding
metadata:
  name: regular-user-binding
  namespace: default
spec:
  subjects:
  - user: "*"
  roleRef:
    kind: ServiceRole
    name: "regular-user"

ΠžΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ Π»ΠΈ «всС ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΠΈΒ», Ρ‡Ρ‚ΠΎ ΠΈ Π½Π΅Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ доступ ΠΊ SA WebApp? НСт, ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠ° ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ Π²Π°Π»ΠΈΠ΄Π½ΠΎΡΡ‚ΡŒ JWT-Ρ‚ΠΎΠΊΠ΅Π½Π°.

ΠŸΡ€ΠΈΠΌΠ΅Π½ΠΈΠΌ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ:

$ kubectl apply -f resource-manifests/istio/security/user-role.yaml
servicerole.rbac.istio.io/regular-user created
servicerolebinding.rbac.istio.io/regular-user-binding created

ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ доступа для ΠΌΠΎΠ΄Π΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ²

Для ΠΌΠΎΠ΄Π΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ доступ ΠΊΠΎ всСм сСрвисам (mod-service-role.yaml):

apiVersion: "rbac.istio.io/v1alpha1"
kind: ServiceRole
metadata:
  name: mod-user
  namespace: default
spec:
  rules:
  - services: ["*"]
    paths: ["*"]
    methods: ["*"]

Но ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ Ρ‚Π°ΠΊΠΈΡ… ΠΏΡ€Π°Π² Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для Ρ‚Π΅Ρ… ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ, Π² access-Ρ‚ΠΎΠΊΠ΅Π½Π΅ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π΅ΡΡ‚ΡŒ claim https://sa.io/group со Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ Moderators (mod-service-role-binding.yaml):

apiVersion: "rbac.istio.io/v1alpha1"
kind: ServiceRoleBinding
metadata:
  name: mod-user-binding
  namespace: default
spec:
  subjects:
  - properties:
      request.auth.claims[https://sa.io/group]: "Moderators"
  roleRef:
    kind: ServiceRole
name: "mod-user" 

ΠŸΡ€ΠΈΠΌΠ΅Π½ΠΈΠΌ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ:

$ kubectl apply -f resource-manifests/istio/security/mod-role.yaml
servicerole.rbac.istio.io/mod-user created
servicerolebinding.rbac.istio.io/mod-user-binding created

Из-Π·Π° ΠΊΡΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ Π² envoy’ях для вступлСния ΠΏΡ€Π°Π²ΠΈΠ» Π°Π²Ρ‚ΠΎΡ€ΠΈΠ·Π°Ρ†ΠΈΠΈ Π² силу ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΏΠ°Ρ€Π° ΠΌΠΈΠ½ΡƒΡ‚. ПослС этого Π²Ρ‹ смоТСтС ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ Ρƒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ ΠΈ ΠΌΠΎΠ΄Π΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² Ρ€Π°Π·Π½Ρ‹Π΅ ΡƒΡ€ΠΎΠ²Π½ΠΈ доступа.

Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΏΠΎ этой части

Ну Π²ΠΎΡ‚ ΡΠ΅Ρ€ΡŒΡ‘Π·Π½ΠΎ: Π²Ρ‹ Π³Π΄Π΅-Π½ΠΈΠ±ΡƒΠ΄ΡŒ Π²ΠΈΠ΄Π΅Π»ΠΈ Π±ΠΎΠ»Π΅Π΅ простой, Π½Π΅ Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‰ΠΈΠΉ усилий, ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΡƒΠ΅ΠΌΡ‹ΠΉ ΠΈ бСзопасный ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ ΠΊ Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ ΠΈ Π°Π²Ρ‚ΠΎΡ€ΠΈΠ·Π°Ρ†ΠΈΠΈ?

ВсСго лишь Ρ‚Ρ€ΠΈ рСсурса Istio (RbacConfig, ServiceRole, and ServiceRoleBinding) ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΎΠ²Π°Π»ΠΈΡΡŒ для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π΄ΠΎΠ±ΠΈΡ‚ΡŒΡΡ Ρ‚ΠΎΠ½ΠΊΠΎΠ³ΠΎ контроля Π½Π°Π΄ Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠ΅ΠΉ ΠΈ Π°Π²Ρ‚ΠΎΡ€ΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ доступа ΠΊΠΎΠ½Π΅Ρ‡Π½Ρ‹Ρ… ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ ΠΊ сСрвисам.

Π’Π΄ΠΎΠ±Π°Π²ΠΎΠΊ, ΠΌΡ‹ вынСсли Π·Π°Π±ΠΎΡ‚Ρƒ ΠΎΠ± этих ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°Ρ… ΠΈΠ· Π½Π°ΡˆΠΈΡ… сСрвисов Π² envoy’ΠΈ, добившись:

  • ΡƒΠΌΠ΅Π½ΡŒΡˆΠ΅Π½ΠΈΡ количСства Ρ‚ΠΈΠΏΠΎΠ²ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΌΠΎΠ³ΡƒΡ‚ ΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ бСзопасности ΠΈ Π±Π°Π³ΠΈ;
  • сниТСния количСства Π³Π»ΡƒΠΏΡ‹Ρ… ситуаций, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΎΠ΄ΠΈΠ½ endpoint оказался доступным снаруТи ΠΈ Π·Π°Π±Ρ‹Π» ΡΠΎΠΎΠ±Ρ‰ΠΈΡ‚ΡŒ ΠΎΠ± этом;
  • устранСния нСобходимости Π² ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠΈ всСх сСрвисов ΠΏΡ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠΈ Π½ΠΎΠ²ΠΎΠΉ Ρ€ΠΎΠ»ΠΈ ΠΈΠ»ΠΈ ΠΏΡ€Π°Π²Π°;
  • Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ Π½ΠΎΠ²Ρ‹Π΅ сСрвисы ΠΎΡΡ‚Π°ΡŽΡ‚ΡΡ простыми, бСзопасными ΠΈ быстрыми.

Π’Ρ‹Π²ΠΎΠ΄

Istio позволяСт ΠΊΠΎΠΌΠ°Π½Π΄Π°ΠΌ ΡΡ„ΠΎΠΊΡƒΡΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ свои рСсурсы Π½Π° Π²Π°ΠΆΠ½Ρ‹Ρ… для бизнСса Π·Π°Π΄Π°Ρ‡Π°Ρ…, Π½Π΅ добавляя Π½Π°ΠΊΠ»Π°Π΄Π½Ρ‹Π΅ расходы сСрвисам, возвращая ΠΈΡ… ΠΊ статусу Β«ΠΌΠΈΠΊΡ€ΠΎΒ».

Π‘Ρ‚Π°Ρ‚ΡŒΡ (Π² Ρ‚Ρ€Ρ‘Ρ… частях) прСдоставила Π±Π°Π·ΠΎΠ²Ρ‹Π΅ знания ΠΈ Π³ΠΎΡ‚ΠΎΠ²ΡƒΡŽ ΠΏΡ€Π°ΠΊΡ‚ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ ΠΈΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡŽ для Π½Π°Ρ‡Π°Π»Π° Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Istio Π² Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°Ρ….

P.S. ΠΎΡ‚ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Ρ‡ΠΈΠΊΠ°

Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ Ρ‚Π°ΠΊΠΆΠ΅ Π² нашСм Π±Π»ΠΎΠ³Π΅:

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com