Istio ашиглан микро үйлчилгээ рүү буцах. 3-р хэсэг

Istio ашиглан микро үйлчилгээ рүү буцах. 3-р хэсэг

Анхаарна уу. орчуулга.: Нэгдүгээр хэсэг Энэ цуврал нь Istio-ийн чадавхтай танилцаж, тэдгээрийг үйл ажиллагаандаа харуулахад зориулагдсан болно. хоёрдугаарт - нарийн тохируулсан чиглүүлэлт ба сүлжээний хөдөлгөөний менежмент. Одоо бид аюулгүй байдлын талаар ярих болно: үүнтэй холбоотой үндсэн функцуудыг харуулахын тулд зохиогч Auth0 таних үйлчилгээг ашигладаг боловч бусад үйлчилгээ үзүүлэгчдийг үүнтэй төстэй байдлаар тохируулж болно.

Бид Istio-г байршуулсан Kubernetes кластер болон Istio-ийн чадавхийг харуулахын тулд "Sentiment Analysis" хэмээх бичил үйлчилгээний жишээ программыг байгуулсан.

Istio-ийн тусламжтайгаар бид үйлчилгээгээ жижиг байлгах боломжтой байсан, учир нь тэд дахин оролдох, завсарлага, таслуур, мөрдөх, хянах зэрэг давхаргыг хэрэгжүүлэх шаардлагагүй. . Нэмж дурдахад бид A/B тест, толин тусгал болон канарын өнхрөлт зэрэг дэвшилтэт туршилт, байршуулалтын техникийг ашигласан.

Istio ашиглан микро үйлчилгээ рүү буцах. 3-р хэсэг

Шинэ материалд бид бизнесийн үнэ цэнийн зам дахь эцсийн давхаргыг авч үзэх болно: баталгаажуулалт ба зөвшөөрөл - мөн Istio-д энэ нь үнэхээр таашаал юм!

Istio дахь баталгаажуулалт, зөвшөөрөл

Баталгаажуулалт, зөвшөөрлөөр өдөөгдөнө гэдэгт би хэзээ ч итгэхгүй байсан. Эдгээр сэдвүүдийг хөгжилтэй, бүр илүү урам зоригтой болгохын тулд Istio технологийн үүднээс юу санал болгож чадах вэ?

Хариулт нь энгийн: Istio эдгээр чадваруудын хариуцлагыг таны үйлчилгээнээс Envoy прокси руу шилжүүлдэг. Хүсэлтүүд үйлчилгээнд хүрэх үед тэдгээр нь аль хэдийн баталгаажсан бөгөөд зөвшөөрөл авсан тул та бизнест хэрэгтэй код бичихэд л хангалттай.

Сайхан сонсогдож байна? Дотор нь харцгаая!

Auth0 ашиглан баталгаажуулалт

Бид таних болон хандалтын удирдлагын серверийн хувьд ашиглахад хялбар, туршилтын хувилбартай Auth0-г ашиглах болно. Гэсэн хэдий ч ижил зарчмуудыг бусад бүх зүйлд хэрэглэж болно OpenID Connect хэрэгжүүлэлтүүд: KeyCloak, IdentityServer болон бусад олон.

Эхлэхийн тулд дараах руу очно уу Auth0 портал өөрийн дансаа ашиглан түрээслэгч үүсгэнэ үү (түрээслэгч - "түрээслэгч", тусгаарлах логик нэгж, дэлгэрэнгүй мэдээллийг үзнэ үү баримт бичиг - ойролцоогоор. орчуул.) болон очих Програмууд > Өгөгдмөл програмсонгох домэйн, доорх дэлгэцийн агшинд үзүүлсэн шиг:

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

Ийм нөөцтэй бол нисгэгч (Istio-ийн гурван үндсэн хяналтын онгоцны бүрэлдэхүүн хэсгүүдийн нэг - ойролцоогоор орчуулга.) Хүсэлтүүдийг үйлчилгээ рүү дамжуулахаас өмнө баталгаажуулах элчийг тохируулна: 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 ашиглан хүсэлтийг баталгаажуулж байна

Эцсийн хэрэглэгчийн хүсэлтийг баталгаажуулахын тулд та Auth0-д баталгаажуулсан үйлчилгээг (шүүмж, дэлгэрэнгүй мэдээлэл, үнэлгээ) төлөөлөх API үүсгэх хэрэгтэй. API үүсгэхийн тулд дараах руу очно уу Auth0 Портал > APIs > API үүсгэх болон маягтыг бөглөнө үү:

Istio ашиглан микро үйлчилгээ рүү буцах. 3-р хэсэг

Энд байгаа чухал мэдээлэл Түлхүүр үг, бид үүнийг дараа нь скрипт дээр ашиглах болно. Үүнийг ингэж бичье.

  • Үзэгчид: {Таны_үзэгчид}

Бидэнд хэрэгтэй үлдсэн дэлгэрэнгүй мэдээллийг Auth0 портал хэсэгт байгаа Програм - сонгох Туршилтын програм (API-тай хамт автоматаар үүсгэгдсэн).

Энд бид бичих болно:

  • домэйн: {YOUR_DOMAIN}
  • Үйлчлүүлэгчийн дугаар: {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}' // Используется для редиректа после аутентификации
}

Өргөдөл бэлэн боллоо. Өөрчлөлтүүдийг хийж, байршуулахдаа доорх тушаалд өөрийн 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 Статусын код, хүсэлтийг зөвшөөрөхгүй гэсэн дохио.

Дараагийн алхамыг хийцгээе - хүсэлтийг зөвшөөрөх.

Auth0-тэй зөвшөөрөл

Баталгаажуулалт нь хэрэглэгчийг хэн болохыг ойлгох боломжийг олгодог боловч тэд юунд нэвтэрч байгааг мэдэхийн тулд зөвшөөрөл шаардлагатай. Istio нь үүнд зориулсан хэрэгслүүдийг санал болгодог.

Жишээлбэл, хоёр хэрэглэгчийн бүлгийг үүсгэцгээе (доорх диаграмыг харна уу):

  • Хэрэглэгчид (хэрэглэгч) — зөвхөн SA-WebApp болон SA-Frontend үйлчилгээнд хандах боломжтой;
  • Зохицуулагчид (зохицуулагчид) — бүх гурван үйлчилгээнд хандах боломжтой.

Istio ашиглан микро үйлчилгээ рүү буцах. 3-р хэсэг
Зөвшөөрлийн тухай ойлголт

Эдгээр бүлгүүдийг үүсгэхийн тулд бид Auth0 Authorization өргөтгөлийг ашиглаж, Istio-г ашиглан тэдэнд өөр өөр түвшний хандалт өгөх болно.

Auth0 Authorization-ийг суулгах, тохируулах

Auth0 портал дээр өргөтгөлүүд рүү очно уу (Өргөтгөлүүд) болон суулгана уу Auth0 Зөвшөөрөл. Суулгасны дараа руу очно уу Зөвшөөрлийн өргөтгөл, мөн тэнд - баруун дээд буланд товшоод тохирох цэсийн сонголтыг сонгон түрээслэгчийн тохиргоо руу очно уу. (Тохиргоо). Бүлгүүдийг идэвхжүүлэх (Бүлэг) мөн дүрмийг нийтлэх товчийг дарна уу (Нийтлэх дүрэм).

Istio ашиглан микро үйлчилгээ рүү буцах. 3-р хэсэг

Бүлэг үүсгэх

Зөвшөөрлийн өргөтгөл хэсэгт очно уу Бүлэг мөн бүлэг үүсгэх Зохицуулагчид. Бид баталгаажуулсан бүх хэрэглэгчдийг энгийн хэрэглэгч гэж үзэх тул тэдэнд нэмэлт бүлэг үүсгэх шаардлагагүй.

Бүлэг сонгоно уу Зохицуулагчид, дарна уу Гишүүд нэмэх, үндсэн бүртгэлээ нэмнэ үү. Зарим хэрэглэгчдийг ямар ч бүлэггүй орхиж, тэдэнд хандах эрхгүй байгаа эсэхийг шалгаарай. (Шинэ хэрэглэгчдийг ашиглан гараар үүсгэж болно Auth0 Портал > Хэрэглэгчид > Хэрэглэгч үүсгэх.)

Токен руу нэвтрэхийн тулд бүлгийн нэхэмжлэлийг нэмнэ үү

Хэрэглэгчдийг бүлгүүдэд нэмсэн боловч энэ мэдээлэл нь хандалтын жетонд мөн тусгагдсан байх ёстой. OpenID Connect-ийг дагаж мөрдөж, нэгэн зэрэг бидэнд хэрэгтэй бүлгүүдийг буцааж өгөхийн тулд жетон өөрөө нэмэх шаардлагатай болно захиалгат нэхэмжлэл. Auth0 дүрмээр хэрэгжсэн.

Дүрэм үүсгэхийн тулд Auth0 портал руу очно уу журам, дарна уу Дүрэм үүсгэх болон загваруудаас хоосон дүрмийг сонгоно уу.

Istio ашиглан микро үйлчилгээ рүү буцах. 3-р хэсэг

Доорх кодыг хуулж аваад шинэ дүрэм болгон хадгална уу Бүлгийн нэхэмжлэлийг нэмэх (namespacedGroup.js):

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

тайлбар: Энэ код нь Зөвшөөрлийн өргөтгөлд тодорхойлсон анхны хэрэглэгчийн бүлгийг авч, хандалтын токенд захиалгат нэхэмжлэл болгон нэмнэ (Autth0-ийн шаардлагын дагуу нэрийн талбарт).

Хуудас руу буцах журам Дараах дарааллаар бичигдсэн хоёр дүрэм байгаа эсэхийг шалгана уу:

  • auth0-зөвшөөрөл-өргөтгөл
  • Бүлгийн нэхэмжлэлийг нэмэх

Бүлгийн талбар нь дүрмийг асинхрон байдлаар хүлээн авдаг тул дараалал нь чухал юм auth0-зөвшөөрөл-өргөтгөл үүний дараа хоёр дахь дүрмээр нэхэмжлэлийн шаардлага болгон нэмсэн. Үр дүн нь иймэрхүү хандалтын токен юм:

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

Одоо та бүлгийн нэхэмжлэлээс хасагдах хэрэглэгчийн хандалтыг шалгахын тулд Envoy прокси-г тохируулах хэрэгтэй (https://sa.io/group) буцаасан хандалтын тэмдэгт. Энэ бол нийтлэлийн дараагийн хэсгийн сэдэв юм.

Istio дахь зөвшөөрлийн тохиргоо

Ажиллах зөвшөөрөл авахын тулд Istio-д зориулсан RBAC-г идэвхжүүлэх ёстой. Үүнийг хийхийн тулд бид дараах тохиргоог ашиглана.

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 хэнд хамаарахыг тодорхойлно.

Энгийн хэрэглэгчдийн хувьд бид тодорхой үйлчилгээнд хандахыг зөвшөөрөх болно (үйлчилгээний үүрэг.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-role.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-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

Элчүүдэд кэш хийж байгаа тул зөвшөөрлийн дүрэм хүчин төгөлдөр болох хүртэл хэдэн минут болж магадгүй. Дараа нь та хэрэглэгчид болон зохицуулагчид өөр өөр түвшний хандалттай эсэхийг баталгаажуулах боломжтой.

Энэ хэсгийн дүгнэлт

Үнэнийг хэлэхэд, та гэрчлэл, зөвшөөрлийн илүү энгийн, хялбар, өргөтгөх боломжтой, аюулгүй аргыг харж байсан уу?

Зөвхөн гурван Istio нөөц (RbacConfig, ServiceRole, болон ServiceRoleBinding) нь баталгаажуулалт болон эцсийн хэрэглэгчийн үйлчилгээнд хандах эрх олгоход нарийн хяналт тавих шаардлагатай байсан.

Нэмж дурдахад, бид элч төлөөлөгчийн албадаа эдгээр асуудлыг шийдэж, дараах үр дүнд хүрсэн.

  • аюулгүй байдлын асуудал, алдаа агуулсан байж болох ерөнхий кодын хэмжээг багасгах;
  • нэг төгсгөлийн цэг гаднаас нь хүртээмжтэй болж, мэдээлэхээ мартсан тэнэг нөхцөл байдлын тоог багасгах;
  • шинэ үүрэг, эрх нэмэгдэх бүрд бүх үйлчилгээг шинэчлэх хэрэгцээг арилгах;
  • шинэ үйлчилгээнүүд энгийн, аюулгүй, хурдан хэвээр байна.

дүгнэлт

Istio нь багуудад үйлчилгээнд нэмэлт зардал оруулахгүйгээр бизнесийн чухал ажлуудад нөөцөө төвлөрүүлж, бичил статус руу буцаах боломжийг олгодог.

Энэхүү нийтлэлд (гурван хэсгээс бүрдсэн) бодит төслүүдэд Istio-г эхлүүлэх үндсэн мэдлэг, бэлэн практик зааварчилгааг өгсөн болно.

Орчуулагчийн жич

Мөн манай блог дээрээс уншина уу:

Эх сурвалж: www.habr.com

сэтгэгдэл нэмэх