Yn ôl i microservices gydag Istio. Rhan 3

Yn ôl i microservices gydag Istio. Rhan 3

Nodyn. traws.: Rhan gyntaf roedd y gyfres hon wedi'i neilltuo i ddod i adnabod galluoedd Istio a'u harddangos ar waith, ail — llwybro manwl gywir a rheoli traffig rhwydwaith. Nawr byddwn yn siarad am ddiogelwch: i ddangos y swyddogaethau sylfaenol sy'n gysylltiedig ag ef, mae'r awdur yn defnyddio gwasanaeth hunaniaeth Auth0, ond gellir ffurfweddu darparwyr eraill mewn ffordd debyg.

Fe wnaethom sefydlu clwstwr Kubernetes lle buom yn defnyddio Istio ac enghraifft o raglen microwasanaeth, Dadansoddiad Sentiment, i ddangos galluoedd Istio.

Gydag Istio, roeddem yn gallu cadw ein gwasanaethau'n fach oherwydd nid oes angen iddynt weithredu haenau fel Retries, Timeouts, Circuit Breakers, Olrhain, Monitro. Yn ogystal, gwnaethom ddefnyddio technegau profi a defnyddio uwch: profi A/B, adlewyrchu a chyflwyno caneri.

Yn ôl i microservices gydag Istio. Rhan 3

Yn y deunydd newydd, byddwn yn ymdrin â'r haenau olaf ar y llwybr i werth busnes: dilysu ac awdurdodi - ac yn Istio mae'n bleser pur!

Dilysu ac awdurdodi yn Istio

Ni fyddwn byth wedi credu y byddwn yn cael fy ysbrydoli gan ddilysu ac awdurdodi. Beth all Istio ei gynnig o safbwynt technoleg i wneud y pynciau hyn yn hwyl ac, hyd yn oed yn fwy felly, yn ysbrydoledig i chi?

Mae'r ateb yn syml: mae Istio yn symud cyfrifoldeb am y galluoedd hyn o'ch gwasanaethau i'r dirprwy Envoy. Erbyn i'r ceisiadau gyrraedd y gwasanaethau, maent eisoes wedi'u dilysu a'u hawdurdodi, felly'r cyfan sy'n rhaid i chi ei wneud yw ysgrifennu cod defnyddiol i fusnes.

Swnio'n dda? Gadewch i ni edrych y tu mewn!

Dilysu gydag Awd0

Fel gweinydd ar gyfer rheoli hunaniaeth a mynediad, byddwn yn defnyddio Auth0, sydd â fersiwn prawf, yn reddfol i'w ddefnyddio ac rwy'n ei hoffi. Fodd bynnag, gellir cymhwyso'r un egwyddorion i unrhyw un arall Gweithrediadau OpenID Connect: KeyCloak, IdentityServer a llawer o rai eraill.

Yn gyntaf, ewch i Porth Awd0 gyda'ch cyfrif, creu tenant (tenant - “tenant”, uned resymegol o arwahanrwydd, am ragor o fanylion gweler dogfennaeth - tua. cyfieithu.) a mynd i Ceisiadau > Ap Diofyndewis Parth, fel y dangosir yn y sgrinlun isod:

Yn ôl i microservices gydag Istio. Rhan 3

Nodwch y parth hwn yn y ffeil resource-manifests/istio/security/auth-policy.yaml (ffynhonnell):

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

Gydag adnodd o'r fath, Pilot (un o'r tair cydran Plane Rheoli sylfaenol yn Istio - tua. transl.) yn ffurfweddu Cennad i ddilysu ceisiadau cyn eu hanfon ymlaen at wasanaethau: sa-web-app и sa-feedback. Ar yr un pryd, nid yw'r ffurfweddiad yn cael ei gymhwyso i Genhadon gwasanaeth sa-frontend, gan ganiatáu inni adael y blaen heb ei ddilysu. I gymhwyso'r Polisi, rhedeg y gorchymyn:

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

Dychwelwch i'r dudalen a gwnewch gais - fe welwch ei fod yn gorffen gyda'r statws 401 heb awdurdod. Nawr, gadewch i ni ailgyfeirio defnyddwyr frontend i ddilysu gydag Auth0.

Dilysu ceisiadau gydag Auth0

I ddilysu ceisiadau defnyddiwr terfynol, mae angen i chi greu API yn Auth0 a fydd yn cynrychioli'r gwasanaethau dilys (adolygiadau, manylion, a graddfeydd). I greu API, ewch i Porth Auth0 > APIs > Creu API a llenwch y ffurflen:

Yn ôl i microservices gydag Istio. Rhan 3

Mae'r wybodaeth bwysig yma nodi, y byddwn yn ei ddefnyddio yn ddiweddarach yn y sgript. Gadewch i ni ei ysgrifennu i lawr fel hyn:

  • cynulleidfa: {YOUR_AUDIENCE}

Mae gweddill y manylion sydd eu hangen arnom wedi'u lleoli ar y Porth Auth0 yn yr adran ceisiadau - dewis Cais Prawf (wedi'i greu'n awtomatig ynghyd â'r API).

Yma byddwn yn ysgrifennu:

  • Parth: {YOUR_DOMAIN}
  • ID Cleient: {YOUR_CLIENT_ID}

Sgroliwch i Cais Prawf i faes testun URLau Galw'n Ôl a Ganiateir (URLau wedi'u datrys ar gyfer yr alwad yn ôl), lle rydym yn nodi'r URL lle dylid anfon yr alwad ar ôl cwblhau'r dilysu. Yn ein hachos ni, mae'n:

http://{EXTERNAL_IP}/callback

Ac ar gyfer URLau Allgofnodi a Ganiateir (URLs a ganiateir ar gyfer allgofnodi) ychwanegwch:

http://{EXTERNAL_IP}/logout

Gadewch i ni symud ymlaen i'r blaen.

Diweddariad Frontend

Newid i gangen auth0 ystorfa [istio-mastery]. Yn y gangen hon, mae'r cod blaen yn cael ei newid i ailgyfeirio defnyddwyr i Auth0 i'w dilysu a defnyddio tocyn JWT mewn ceisiadau i wasanaethau eraill. Gweithredir yr olaf fel a ganlyn (Ap.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));
}

I newid y blaen i ddefnyddio data tenantiaid yn Auth0, agorwch sa-frontend/src/services/Auth.js a disodli ynddo y gwerthoedd a ysgrifenasom uchod (Awd.js):

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

Mae'r cais yn barod. Nodwch eich ID Docker yn y gorchmynion isod wrth adeiladu a defnyddio'r newidiadau a wnaed:

$ 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

Rhowch gynnig ar yr app! Byddwch yn cael eich ailgyfeirio i Auth0, lle mae angen i chi fewngofnodi (neu gofrestru), ac ar ôl hynny byddwch yn cael eich anfon yn ôl i'r dudalen y bydd ceisiadau sydd eisoes wedi'u dilysu yn cael eu gwneud ohoni. Os ceisiwch y gorchmynion a grybwyllir yn rhannau cyntaf yr erthygl gyda curl, fe gewch y cod 401 Cod Statws, gan nodi nad yw'r cais wedi'i awdurdodi.

Gadewch i ni gymryd y cam nesaf - awdurdodi ceisiadau.

Awdurdodiad gydag Awd0

Mae dilysu yn ein galluogi i ddeall pwy yw defnyddiwr, ond mae angen awdurdodiad i wybod beth sydd ganddynt fynediad iddo. Mae Istio yn cynnig offer ar gyfer hyn hefyd.

Er enghraifft, gadewch i ni greu dau grŵp defnyddwyr (gweler y diagram isod):

  • Defnyddwyr (defnyddwyr) — gyda mynediad yn unig i wasanaethau SA-WebApp a SA-Frontend;
  • Cymedrolwyr (cymedrolwyr) — gyda mynediad at y tri gwasanaeth.

Yn ôl i microservices gydag Istio. Rhan 3
Cysyniad awdurdodi

I greu'r grwpiau hyn, byddwn yn defnyddio'r estyniad Awdurdodi Auth0 ac yn defnyddio Istio i ddarparu gwahanol lefelau o fynediad iddynt.

Gosod a chyfluniad Awdurdodi Auth0

Ym mhorth Auth0, ewch i estyniadau (Estyniadau) a gosod Awd0 Awdurdodiad. Ar ôl gosod, ewch i Estyniad Awdurdodiad, ac yno - i gyfluniad y tenant trwy glicio ar y dde uchaf a dewis yr opsiwn dewislen priodol (Ffurfweddiad). Ysgogi grwpiau (Grwpiau) a chliciwch ar y botwm cyhoeddi rheol (Cyhoeddi rheol).

Yn ôl i microservices gydag Istio. Rhan 3

Creu grwpiau

Yn Estyniad Awdurdodi ewch i grwpiau a chreu grŵp Safonwyr. Gan y byddwn yn trin pob defnyddiwr dilys fel defnyddwyr rheolaidd, nid oes angen creu grŵp ychwanegol ar eu cyfer.

Dewiswch grŵp Safonwyr, Gwasg Ychwanegu Aelodau, ychwanegwch eich prif gyfrif. Gadael rhai defnyddwyr heb unrhyw grŵp i wneud yn siŵr eu bod yn cael eu gwrthod mynediad. (Gellir creu defnyddwyr newydd â llaw trwy Porth Auth0 > Defnyddwyr > Creu Defnyddiwr.)

Ychwanegu Hawliad Grŵp i'r Tocyn Mynediad

Mae defnyddwyr wedi'u hychwanegu at grwpiau, ond mae'n rhaid i'r wybodaeth hon hefyd gael ei hadlewyrchu mewn tocynnau mynediad. Er mwyn cydymffurfio ag OpenID Connect ac ar yr un pryd dychwelyd y grwpiau sydd eu hangen arnom, bydd angen i'r tocyn ychwanegu ei un ei hun hawliad arferiad. Wedi'i weithredu trwy reolau Auth0.

I greu rheol, ewch i Auth0 Portal i Rheolau, Gwasg Creu Rheol a dewiswch reol wag o'r templedi.

Yn ôl i microservices gydag Istio. Rhan 3

Copïwch y cod isod a'i gadw fel rheol newydd Ychwanegu Hawliad Grŵp (namespacedGroup.js):

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

Nodyn: Mae'r cod hwn yn cymryd y grŵp defnyddwyr cyntaf a ddiffinnir yn yr Estyniad Awdurdodi ac yn ei ychwanegu at y tocyn mynediad fel hawliad arferol (o dan ei ofod enw, fel sy'n ofynnol gan Auth0).

Dychwelyd i'r dudalen Rheolau a gwiriwch fod gennych ddwy reol wedi'u hysgrifennu yn y drefn ganlynol:

  • auth0-awdurdodiad-estyniad
  • Ychwanegu Hawliad Grŵp

Mae'r drefn yn bwysig oherwydd bod maes y grŵp yn derbyn y rheol yn anghydamserol auth0-awdurdodiad-estyniad ac wedi hyny ychwanegir ef fel honiad gan yr ail reol. Y canlyniad yw tocyn mynediad fel hyn:

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

Nawr mae angen i chi ffurfweddu'r dirprwy Envoy i wirio mynediad defnyddwyr, a bydd y grŵp yn cael ei dynnu o'r hawliad ar ei gyfer (https://sa.io/group) yn y tocyn mynediad a ddychwelwyd. Dyma'r pwnc ar gyfer adran nesaf yr erthygl.

Cyfluniad awdurdodi yn Istio

Er mwyn cael awdurdodiad i weithio, rhaid i chi alluogi RBAC ar gyfer Istio. I wneud hyn, byddwn yn defnyddio'r ffurfweddiad canlynol:

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" 

Esboniadau:

  • 1 — galluogi RBAC yn unig ar gyfer gwasanaethau a gofodau enwau a restrir yn y maes Inclusion;
  • 2 — rydym yn rhestru rhestr o'n gwasanaethau.

Gadewch i ni gymhwyso'r ffurfweddiad gyda'r gorchymyn canlynol:

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

Bellach mae angen Rheoli Mynediad Seiliedig ar Rôl ar bob gwasanaeth. Mewn geiriau eraill, gwaherddir mynediad i bob gwasanaeth a bydd yn arwain at ymateb RBAC: access denied. Nawr gadewch i ni ganiatáu mynediad i ddefnyddwyr awdurdodedig.

Cyfluniad mynediad ar gyfer defnyddwyr rheolaidd

Rhaid i bob defnyddiwr gael mynediad at wasanaethau SA-Frontend a SA-WebApp. Wedi'i weithredu gan ddefnyddio'r adnoddau Istio canlynol:

  • GwasanaethRôl — yn pennu'r hawliau sydd gan y defnyddiwr;
  • GwasanaethRoleBinding — sy'n pennu i bwy y mae'r Rôl Gwasanaeth hon yn perthyn.

Ar gyfer defnyddwyr cyffredin byddwn yn caniatáu mynediad i rai gwasanaethau (gwasanaeth.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: ["*"]

A thrwy regular-user-binding cymhwyso ServiceRole i bob ymwelydd tudalen (rheolaidd-defnyddiwr-gwasanaeth-rôl-rhwymo.yaml):

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

A yw "pob defnyddiwr" yn golygu y bydd defnyddwyr heb eu dilysu hefyd yn cael mynediad i SA WebApp? Na, bydd y polisi yn gwirio dilysrwydd tocyn JWT.

Gadewch i ni gymhwyso'r ffurfweddiadau:

$ 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

Cyfluniad mynediad ar gyfer cymedrolwyr

Ar gyfer cymedrolwyr, rydym am alluogi mynediad i bob gwasanaeth (mod-gwasanaeth-rôl.yaml):

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

Ond rydym eisiau hawliau o'r fath yn unig ar gyfer y defnyddwyr hynny y mae eu tocyn mynediad yn cynnwys hawliad https://sa.io/group gydag ystyr Moderators (mod-gwasanaeth-rôl-rhwymo.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" 

Gadewch i ni gymhwyso'r ffurfweddiadau:

$ 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

Oherwydd cadw cenhadon, gall gymryd ychydig funudau i reolau awdurdodi ddod i rym. Yna gallwch sicrhau bod gan ddefnyddwyr a chymedrolwyr lefelau mynediad gwahanol.

Casgliad ar y rhan hon

Ond o ddifrif, a ydych chi erioed wedi gweld dull symlach, diymdrech, graddadwy a diogel o ddilysu ac awdurdodi?

Dim ond tri adnodd Istio (RbacConfig, ServiceRole, a ServiceRoleBinding) oedd eu hangen i gyflawni rheolaeth fanwl dros ddilysu ac awdurdodi mynediad defnyddwyr terfynol at wasanaethau.

Yn ogystal, rydym wedi cymryd gofal o’r materion hyn allan o’n gwasanaethau llysgennad, gan gyflawni:

  • lleihau faint o god generig a allai gynnwys problemau diogelwch a bygiau;
  • lleihau nifer y sefyllfaoedd gwirion lle daeth un pwynt terfyn i fod yn hygyrch o'r tu allan ac wedi anghofio rhoi gwybod amdano;
  • dileu'r angen i ddiweddaru pob gwasanaeth bob tro yr ychwanegir rôl neu hawl newydd;
  • bod gwasanaethau newydd yn parhau i fod yn syml, yn ddiogel ac yn gyflym.

Allbwn

Mae Istio yn caniatáu i dimau ganolbwyntio eu hadnoddau ar dasgau busnes-gritigol heb ychwanegu gorbenion at wasanaethau, gan eu dychwelyd i statws micro.

Roedd yr erthygl (mewn tair rhan) yn darparu gwybodaeth sylfaenol a chyfarwyddiadau ymarferol parod ar gyfer dechrau gydag Istio mewn prosiectau go iawn.

PS gan y cyfieithydd

Darllenwch hefyd ar ein blog:

Ffynhonnell: hab.com

Ychwanegu sylw