 Catatan perev. : Bagian pertama dari seri ini dikhususkan untuk memperkenalkan kemampuan Istio dan mendemonstrasikan mereka dalam aksi, yang kedua untuk perutean yang diatur dengan baik dan manajemen lalu lintas jaringan. Sekarang kita akan berbicara tentang keamanan: untuk menunjukkan fungsi dasar yang terkait dengannya, penulis menggunakan layanan identitas Auth0, tetapi penyedia lain dapat dikonfigurasikan secara analogi dengannya.
Catatan perev. : Bagian pertama dari seri ini dikhususkan untuk memperkenalkan kemampuan Istio dan mendemonstrasikan mereka dalam aksi, yang kedua untuk perutean yang diatur dengan baik dan manajemen lalu lintas jaringan. Sekarang kita akan berbicara tentang keamanan: untuk menunjukkan fungsi dasar yang terkait dengannya, penulis menggunakan layanan identitas Auth0, tetapi penyedia lain dapat dikonfigurasikan secara analogi dengannya.Kami membuat kluster Kubernetes di mana Istio dan aplikasi microservice Analisis Sentimen dikerahkan, yang merupakan cara Istio ditunjukkan.
Dengan menggunakan Istio, kami dapat menjaga layanan dalam ukuran kecil karena mereka tidak perlu menerapkan "lapisan" seperti retries, Retouts, Timeout, Pemutus Sirkuit, Pelacakan, Pemantauan . Selain itu, kami menggunakan pengujian lanjutan dan teknik penyebaran: pengujian A / B, mirroring dan peluncuran kenari. 

Dalam materi baru, kita akan membahas lapisan terakhir dalam perjalanan ke nilai bisnis: otentikasi dan otorisasi - dan di Istio ini adalah kesenangan nyata!
Otentikasi dan Otorisasi dalam Istio
Saya tidak akan pernah percaya bahwa saya akan terinspirasi oleh otentikasi dan otorisasi. Apa yang secara teknologi dapat ditawarkan oleh Istio untuk membuat topik-topik ini menarik dan bahkan lebih menginspirasi Anda?
Jawabannya sederhana: Istio mentransfer tanggung jawab untuk fitur-fitur ini dari layanan Anda ke proxy Utusan. Pada saat permintaan mencapai layanan, mereka sudah dikonfirmasi dan disahkan, jadi Anda hanya perlu menulis kode yang berguna untuk bisnis.
Kedengarannya bagus? Ayo lihat ke dalam!
Otentikasi dengan Auth0
Kami akan menggunakan Auth0 sebagai server untuk identitas dan manajemen akses, yang memiliki versi percobaan, yang intuitif untuk digunakan dan saya hanya menyukainya. Namun, prinsip yang sama dapat diterapkan untuk 
implementasi OpenID Connect lainnya : KeyCloak, IdentityServer, dan banyak lainnya.
Pertama, pergi ke 
Portal Auth0 dengan akun Anda, buat penyewa 
(penyewa - "penyewa", unit isolasi logis, untuk lebih jelasnya lihat dokumentasi - kira-kira Transfer) dan buka 
Aplikasi> Aplikasi Default , pilih 
Domain , seperti yang ditunjukkan pada tangkapan layar di bawah ini :

Tentukan domain ini dalam file 
resource-manifests/istio/security/auth-policy.yaml sumber daya ( 
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 
Memiliki sumber daya seperti itu, Pilot 
(salah satu dari tiga komponen dasar Control Plane di Istio - approx. Transl.) Mengkonfigurasi Utusan untuk mengotentikasi permintaan sebelum mengarahkan mereka ke layanan: 
sa-web-app dan 
sa-feedback . Pada saat yang sama, konfigurasi tidak berlaku untuk Utusan dari layanan 
sa-frontend , memungkinkan kita untuk membiarkan frontend tidak terauthentikasi. Untuk menerapkan kebijakan, jalankan perintah:
 $ kubectl apply -f resource-manifests/istio/security/auth-policy.yaml policy.authentication.istio.io โauth-policyโ created 
Kembali ke halaman dan buat permintaan - Anda akan melihat bahwa itu berakhir pada 
401 Status 
tidak sah . Sekarang kami mengarahkan pengguna front-end ke otentikasi dengan Auth0.
Minta Otentikasi dengan Auth0
Untuk mengotentikasi permintaan pengguna akhir, Anda perlu membuat API di Auth0 yang akan mewakili layanan yang diautentikasi (ulasan, detail, dan peringkat). Untuk membuat API, buka 
Auth0 Portal> APIs> Buat API dan isi formulir:

Informasi penting di sini adalah 
Identifier , yang akan kita gunakan nanti dalam skrip. Mari kita tuliskan untuk diri kita sendiri seperti ini:
- Pemirsa : {YOUR_AUDIENCE}
Rincian lainnya yang kami butuhkan ada di Portal Auth0 di bagian 
Aplikasi - pilih 
Aplikasi Uji (dibuat secara otomatis dengan API).
Di sini kami menulis:
- Domain : {YOUR_DOMAIN}
- Id Klien : {YOUR_CLIENT_ID}
Gulir dalam 
Aplikasi Tes ke kotak teks URL Panggilan 
Balik yang Diizinkan (URL yang diizinkan untuk panggilan balik), di mana kami menunjukkan URL tempat panggilan harus dikirim setelah otentikasi selesai. Dalam kasus kami, itu adalah:
 http://{EXTERNAL_IP}/callback 
Dan untuk 
URL Logout yang Diizinkan (URL yang diizinkan untuk keluar), tambahkan:
 http://{EXTERNAL_IP}/logout 
Mari kita beralih ke frontend.
Pembaruan Frontend
Beralih ke cabang 
auth0 dari 
[istio-mastery] . Di utas ini, kode front-end diubah untuk mengarahkan pengguna ke Auth0 untuk otentikasi dan menggunakan token JWT dalam permintaan untuk layanan lain. Yang terakhir diimplementasikan sebagai berikut ( 
App.js ):
 analyzeSentence() { fetch('/sentiment', { method: 'POST', headers: { 'Content-Type': 'application/json', 'Authorization': `Bearer ${auth.getAccessToken()}`  
Untuk mengonversi frontend untuk menggunakan data tenant di Auth0, buka 
sa-frontend/src/services/Auth.js dan ganti nilai yang kami tulis di atas ( 
Auth.js ) di dalamnya:
 const Config = { clientID: '{YOUR_CLIENT_ID}', domain:'{YOUR_DOMAIN}', audience: '{YOUR_AUDIENCE}', ingressIP: '{EXTERNAL_IP}'  
Aplikasi sudah siap. Tunjukkan ID Docker Anda dalam perintah di bawah ini saat membuat dan menggunakan perubahan yang dibuat:
 $ 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 aplikasinya! Anda akan dialihkan ke Auth0, di mana Anda harus masuk (atau mendaftar), setelah itu Anda akan dikirim kembali ke halaman dari mana permintaan yang sudah dikonfirmasi akan dibuat. Jika Anda mencoba perintah ikal yang disebutkan di bagian pertama artikel, Anda akan menerima 
Kode Status 401 , yang menunjukkan bahwa permintaan tersebut tidak diotorisasi.
Mari kita mengambil langkah selanjutnya - otorisasi permintaan.
Otorisasi dengan Auth0
Otentikasi memungkinkan kita untuk memahami siapa pengguna itu, tetapi untuk mengetahui apa yang dia miliki akses, diperlukan otorisasi. Istio juga menawarkan alat untuk ini.
Sebagai contoh, kami akan membuat dua grup pengguna (lihat diagram di bawah):
- Pengguna (pengguna) - dengan akses hanya ke layanan SA-WebApp dan SA-Frontend;
- Moderator - dengan akses ke ketiga layanan.
 Konsep otorisasi
Konsep otorisasiUntuk membuat grup ini, kami akan menggunakan ekstensi Auth0 Authorization dan menggunakan Istio untuk memberi mereka tingkat akses yang berbeda.
Instalasi dan konfigurasi Otorisasi Auth0
Pada portal Auth0, buka 
Extensions dan instal 
Auth0 Authorization . Setelah instalasi, buka 
Ekstensi Otorisasi , dan di sana - ke konfigurasi penyewa dengan mengklik di kanan atas dan memilih opsi menu yang sesuai 
(Konfigurasi) . Aktifkan 
Grup dan klik tombol 
Terbitkan aturan .

Pembuatan grup
Di Ekstensi Otorisasi, buka 
Grup dan buat grup 
Moderator . Karena kami akan menganggap semua pengguna yang diautentikasi sebagai biasa, tidak perlu membuat grup tambahan untuk mereka.
Pilih grup 
Moderator , klik 
Tambah Anggota , tambahkan akun utama Anda. Tinggalkan beberapa pengguna tanpa grup apa pun untuk memastikan bahwa akses ditolak untuk mereka. (Pengguna baru dapat dibuat secara manual melalui 
Portal Auth0> Pengguna> Buat Pengguna .)
Tambahkan Klaim Grup untuk Mengakses Token
Pengguna ditambahkan ke grup, tetapi informasi ini harus tercermin dalam token akses. Untuk mematuhi OpenID Connect dan pada saat yang sama mengembalikan grup yang kita butuhkan, token perlu menambahkan 
klaim khusus . Ini diimplementasikan melalui aturan Auth0.
Untuk membuat aturan, buka Auth0 Portal to 
Rules , klik 
Buat Aturan dan pilih aturan kosong dari templat.

Salin kode di bawah ini dan simpan sebagai aturan 
Tambah Klaim Grup baru ( 
namespacedGroup.js ):
 function (user, context, callback) { context.accessToken['https://sa.io/group'] = user.groups[0]; return callback(null, user, context); } 
Catatan : kode ini mengambil grup pengguna pertama yang ditentukan dalam Ekstensi Otorisasi dan menambahkannya ke token akses sebagai klaim khusus (di bawah namespace-nya, seperti yang disyaratkan oleh Auth0).
Kembali ke halaman 
Aturan dan verifikasi bahwa Anda memiliki dua aturan yang ditulis dalam urutan berikut:
- auth0-otorisasi-ekstensi
- Tambahkan Klaim Grup
Urutan ini penting karena bidang grup secara asinkron menerima aturan 
auth0-authorization-extension dan kemudian ditambahkan sebagai klaim oleh aturan kedua. Hasilnya adalah token akses seperti itu:
 { "https://sa.io/group": "Moderators", "iss": "https://sentiment-analysis.eu.auth0.com/", "sub": "google-oauth2|196405271625531691872" // [  ] } 
Sekarang Anda perlu mengonfigurasi proxy Utusan untuk memeriksa akses pengguna, di mana grup tersebut akan ditarik dari klaim ( 
https://sa.io/group ) di token akses yang dikembalikan. Ini adalah topik untuk bagian artikel selanjutnya.
Konfigurasi otorisasi Istio
Agar otorisasi berfungsi, Anda harus mengaktifkan RBAC untuk Istio. Untuk melakukan ini, gunakan konfigurasi berikut:
 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" 
Penjelasan:
- 1 - aktifkan RBAC hanya untuk layanan dan ruang nama yang terdaftar di bidang Inclusion;
- 2 - daftar daftar layanan kami.
Kami menerapkan konfigurasi dengan perintah ini:
 $ kubectl apply -f resource-manifests/istio/security/enable-rbac.yaml rbacconfig.rbac.istio.io/default created 
Sekarang semua layanan memerlukan Kontrol Akses Berbasis Peran. Dengan kata lain, akses ke semua layanan ditolak dan akan menghasilkan respons 
RBAC: access denied . Sekarang izinkan akses ke pengguna yang berwenang.
Konfigurasi akses untuk pengguna biasa
Semua pengguna harus memiliki akses ke layanan SA-Frontend dan SA-WebApp. Diimplementasikan menggunakan sumber daya Istio berikut:
- ServiceRole - mendefinisikan hak yang dimiliki pengguna;
- ServiceRoleBinding - Menentukan milik siapa ServiceRole ini.
Untuk pengguna biasa, izinkan akses ke layanan tertentu ( 
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: ["*"] 
Dan melalui 
regular-user-binding terapkan 
Peran Layanan untuk semua pengunjung ke halaman ( 
regular-user-binding -peran-layanan-pengguna reguler.yaml ):
 apiVersion: "rbac.istio.io/v1alpha1" kind: ServiceRoleBinding metadata: name: regular-user-binding namespace: default spec: subjects: - user: "*" roleRef: kind: ServiceRole name: "regular-user" 
Apakah "semua pengguna" berarti bahwa pengguna yang tidak diauthentikasi akan mendapatkan akses ke SA WebApp? Tidak, kebijakan akan memverifikasi validitas token JWT.
Terapkan 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 untuk moderator
Untuk moderator, kami ingin mengaktifkan akses ke semua layanan ( 
mod-service-role.yaml ):
 apiVersion: "rbac.istio.io/v1alpha1" kind: ServiceRole metadata: name: mod-user namespace: default spec: rules: - services: ["*"] paths: ["*"] methods: ["*"] 
Tetapi kami menginginkan hak tersebut hanya untuk pengguna yang token aksesnya memiliki klaim 
https://sa.io/group dengan nilai 
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" 
Terapkan 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 
Karena caching di utusan, mungkin diperlukan beberapa menit untuk menerapkan aturan otorisasi. Setelah itu, Anda dapat memastikan bahwa pengguna dan moderator memiliki tingkat akses yang berbeda.
Kesimpulan bagian ini
Nah, serius: apakah Anda pernah melihat pendekatan yang lebih sederhana, mudah, terukur, dan aman untuk otentikasi dan otorisasi?
Hanya tiga sumber daya Istio (RbacConfig, ServiceRole, dan ServiceRoleBinding) yang diperlukan untuk mencapai kontrol yang baik atas otentikasi dan otorisasi akses pengguna akhir ke layanan.
Selain itu, kami menangani masalah ini dari layanan kami di utusan, mencapai:
- Mengurangi jumlah kode sampel yang mungkin termasuk masalah keamanan dan bug;
- mengurangi jumlah situasi bodoh di mana satu titik akhir ternyata dapat diakses dari luar dan lupa melaporkannya;
- menghilangkan kebutuhan untuk memperbarui semua layanan setiap kali peran atau hak baru ditambahkan;
- bahwa layanan baru tetap sederhana, aman dan cepat.
Kesimpulan
Istio memungkinkan tim untuk memfokuskan sumber daya mereka pada tugas-tugas penting bisnis tanpa menambahkan overhead ke layanan, mengembalikannya ke status mikro.
Artikel (dalam tiga bagian) memberikan pengetahuan dasar dan instruksi praktis siap pakai untuk memulai bekerja dengan Istio dalam proyek nyata.
PS dari penerjemah
Baca juga di blog kami: