Бозгашт ба microservices бо Istio. Қисми 3

Бозгашт ба microservices бо Istio. Қисми 3

Шарҳ. тарҷума.: Қисми якум ин силсила ба шиносоӣ бо имкониятҳои Истио ва нишон додани онҳо дар амал бахшида шуда буд, дуюм — масири дақиқ танзимшуда ва идоракунии трафики шабака. Ҳоло мо дар бораи амният сӯҳбат хоҳем кард: барои нишон додани вазифаҳои асосии марбут ба он, муаллиф аз хидмати шахсияти Auth0 истифода мебарад, аммо провайдерҳои дигарро низ ба ҳамин тарз танзим кардан мумкин аст.

Мо кластери Kubernetes таъсис додем, ки дар он мо Istio ва як барномаи микросервиси намунавӣ, Sentiment Analysis, барои нишон додани қобилиятҳои Istio ҷойгир кардем.

Бо Istio, мо тавонистем хидматҳои худро хурд нигоҳ дорем, зеро онҳо эҳтиёҷ надоранд, ки қабатҳои такрорӣ, Вақтсанҷиҳо, сӯзандоруҳо, пайгирӣ, мониторинг. . Илова бар ин, мо усулҳои пешрафтаи озмоиш ва ҷойгиркуниро истифода бурдем: санҷиши A / B, оинасозӣ ва ройтингҳои канарӣ.

Бозгашт ба microservices бо Istio. Қисми 3

Дар маводи нав, мо бо қабатҳои ниҳоӣ дар роҳи арзиши тиҷорат сару кор хоҳем кард: аутентификатсия ва авторизатсия - ва дар Истио ин як лаззати воқеӣ аст!

Аутентификатсия ва авторизатсия дар Истио

Ман ҳеҷ гоҳ бовар намекардам, ки ман аз тасдиқ ва иҷозат илҳом гирифтаам. Истио аз нуқтаи назари технологӣ чӣ пешниҳод карда метавонад, то ин мавзӯъҳоро барои шумо шавқовар ва ҳатто бештар илҳомбахш гардонад?

Ҷавоб оддӣ аст: Истио масъулиятро барои ин қобилиятҳо аз хидматҳои шумо ба прокси Envoy интиқол медиҳад. То он даме, ки дархостҳо ба хидматрасонӣ расидаанд, онҳо аллакай тасдиқ ва ваколатдор шудаанд, аз ин рӯ танҳо навиштани рамзи барои тиҷорат муфид аст.

Садояш хуб? Биёед ба дохили он назар андозем!

Аутентификатсия бо Auth0

Ҳамчун сервер барои шахсият ва идоракунии дастрасӣ, мо Auth0-ро истифода хоҳем бурд, ки версияи озмоишӣ дорад, истифодааш осон аст ва ба ман танҳо маъқул аст. Бо вуҷуди ин, ҳамон принсипҳоро ба ҳар яки дигар татбиқ кардан мумкин аст Амалисозии OpenID Connect: KeyCloak, IdentityServer ва бисёр дигарон.

Барои оғоз кардан ба Auth0 Портали бо ҳисоби худ, иҷорагир эҷод кунед (иҷорагир - "иҷорагир", воҳиди мантиқии изолятсия, барои тафсилоти бештар нигаред хуччатхо - тахминан. тарҷума.) ва равед Барномаҳо > Барномаи пешфарзинтихоб Domain, тавре ки дар скриншот дар зер нишон дода шудааст:

Бозгашт ба microservices бо 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

Бо чунин захира, Пилот (яке аз се ҷузъи асосии ҳавопаймои идоракунӣ дар Истио - тақрибан тарҷума.) Фиристодаро барои тасдиқи дархостҳо пеш аз фиристодани онҳо ба хидматҳо танзим мекунад: sa-web-app и sa-feedback. Дар айни замон, конфигуратсия ба хидматрасонии фиристодагон татбиқ карда намешавад sa-frontend, ба мо имкон медиҳад, ки фронтентро бидуни тасдиқ тарк кунем. Барои татбиқи Сиёсат, фармонро иҷро кунед:

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

Ба саҳифа баргардед ва дархост кунед - шумо хоҳед дид, ки он бо статус ба итмом мерасад 401 беиҷозат. Акнун биёед корбарони фронтиро барои тасдиқи аутентификатсия бо Auth0 равона кунем.

Тасдиқи дархостҳо бо Auth0

Барои тасдиқи дархостҳои корбари ниҳоӣ, шумо бояд API-ро дар Auth0 эҷод кунед, ки хидматҳои тасдиқшударо (баррасиҳо, тафсилот ва рейтингҳо) намояндагӣ мекунад. Барои эҷод кардани API, гузаред Auth0 Portal > APIs > Эҷоди API ва формаро пур кунед:

Бозгашт ба microservices бо Istio. Қисми 3

Маълумоти муҳим ин аст Муайянкунандаи, ки мо баъдтар дар скрипт истифода хоҳем кард. Биёед онро чунин нависед:

  • Ҳозирини гиромӣ!: {Your_AUDIENCE}

Тафсилоти боқимонда, ки ба мо лозим аст, дар портали Auth0 дар бахш ҷойгир шудаанд Барномаҳо - интихоб кунед Аризаи санҷишӣ (ба таври худкор дар якҷоягӣ бо API сохта шудааст).

Дар ин ҷо мо менависем:

  • Domain: {DOMAIN_DOMAIN}
  • ID муштарӣ: {YOUR_CLIENT_ID}

Ба. ҳаракат кунед Аризаи санҷишӣ ба майдони матн URL-ҳои иҷозатдодашудаи зангҳои бозпас (URL-ҳои ҳалшуда барои занги бозгашт), ки дар он мо URL-ро муайян мекунем, ки занг пас аз анҷоми аутентификатсия бояд фиристода шавад. Дар ҳолати мо ин аст:

http://{EXTERNAL_IP}/callback

Ва барои URL-ҳои иҷозати баромадан (URL-ҳои иҷозатдодашуда барои баромадан) илова кунед:

http://{EXTERNAL_IP}/logout

Биёед ба фронт гузарем.

Навсозии Frontend

Гузариш ба филиал 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));
}

Барои тағир додани интерфейс барои истифодаи маълумоти иҷорагир дар Auth0, кушоед sa-frontend/src/services/Auth.js ва дар он арзишҳоеро иваз кунед, ки мо дар боло навишта будем (Auth.js):

const Config = {
    clientID: '{YOUR_CLIENT_ID}',
    domain:'{YOUR_DOMAIN}',
    audience: '{YOUR_AUDIENCE}',
    ingressIP: '{EXTERNAL_IP}' // Используется для редиректа после аутентификации
}

Ариза омода аст. Ҳангоми сохтан ва ҷобаҷогузории тағиротҳои воридшуда ID Docker-и худро дар фармонҳои зер нишон диҳед:

$ 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 Кодекси Статус, нишон медиҳад, ки дархост иҷозат дода нашудааст.

Биёед қадами оянда - иҷозати дархостҳо.

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

Аутентификатсия ба мо имкон медиҳад фаҳмем, ки корбар кист, аммо барои донистани он, ки онҳо ба чӣ дастрасӣ доранд, иҷозат лозим аст. Истио барои ин воситаҳо низ пешниҳод мекунад.

Ҳамчун мисол, биёед ду гурӯҳи корбаронро эҷод кунем (ба диаграммаи зер нигаред):

  • истифодабарандагони (истифодабарандагон) — бо дастрасӣ танҳо ба хидматҳои SA-WebApp ва SA-Frontend;
  • Модераторҳо (модераторҳо) — бо дастрасӣ ба ҳар се хидмат.

Бозгашт ба microservices бо Istio. Қисми 3
Консепсияи авторизатсия

Барои эҷоди ин гурӯҳҳо, мо тамдиди Auth0 Authorization-ро истифода мебарем ва Истиоро барои таъмини онҳо бо сатҳҳои гуногуни дастрасӣ истифода мебарем.

Насб ва конфигуратсияи Auth0 Authorization

Дар портали Auth0 ба васеъшавӣ гузаред (васеъшавии) ва насб кунед Auth0 Авторизатсия. Пас аз насб, ба Тамдиди иҷозат, ва он ҷо - ба конфигуратсияи иҷорагир тавассути клик кардани рости боло ва интихоби менюи мувофиқ (Танзимот). Гурӯҳҳоро фаъол созед (Гурӯҳҳо) ва тугмаи интишори қоидаро пахш кунед (Қоидаи интишор).

Бозгашт ба microservices бо Istio. Қисми 3

Эҷоди гурӯҳҳо

Дар тамдиди авторизатсия гузаред Гурӯҳҳои ва гурӯҳ эҷод кунед Модераторҳо. Азбаски мо ба ҳамаи корбарони тасдиқшуда ҳамчун корбарони муқаррарӣ муносибат хоҳем кард, барои онҳо гурӯҳи иловагӣ эҷод кардан лозим нест.

Гурӯҳеро интихоб кунед Модераторҳо, Пахш кунед Аъзоёнро илова кунед, ҳисоби асосии худро илова кунед. Баъзе корбаронро бе ягон гурӯҳ гузоред, то боварӣ ҳосил кунед, ки онҳо дастрасӣ надоранд. (Истифодабарандагони нав метавонанд ба таври дастӣ тавассути Auth0 Портал > Истифодабарандагон > Эҷоди корбар.)

Илова кардани даъвои гурӯҳӣ ба аломати дастрасӣ

Истифодабарандагон ба гурӯҳҳо илова карда шуданд, аммо ин маълумот бояд дар аломатҳои дастрасӣ низ инъикос карда шавад. Барои риоя кардани OpenID Connect ва ҳамзамон баргардонидани гурӯҳҳое, ки ба мо лозим аст, нишона бояд худро илова кунад даъвои фармоишӣ. Тавассути қоидаҳои Auth0 амалӣ карда мешавад.

Барои эҷод кардани қоида, ба Auth0 Portal гузаред Қоидаҳои, Пахш кунед Эҷоди қоида ва аз қолабҳо қоидаи холӣ интихоб кунед.

Бозгашт ба microservices бо Istio. Қисми 3

Рамзи зерро нусхабардорӣ кунед ва онро ҳамчун қоидаи нав захира кунед Илова кардани даъвои гурӯҳӣ (namespacedGroup.js):

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

эрод гирифтан: Ин код аввалин гурӯҳи корбаронро, ки дар тамдиди авторизатсия муайян шудааст, мегирад ва онро ба аломати дастрасӣ ҳамчун даъвои фармоишӣ илова мекунад (таҳти фазои номи он, тавре ки Auth0 талаб мекунад).

Бозгашт ба саҳифа Қоидаҳои ва санҷед, ки шумо ду қоида бо тартиби зерин навишта шудааст:

  • auth0-авторизатсия-васеъ
  • Илова кардани даъвои гурӯҳӣ

Тартиб муҳим аст, зеро майдони гурӯҳ қоидаро ба таври асинхронӣ қабул мекунад auth0-авторизатсия-васеъ ва баъд аз он бо коидаи дуюм хамчун даъво илова карда мешавад. Дар натиҷа аломати дастрасӣ ба ин монанд аст:

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

Акнун ба шумо лозим аст, ки прокси Envoy-ро барои тафтиши дастрасии корбар танзим кунед, ки барои он гурӯҳ аз даъво хориҷ карда мешавад (https://sa.io/group) дар аломати дастрасии баргардонидашуда. Ин мавзӯъ барои бахши навбатии мақола аст.

Конфигуратсияи авторизатсия дар 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

Ҳама хидматҳо ҳоло назорати дастрасиро дар асоси нақш талаб мекунанд. Ба ибораи дигар, дастрасӣ ба ҳама хидматҳо мамнӯъ аст ва боиси посух хоҳад шуд RBAC: access denied. Акнун биёед дастрасӣ ба корбарони ваколатдорро иҷозат диҳем.

Конфигуратсияи дастрасӣ барои корбарони муқаррарӣ

Ҳама корбарон бояд ба хидматҳои SA-Frontend ва SA-WebApp дастрасӣ дошта бошанд. Бо истифода аз захираҳои зерини Istio амалӣ карда мешавад:

  • Хизматрасонӣ — ҳуқуқҳоеро, ки истифодабаранда дорад, муайян мекунад;
  • ServiceRoleBinding — муайян мекунад, ки ин ServiceRole ба кӣ тааллуқ дорад.

Барои корбарони оддӣ мо дастрасӣ ба хидматҳои муайянро иҷозат медиҳем (role.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ро ба ҳамаи меҳмонони саҳифа татбиқ кунед (Мунтазам-хизматрасонии-нақш-бандӣ.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-rol.yaml):

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

Аммо мо чунин ҳуқуқҳоро танҳо барои он корбароне мехоҳем, ки аломати дастрасии онҳо даъво дорад https://sa.io/group бо маъно Moderators (mod-хизмат-нақш-бандӣ.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

Аз сабаби кэшкунии фиристодагон, барои эътибор пайдо кардани қоидаҳои иҷозатдиҳӣ метавонад якчанд дақиқа вақт гирад. Пас шумо метавонед боварӣ ҳосил кунед, ки корбарон ва модераторҳо сатҳҳои гуногуни дастрасӣ доранд.

Хулоса дар ин бахш

Ҷиддан, оё шумо ягон бор муносибати соддатар, бемаънӣ, миқёспазир ва бехатарро ба аутентификатсия ва авторизатсия дидаед?

Танҳо се захираи Istio (RbacConfig, ServiceRole ва ServiceRoleBinding) барои ноил шудан ба назорати дақиқи аутентификатсия ва иҷозати дастрасии корбари ниҳоӣ ба хидматҳо лозим буд.

Илова бар ин, мо аз хидматҳои фиристодаи худ ин масъалаҳоро ҳал карда, ба даст овардем:

  • кам кардани миқдори рамзи умумӣ, ки метавонад мушкилоти амниятӣ ва хатогиҳоро дар бар гирад;
  • кам кардани шумораи ҳолатҳои беақл, ки дар он як нуқтаи ниҳоӣ аз берун дастрас шуд ва гузориш додани онро фаромӯш кард;
  • бартараф кардани зарурати навсозии ҳама хидматҳо ҳар дафъае, ки нақш ё ҳуқуқи нав илова карда мешавад;
  • ки хидматҳои нав оддӣ, бехатар ва зуд боқӣ мемонанд.

хулоса

Истио ба гурӯҳҳо имкон медиҳад, ки захираҳои худро ба вазифаҳои муҳими тиҷорат равона созанд, бидуни илова кардани хароҷот ба хидматҳо ва баргардонидани онҳо ба ҳолати микро.

Мақола (дар се қисм) донишҳои асосӣ ва дастурҳои амалии тайёрро барои оғоз кардани Истио дар лоиҳаҳои воқеӣ пешниҳод кардааст.

PS аз тарҷумон

Инчунин дар блоги мо хонед:

Манбаъ: will.com

Илова Эзоҳ