Bali menyang microservices karo Istio. Bagean 3

Bali menyang microservices karo Istio. Bagean 3

Cathetan. nerjemahake.: BagΓ©an pisanan seri iki dikhususake kanggo ngerteni kemampuan Istio lan nuduhake tumindak kasebut, kapindho - nuntun sacoro apik lan ngatur lalu lintas jaringan. Saiki kita bakal ngomong babagan keamanan: kanggo nduduhake fungsi dhasar sing ana gandhengane, penulis nggunakake layanan identitas Auth0, nanging panyedhiya liyane bisa dikonfigurasi kanthi cara sing padha.

Kita nyiyapake kluster Kubernetes ing ngendi kita masang Istio lan conto aplikasi microservice, Analisis Sentimen, kanggo nduduhake kemampuan Istio.

Kanthi Istio, kita bisa njaga layanan cilik amarga ora perlu ngleksanakake lapisan kaya Coba maneh, Timeout, Circuit Breakers, Tracing, Monitoring. Kajaba iku, kita nggunakake tèknik pangujian lan panyebaran lanjut: Pengujian A/B, mirroring lan rollouts kenari.

Bali menyang microservices karo Istio. Bagean 3

Ing materi anyar, kita bakal menehi hasil karo lapisan pungkasan ing dalan kanggo nilai bisnis: otentikasi lan wewenang - lan ing Istio iku kesenengan nyata!

Otentikasi lan wewenang ing Istio

Aku ora bakal percaya yen aku bakal diilhami dening otentikasi lan wewenang. Apa sing bisa ditawakake Istio saka perspektif teknologi kanggo nggawe topik kasebut nyenengake, lan luwih akeh, kanggo menehi inspirasi?

Jawaban iki prasaja: Istio ngalih tanggung jawab kanggo kapabilitas kasebut saka layanan sampeyan menyang proxy Utusan. Nalika panyuwunan tekan layanan kasebut, dheweke wis diotentikasi lan diwenehi wewenang, mula sampeyan mung kudu nulis kode sing migunani kanggo bisnis.

Koyone apik? Ayo dideleng ing njero!

Otentikasi karo Auth0

Minangka server kanggo manajemen identitas lan akses, kita bakal nggunakake Auth0, sing duwe versi nyoba, intuisi kanggo nggunakake lan aku seneng. Nanging, prinsip sing padha bisa ditrapake kanggo liyane implementasi OpenID Connect: KeyCloak, IdentityServer lan liya-liyane.

Kanggo miwiti, pindhah menyang Portal Auth0 karo akun, nggawe tenant (tenant - "tenant", unit logis saka isolasi, kanggo rincian liyane waca dokumentasi - kira-kira. transl.) lan pindhah menyang Aplikasi > Aplikasi Defaultmilih domain, kaya sing ditampilake ing gambar ing ngisor iki:

Bali menyang microservices karo Istio. Bagean 3

Nemtokake domain iki ing 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

Kanthi sumber daya kasebut, Pilot (salah siji saka telung komponen Control Plane dhasar ing Istio - kira-kira transl.) ngatur Utusan kanggo otentikasi panjalukan sadurunge diterusake menyang layanan: sa-web-app ΠΈ sa-feedback. Ing wektu sing padha, konfigurasi ora ditrapake kanggo layanan Envoys sa-frontend, ngidini kita ninggalake frontend ora dikonfirmasi. Kanggo ngetrapake Kabijakan, jalanake printah:

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

Bali menyang kaca lan nggawe panjalukan - sampeyan bakal weruh sing rampung karo status 401 ora sah. Saiki ayo ngarahake pangguna frontend kanggo otentikasi karo Auth0.

Authentication panjalukan karo Auth0

Kanggo otentikasi panjalukan pangguna pungkasan, sampeyan kudu nggawe API ing Auth0 sing bakal makili layanan sing wis dikonfirmasi (review, rincian, lan peringkat). Kanggo nggawe API, pindhah menyang Portal Auth0 > API > Gawe API lan isi formulir:

Bali menyang microservices karo Istio. Bagean 3

Informasi penting ing kene yaiku Identifikasi, sing bakal digunakake ing naskah kasebut. Ayo nulis kaya mangkene:

  • pirsawan: {PANONO_MU}

Rincian liyane sing dibutuhake ana ing Portal Auth0 ing bagean kasebut aplikasi - pilih Aplikasi Tes (digawe kanthi otomatis bebarengan karo API).

Ing kene kita bakal nulis:

  • domain: {DOMAIN_ANDA}
  • Klien Id: {KODE_KLIEN_MU}

Gulung menyang Aplikasi Tes menyang kolom teks URL Panggilan Balik sing diidini (URL sing ditanggulangi kanggo callback), ing ngendi kita nemtokake URL ing ngendi telpon kudu dikirim sawise otentikasi rampung. Ing kasus kita yaiku:

http://{EXTERNAL_IP}/callback

Lan kanggo Diijini Logout URL (URL sing diidini kanggo metu) tambahake:

http://{EXTERNAL_IP}/logout

Ayo pindhah menyang frontend.

Nganyari frontend

Ngalih menyang cabang auth0 gudang [istio-mastery]. Ing cabang iki, kode frontend diganti kanggo pangalihan pangguna menyang Auth0 kanggo otentikasi lan nggunakake token JWT ing panjalukan kanggo layanan liyane. Sing terakhir ditindakake kaya ing ngisor iki (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));
}

Kanggo ngganti frontend kanggo nggunakake data tenant ing Auth0, mbukak sa-frontend/src/services/Auth.js lan ngganti nilai sing kita tulis ing ndhuwur (Auth.js):

const Config = {
    clientID: '{YOUR_CLIENT_ID}',
    domain:'{YOUR_DOMAIN}',
    audience: '{YOUR_AUDIENCE}',
    ingressIP: '{EXTERNAL_IP}' // Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для Ρ€Π΅Π΄ΠΈΡ€Π΅ΠΊΡ‚Π° послС Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ
}

Aplikasi wis siyap. Nemtokake ID Docker sampeyan ing printah ing ngisor iki nalika mbangun lan nggunakake owah-owahan sing digawe:

$ 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 app! Sampeyan bakal dialihake menyang Auth0, ing ngendi sampeyan kudu mlebu (utawa ndhaptar), sawise sampeyan bakal dikirim maneh menyang kaca saka ngendi panjaluk sing wis dikonfirmasi bakal ditindakake. Yen sampeyan nyoba printah kasebut ing bagean pisanan artikel kanthi curl, sampeyan bakal entuk kode kasebut 401 Kode Status, menehi tandha manawa panyuwunan kasebut ora sah.

Ayo njupuk langkah sabanjure - wewenang panjalukan.

Wewenang karo Auth0

Otentikasi ngidini kita ngerti sapa pangguna, nanging wewenang dibutuhake kanggo ngerti apa sing bisa diakses. Istio uga nawakake alat kanggo iki.

Minangka conto, ayo nggawe rong klompok pangguna (pirsani diagram ing ngisor iki):

  • Pangguna (pangguna) - kanthi akses mung menyang layanan SA-WebApp lan SA-Frontend;
  • Moderator (moderator) - kanthi akses menyang kabeh telung layanan.

Bali menyang microservices karo Istio. Bagean 3
Konsep wewenang

Kanggo nggawe grup kasebut, kita bakal nggunakake ekstensi Otorisasi Auth0 lan nggunakake Istio kanggo nyedhiyakake tingkat akses sing beda-beda.

Instalasi lan konfigurasi Otorisasi Auth0

Ing portal Auth0, pindhah menyang ekstensi (Ekstensi) lan nginstal Wewenang Auth0. Sawise instalasi, pindhah menyang Perpanjangan wewenang, lan ana - menyang konfigurasi penyewa kanthi ngeklik ing sisih tengen ndhuwur lan milih pilihan menu sing cocog (Konfigurasi). Aktifake grup (Grup) lan klik tombol nerbitake aturan (Aturan nerbitake).

Bali menyang microservices karo Istio. Bagean 3

Nggawe grup

Ing Wewenang Extension pindhah menyang Groups lan nggawe grup Moderat. Amarga kita bakal nganggep kabeh pangguna sing wis dikonfirmasi minangka pangguna biasa, ora perlu nggawe grup tambahan kanggo dheweke.

Pilih grup Moderat, Tekan Tambah Anggota, tambahake akun utama sampeyan. Ninggalake sawetara pangguna tanpa klompok kanggo mesthekake yen ora bisa diakses. (Panganggo anyar bisa digawe kanthi manual liwat Portal Auth0 > Pangguna > Gawe Panganggo.)

Tambah Klaim Grup menyang Token Akses

Pangguna wis ditambahake menyang grup, nanging informasi iki uga kudu dibayangke ing token akses. Kanggo tundhuk karo OpenID Connect lan ing wektu sing padha bali kelompok sing kita butuhake, token kasebut kudu ditambahake dhewe pratelan adat. Dilaksanakake liwat aturan Auth0.

Kanggo nggawe aturan, pindhah menyang Auth0 Portal kanggo Aturan, Tekan Nggawe Aturan lan pilih aturan kosong saka cithakan.

Bali menyang microservices karo Istio. Bagean 3

Nyalin kode ing ngisor iki lan simpen minangka aturan anyar Tambah Klaim Grup (namespacedGroup.js):

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

komentar: Kode iki njupuk grup panganggo pisanan sing ditetepake ing Extension Wewenang lan ditambahake menyang token akses minangka pratelan khusus (ing namespace, kaya sing dibutuhake dening Auth0).

Bali menyang kaca Aturan lan priksa manawa sampeyan duwe rong aturan sing ditulis kanthi urutan ing ngisor iki:

  • auth0-wewenang-ekstensi
  • Tambah Klaim Grup

Urutan kasebut penting amarga kolom grup nampa aturan kanthi ora sinkron auth0-wewenang-ekstensi lan sawise iku ditambahake minangka pratelan dening aturan kapindho. Asil kasebut minangka token akses kaya iki:

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

Saiki sampeyan kudu ngatur proxy Utusan kanggo mriksa akses pangguna, sing grup kasebut bakal ditarik saka pratelan (https://sa.io/group) ing token akses bali. Iki minangka topik kanggo bagean sabanjure artikel kasebut.

Konfigurasi wewenang ing Istio

Supaya wewenang bisa digunakake, sampeyan kudu ngaktifake RBAC kanggo Istio. Kanggo nindakake iki, kita bakal nggunakake konfigurasi ing ngisor iki:

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" 

Katrangan:

  • 1 - ngaktifake RBAC mung kanggo layanan lan ruang jeneng sing kadhaptar ing lapangan Inclusion;
  • 2 β€” kita dhaptar dhaptar layanan kita.

Ayo aplikasi konfigurasi kanthi printah ing ngisor iki:

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

Kabeh layanan saiki mbutuhake Kontrol Akses Berbasis Peran. Ing tembung liyane, akses menyang kabeh layanan dilarang lan bakal ngasilake respon RBAC: access denied. Saiki ayo ngidini akses menyang pangguna sing sah.

Konfigurasi akses kanggo pangguna biasa

Kabeh pangguna kudu duwe akses menyang layanan SA-Frontend lan SA-WebApp. Dilaksanakake nggunakake sumber daya Istio ing ngisor iki:

  • ServiceRole - nemtokake hak sing pangguna duwe;
  • ServiceRoleBinding - nemtokake sing ServiceRole iki belongs kanggo.

Kanggo pangguna biasa, kita bakal ngidini akses menyang layanan tartamtu (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: ["*"]

Lan liwat regular-user-binding aplikasi ServiceRole kanggo kabeh pengunjung kaca (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"

Apa "kabeh pangguna" tegese pangguna sing ora dikonfirmasi uga bakal duwe akses menyang SA WebApp? Ora, kabijakan kasebut bakal mriksa validitas token JWT.

Ayo aplikasi 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 akses kanggo moderator

Kanggo moderator, kita pengin ngaktifake akses menyang kabeh layanan (mod-service-role.yaml):

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

Nanging kita pengin hak kasebut mung kanggo pangguna sing token akses ngemot pratelan https://sa.io/group kanthi teges 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" 

Ayo aplikasi 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

Amarga caching ing utusan, butuh sawetara menit supaya aturan wewenang bisa ditrapake. Sampeyan banjur bisa mesthekake yen pangguna lan moderator duwe tingkat akses sing beda.

Kesimpulan ing bagean iki

Nanging, apa sampeyan wis tau ndeleng pendekatan otentikasi lan wewenang sing luwih gampang, gampang, skalabel lan aman?

Mung telung sumber daya Istio (RbacConfig, ServiceRole, lan ServiceRoleBinding) sing dibutuhake kanggo entuk kontrol sing apik babagan otentikasi lan wewenang akses pangguna pungkasan menyang layanan.

Kajaba iku, kita wis ngrampungake masalah kasebut saka layanan utusan, entuk:

  • nyuda jumlah kode umum sing bisa ngemot masalah keamanan lan kewan omo;
  • nyuda jumlah kahanan bodho ing ngendi siji titik pungkasan bisa diakses saka njaba lan kelalen nglaporake;
  • ngilangi kabutuhan nganyari kabeh layanan saben-saben peran utawa hak anyar ditambahake;
  • sing layanan anyar tetep prasaja, aman lan cepet.

kesimpulan

Istio ngidini tim fokus sumber daya ing tugas kritis bisnis tanpa nambah overhead kanggo layanan, bali menyang status mikro.

Artikel kasebut (ing telung bagean) nyedhiyakake kawruh dhasar lan instruksi praktis sing siap kanggo miwiti Istio ing proyek nyata.

PS saka penerjemah

Waca uga ing blog kita:

Source: www.habr.com

Add a comment