Deui ka microservices kalawan Istio. Bagian 3

Deui ka microservices kalawan Istio. Bagian 3

Catetan. narjamahkeun.: Bagian munggaran séri ieu dikhususkeun pikeun terang kamampuan Istio sareng nunjukkeun aranjeunna dina aksi, kadua - routing finely katala sarta manajemén lalulintas jaringan. Ayeuna urang ngobrol ngeunaan kaamanan: pikeun nunjukkeun fungsi dasar anu aya hubunganana, panulis nganggo jasa identitas Auth0, tapi panyadia anu sanés tiasa dikonpigurasi ku cara anu sami.

Kami nyetél klaster Kubernetes dimana kami nyebarkeun Istio sareng conto aplikasi microservice, Analisis Sentimen, pikeun nunjukkeun kamampuan Istio.

Kalayan Istio, kami tiasa ngajaga jasa kami leutik sabab henteu kedah nerapkeun lapisan sapertos Retries, Timeouts, Circuit Breakers, Tracing, Monitoring. . Salaku tambahan, kami nganggo tés canggih sareng téknik panyebaran: tés A / B, mirroring sareng rollouts kanaria.

Deui ka microservices kalawan Istio. Bagian 3

Dina bahan anyar, urang bakal nungkulan lapisan ahir dina jalan ka nilai bisnis: auténtikasi jeung otorisasina - sarta di Istio éta senang nyata!

Auténtikasi jeung otorisasina di Istio

Abdi henteu kantos percanten yén kuring bakal diideuan ku auténtikasi sareng otorisasina. Naon anu tiasa ditawarkeun Istio tina sudut pandang téknologi pikeun ngajantenkeun topik ieu pikaresepeun sareng, langkung-langkung, mereun pikeun anjeun?

Jawabanna basajan: Istio mindahkeun tanggung jawab pikeun kamampuan ieu tina jasa anjeun ka proxy Utusan. Nalika paménta ngahontal jasa, aranjeunna parantos dioténtikasi sareng otorisasi, janten anu anjeun kedah laksanakeun nyaéta nyerat kode anu mangpaat pikeun bisnis.

Sigana saé? Hayu urang tingali di jero!

Auténtikasi sareng Auth0

Salaku pangladén pikeun idéntitas sareng manajemén aksés, kami bakal nganggo Auth0, anu ngagaduhan versi percobaan, intuitif pikeun dianggo sareng kuring ngan ukur resep. Nanging, prinsip anu sami tiasa diterapkeun ka anu sanés palaksanaan OpenID Connect: KeyCloak, IdentityServer sarta loba batur.

Mimiti, angkat ka Portal Auth0 kalawan akun anjeun, nyieun tenant a (tenant - "tenant", unit logis tina isolasi, pikeun leuwih rinci tingali dokuméntasi - kira-kira. tarjamah.) jeung indit ka Aplikasi > Aplikasi Defaultmilih domain, sakumaha ditémbongkeun dina screenshot handap:

Deui ka microservices kalawan Istio. Bagian 3

Sebutkeun domain ieu dina file resource-manifests/istio/security/auth-policy.yaml (sumber):

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

Kalayan sumberdaya sapertos kitu, Pilot (salah sahiji tilu komponén Control Plane dasar di Istio - approx. transl.) ngonpigurasikeun Utusan pikeun ngaoténtikasi pamundut sateuacan diteruskeun kana jasa: sa-web-app и sa-feedback. Dina waktos anu sami, konfigurasi henteu dilarapkeun kana jasa Envoys sa-frontend, ngamungkinkeun urang ninggalkeun frontend unauthenticated. Pikeun nerapkeun Kabijakan, jalankeun paréntah:

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

Balik deui ka halaman sareng ngadamel pamundut - anjeun bakal ningali yén éta ditungtungan ku status 401 diidinan. Ayeuna hayu urang alihan pamaké frontend pikeun auténtikasi jeung Auth0.

Authenticating requests kalawan Auth0

Pikeun ngabuktoskeun kaaslianana pamundut pangguna akhir, anjeun kedah nyiptakeun API di Auth0 anu bakal ngagambarkeun jasa anu dioténtikasi (ulasan, detil, sareng rating). Pikeun nyieun API, buka Portal Auth0 > API > Jieun API sareng ngeusian formulir:

Deui ka microservices kalawan Istio. Bagian 3

Inpormasi penting di dieu nyaéta mikawanohan, anu bakal kami anggo engké dina naskah. Hayu urang nyerat sapertos kieu:

  • nu haladir: {PANONTON_ANDA}

Rincian sésana anu urang peryogikeun aya dina Portal Auth0 dina bagian éta aplikasi - milih Aplikasi Tes (dijieun otomatis babarengan jeung API).

Di dieu urang bakal nulis:

  • domain: {DOMAIN_ANDA}
  • Klién Id: {YOUR_CLIENT_ID}

Gulung ka Aplikasi Tes kana widang téks URL Callback Diidinan (URL anu direngsekeun pikeun callback), dimana urang nangtukeun URL dimana telepon kedah dikirim saatos auténtikasi réngsé. Dina kasus urang éta:

http://{EXTERNAL_IP}/callback

Sareng pikeun Diidinan Logout URL (URL diwenangkeun pikeun kaluar) tambahkeun:

http://{EXTERNAL_IP}/logout

Hayu urang ngaléngkah ka frontend.

Pembaruan hareup

Pindah ka cabang auth0 gudang [istio-mastery]. Dina cabang ieu, kodeu frontend dirobah pikeun alihan pamaké pikeun Auth0 pikeun auténtikasi sarta ngagunakeun token JWT dina requests kana jasa lianna. Panungtungan dilaksanakeun saperti kieu (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));
}

Pikeun ngarobah frontend ngagunakeun data tenant di Auth0, buka sa-frontend/src/services/Auth.js sareng ganti di dinya nilai-nilai anu kami tulis di luhur (Auth.js):

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

aplikasi geus siap. Sebutkeun ID Docker anjeun dina paréntah di handap nalika ngawangun sareng nyebarkeun parobihan anu dilakukeun:

$ 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

Coba aplikasina! Anjeun bakal dialihkeun ka Auth0, dimana anjeun kedah log in (atanapi ngadaptar), saatos anjeun bakal dikirim deui ka halaman dimana pamundut anu parantos dioténtikasi bakal dilakukeun. Upami anjeun nyobian paréntah anu disebatkeun dina bagian mimiti tulisan nganggo curl, anjeun bakal nampi kodeu 401 Kodeu Status, signalling yén pamundut teu otorisasi.

Hayu urang nyandak lengkah saterusna - requests authorize.

Otorisasina sareng Auth0

Auténtikasi ngamungkinkeun urang ngartos saha pangguna, tapi otorisasina diperyogikeun pikeun terang naon anu aranjeunna aksés. Istio nawiskeun alat pikeun ieu ogé.

Salaku conto, hayu urang ngadamel dua grup pangguna (tingali diagram di handap ieu):

  • Pamaké (pamaké) — ngan ukur aksés kana jasa SA-WebApp sareng SA-Frontend;
  • Moderator (moderator) - kalawan aksés ka tilu jasa.

Deui ka microservices kalawan Istio. Bagian 3
Konsep otorisasi

Pikeun nyieun grup ieu, urang bakal ngagunakeun extension Auth0 Otorisasi sarta ngagunakeun Istio nyadiakeun aranjeunna kalayan tingkat aksés béda.

Pamasangan sareng konfigurasi Otorisasi Auth0

Dina portal Auth0, buka ekstensi (ekstensi) sareng pasang Otorisasina Auth0. Saatos instalasi, buka Otorisasina Extension, sareng aya - kana konfigurasi panyewa ku ngaklik di katuhu luhur sareng milih pilihan ménu anu pas (Konfigurasi). Aktipkeun grup (Grup) teras klik dina tombol aturan nyebarkeun (Nyebarkeun aturan).

Deui ka microservices kalawan Istio. Bagian 3

Nyieun grup

Dina Otorisasina Extension buka Grup jeung nyieun grup Moderator. Kusabab urang bakal ngarawat sadaya pangguna anu dioténtikasi salaku pangguna biasa, teu kedah nyiptakeun grup tambahan pikeun aranjeunna.

Pilih grup Moderator, Pencét Tambahkeun Anggota, tambahkeun akun utama anjeun. Ninggalkeun sababaraha pangguna tanpa grup pikeun mastikeun aranjeunna ditolak aksés. (Pamaké anyar bisa dijieun sacara manual via Portal Auth0 > Pamaké > Jieun Pamaké.)

Tambahkeun Klaim Grup kana Token Aksés

Pamaké geus ditambahkeun kana grup, tapi informasi ieu ogé kudu reflected dina token aksés. Pikeun matuh OpenID Connect sareng dina waktos anu sami ngabalikeun grup anu urang peryogikeun, tokenna kedah nambihan nyalira ngaku custom. Dilaksanakeun ngaliwatan aturan Auth0.

Pikeun nyieun aturan, buka Auth0 Portal ka aturan, Pencét Jieun Aturan tur pilih aturan kosong tina témplat.

Deui ka microservices kalawan Istio. Bagian 3

Salin kodeu di handap tur simpen salaku aturan anyar Tambahkeun Klaim Grup (namespacedGroup.js):

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

nyarios: Kode ieu nyokot grup pamaké munggaran didefinisikeun dina Otorisasina Extension tur nambahkeun kana token aksés salaku klaim custom (dina ngaranspasi na, sakumaha diperlukeun ku Auth0).

Balik deui ka kaca aturan sareng pariksa yén anjeun gaduh dua aturan anu ditulis dina urutan ieu:

  • auth0-otorisasi-ekstensi
  • Tambahkeun Klaim Grup

Urutan penting sabab widang grup narima aturan asynchronously auth0-otorisasi-ekstensi sarta sanggeus éta ditambahkeun salaku klaim ku aturan kadua. Hasilna mangrupikeun token aksés sapertos kieu:

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

Ayeuna anjeun kedah ngonpigurasikeun proxy Utusan pikeun mariksa aksés pangguna, dimana grup bakal ditarik tina klaim (https://sa.io/group) dina token aksés balik. Ieu topik pikeun bagian saterusna artikel.

Konfigurasi otorisasina di Istio

Pikeun otorisasina dianggo, anjeun kedah ngaktipkeun RBAC pikeun Istio. Jang ngalampahkeun ieu, urang bakal ngagunakeun konfigurasi handap:

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" 

Katerangan:

  • 1 — aktipkeun RBAC ngan ukur pikeun jasa sareng rohangan ngaran anu didaptarkeun di lapangan Inclusion;
  • 2 — kami daptar daptar jasa kami.

Hayu urang nerapkeun konfigurasi kalayan paréntah di handap ieu:

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

Sadaya jasa ayeuna ngabutuhkeun Kontrol Aksés Berbasis Peran. Kalayan kecap sanésna, aksés ka sadaya jasa dilarang sareng bakal ngahasilkeun réspon RBAC: access denied. Ayeuna hayu urang ngidinan aksés ka pamaké otorisasi.

Konfigurasi aksés pikeun pamaké biasa

Sadaya pangguna kedah gaduh aksés kana jasa SA-Frontend sareng SA-WebApp. Dilaksanakeun nganggo sumber Istio ieu:

  • Peran Palayanan - nangtukeun hak anu dipiboga ku pamaké;
  • ServiceRoleBinding - nangtukeun saha ServiceRole ieu milik.

Pikeun pamaké biasa kami bakal ngidinan aksés ka jasa tangtu (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: ["*"]

Jeung ngaliwatan regular-user-binding Larapkeun ServiceRole ka sadaya pengunjung halaman (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"

Naha "sadayana pangguna" hartosna yén pangguna anu henteu dioténtikasi ogé bakal gaduh aksés kana SA WebApp? Henteu, kawijakan bakal pariksa validitas token JWT.

Hayu urang nerapkeun konfigurasi:

$ 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

Konfigurasi aksés pikeun moderator

Pikeun moderator, kami hoyong ngaktipkeun aksés ka sadaya jasa (mod-service-role.yaml):

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

Tapi kami hoyong hak sapertos ngan ukur pikeun pangguna anu token aksésna ngandung klaim https://sa.io/group kalawan harti 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" 

Hayu urang nerapkeun konfigurasi:

$ 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

Kusabab cache dina utusan, peryogi sababaraha menit pikeun aturan otorisasi tiasa dianggo. Anjeun teras tiasa mastikeun yén pangguna sareng moderator ngagaduhan tingkat aksés anu béda.

Kacindekan dina bagian ieu

Saleresna, naha anjeun kantos ningali pendekatan anu langkung saderhana, gampang, skalabel sareng aman pikeun auténtikasi sareng otorisasina?

Ngan tilu sumber Istio (RbacConfig, ServiceRole, sareng ServiceRoleBinding) anu diperyogikeun pikeun ngahontal kontrol anu saé pikeun auténtikasi sareng otorisasi aksés pangguna akhir kana jasa.

Salaku tambahan, kami parantos ngurus masalah ieu tina jasa utusan kami, ngahontal:

  • ngurangan jumlah kodeu generik nu bisa ngandung masalah kaamanan jeung bug;
  • ngurangan jumlah kaayaan bodo nu hiji tungtung tétéla bisa diasupan ti luar sarta poho pikeun ngalaporkeun eta;
  • ngaleungitkeun kabutuhan pikeun ngapdet sadaya jasa unggal waktos peran atanapi katuhu anyar ditambahkeun;
  • yén layanan anyar tetep basajan, aman tur gancang.

kacindekan

Istio ngamungkinkeun tim pikeun museurkeun sumber dayana dina tugas-tugas kritis bisnis tanpa nambihan overhead kana jasa, ngabalikeun deui kana status mikro.

Artikel (dina tilu bagian) nyayogikeun pangaweruh dasar sareng petunjuk praktis anu siap pikeun ngamimitian sareng Istio dina proyék nyata.

PS ti penerjemah

Baca ogé dina blog urang:

sumber: www.habr.com

Tambahkeun komentar