Шарҳ. тарҷума.:
Мо кластери Kubernetes таъсис додем, ки дар он мо Istio ва як барномаи микросервиси намунавӣ, Sentiment Analysis, барои нишон додани қобилиятҳои Istio ҷойгир кардем.
Бо Istio, мо тавонистем хидматҳои худро хурд нигоҳ дорем, зеро онҳо эҳтиёҷ надоранд, ки қабатҳои такрорӣ, Вақтсанҷиҳо, сӯзандоруҳо, пайгирӣ, мониторинг. . Илова бар ин, мо усулҳои пешрафтаи озмоиш ва ҷойгиркуниро истифода бурдем: санҷиши A / B, оинасозӣ ва ройтингҳои канарӣ.
Дар маводи нав, мо бо қабатҳои ниҳоӣ дар роҳи арзиши тиҷорат сару кор хоҳем кард: аутентификатсия ва авторизатсия - ва дар Истио ин як лаззати воқеӣ аст!
Аутентификатсия ва авторизатсия дар Истио
Ман ҳеҷ гоҳ бовар намекардам, ки ман аз тасдиқ ва иҷозат илҳом гирифтаам. Истио аз нуқтаи назари технологӣ чӣ пешниҳод карда метавонад, то ин мавзӯъҳоро барои шумо шавқовар ва ҳатто бештар илҳомбахш гардонад?
Ҷавоб оддӣ аст: Истио масъулиятро барои ин қобилиятҳо аз хидматҳои шумо ба прокси Envoy интиқол медиҳад. То он даме, ки дархостҳо ба хидматрасонӣ расидаанд, онҳо аллакай тасдиқ ва ваколатдор шудаанд, аз ин рӯ танҳо навиштани рамзи барои тиҷорат муфид аст.
Садояш хуб? Биёед ба дохили он назар андозем!
Аутентификатсия бо Auth0
Ҳамчун сервер барои шахсият ва идоракунии дастрасӣ, мо Auth0-ро истифода хоҳем бурд, ки версияи озмоишӣ дорад, истифодааш осон аст ва ба ман танҳо маъқул аст. Бо вуҷуди ин, ҳамон принсипҳоро ба ҳар яки дигар татбиқ кардан мумкин аст
Барои оғоз кардан ба
Ин доменро дар файл муайян кунед 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 ва формаро пур кунед:
Маълумоти муҳим ин аст Муайянкунандаи, ки мо баъдтар дар скрипт истифода хоҳем кард. Биёед онро чунин нависед:
- Ҳозирини гиромӣ!: {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 дар дархостҳо ба хидматҳои дигар истифода шавад. Охирин ба таври зерин амалӣ карда мешавад (
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
ва дар он арзишҳоеро иваз кунед, ки мо дар боло навишта будем (
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;
- Модераторҳо (модераторҳо) — бо дастрасӣ ба ҳар се хидмат.
Консепсияи авторизатсия
Барои эҷоди ин гурӯҳҳо, мо тамдиди Auth0 Authorization-ро истифода мебарем ва Истиоро барои таъмини онҳо бо сатҳҳои гуногуни дастрасӣ истифода мебарем.
Насб ва конфигуратсияи Auth0 Authorization
Дар портали Auth0 ба васеъшавӣ гузаред (васеъшавии) ва насб кунед Auth0 Авторизатсия. Пас аз насб, ба Тамдиди иҷозат, ва он ҷо - ба конфигуратсияи иҷорагир тавассути клик кардани рости боло ва интихоби менюи мувофиқ (Танзимот). Гурӯҳҳоро фаъол созед (Гурӯҳҳо) ва тугмаи интишори қоидаро пахш кунед (Қоидаи интишор).
Эҷоди гурӯҳҳо
Дар тамдиди авторизатсия гузаред Гурӯҳҳои ва гурӯҳ эҷод кунед Модераторҳо. Азбаски мо ба ҳамаи корбарони тасдиқшуда ҳамчун корбарони муқаррарӣ муносибат хоҳем кард, барои онҳо гурӯҳи иловагӣ эҷод кардан лозим нест.
Гурӯҳеро интихоб кунед Модераторҳо, Пахш кунед Аъзоёнро илова кунед, ҳисоби асосии худро илова кунед. Баъзе корбаронро бе ягон гурӯҳ гузоред, то боварӣ ҳосил кунед, ки онҳо дастрасӣ надоранд. (Истифодабарандагони нав метавонанд ба таври дастӣ тавассути Auth0 Портал > Истифодабарандагон > Эҷоди корбар.)
Илова кардани даъвои гурӯҳӣ ба аломати дастрасӣ
Истифодабарандагон ба гурӯҳҳо илова карда шуданд, аммо ин маълумот бояд дар аломатҳои дастрасӣ низ инъикос карда шавад. Барои риоя кардани OpenID Connect ва ҳамзамон баргардонидани гурӯҳҳое, ки ба мо лозим аст, нишона бояд худро илова кунад
Барои эҷод кардани қоида, ба Auth0 Portal гузаред Қоидаҳои, Пахш кунед Эҷоди қоида ва аз қолабҳо қоидаи холӣ интихоб кунед.
Рамзи зерро нусхабардорӣ кунед ва онро ҳамчун қоидаи нав захира кунед Илова кардани даъвои гурӯҳӣ (
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 ба кӣ тааллуқ дорад.
Барои корбарони оддӣ мо дастрасӣ ба хидматҳои муайянро иҷозат медиҳем (
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ро ба ҳамаи меҳмонони саҳифа татбиқ кунед (
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
Конфигуратсияи дастрасӣ барои модераторҳо
Барои модераторҳо, мо мехоҳем дастрасӣ ба ҳама хидматҳоро (
apiVersion: "rbac.istio.io/v1alpha1"
kind: ServiceRole
metadata:
name: mod-user
namespace: default
spec:
rules:
- services: ["*"]
paths: ["*"]
methods: ["*"]
Аммо мо чунин ҳуқуқҳоро танҳо барои он корбароне мехоҳем, ки аломати дастрасии онҳо даъво дорад https://sa.io/group
бо маъно Moderators
(
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 аз тарҷумон
Инчунин дар блоги мо хонед:
- "Бозгашт ба microservices бо Istio":
қисми 1 (муқаддима ба хусусиятҳои асосӣ) ,қисми 2 (маршрут, назорати ҳаракат) ; - «
Conduit - шабакаи хидматрасонии сабук барои Kubernetes »; - «
Шабакаи хидматрасонӣ чист ва чаро ба ман ба он ниёз дорам [барои барномаи абрӣ бо микросервисҳо]? ".
Манбаъ: will.com