Haruskah layanan microsoft menjadi pengguna?

13

Kami mencoba menentukan cara terbaik untuk mengotorisasi pengguna dalam arsitektur layanan mikro, sambil memastikan layanan microser memiliki izin terbatas. Arsitektur kami menggunakan layanan otorisasi pusat untuk menangani penerbitan token JWT.

Kami memiliki persyaratan berikut:

  1. Pengguna harus dibatasi untuk melakukan peran tertentu. misalnya pengguna hanya dapat membuat / memodifikasi / membaca konten yang dimilikinya.

  2. Layanan Microsoft harus dibatasi hanya pada izin yang mereka butuhkan. mis. layanan mikro yang hanya perlu membaca data dari layanan lain harus secara eksplisit dilarang menulis data ke layanan itu.

Sebagai contoh, misalkan kita memiliki sistem di mana pengguna dapat mengunggah gambar ke layanan penyimpanan gambar. Kami memiliki layanan penandaan yang secara otomatis menandai gambar dengan lokasi. Pengguna hanya dapat CRUD gambar mereka sendiri. Layanan penandaan dapat membaca gambar apa pun dari layanan penyimpanan gambar, namun tidak dapat mengubah / menghapus.

Apa cara yang baik untuk mencapai hal di atas menggunakan token JWT? Beberapa solusi yang telah kita bahas adalah:

  1. Layanan penyimpanan gambar memaparkan 2 API, yang tersedia secara eksternal (memberikan akses CRUD pengguna), dan yang tersedia secara internal (memberikan akses hanya baca internal). Tampak tidak fleksibel - bagaimana jika layanan internal lain memerlukan akses baca / tulis ke semua gambar (mis. Yang secara otomatis menghapus gambar eksplisit)?

  2. Kami menyiapkan dua izin di JWT pengguna, satu menjadi CRUD_OwnImages, yang lainnya adalah READ_ForAnalysis. Layanan pemberian tag dapat melihat apakah pengguna memiliki izin READ_ForAnalysis, dan jika demikian, buat permintaan yang sesuai. Kami memiliki layanan microser lain yang memeriksa untuk melihat apakah pengguna memiliki CRUD_OwnImages untuk operasi CRUD pada gambar milik pengguna. Ini menempatkan tanggung jawab pada setiap layanan-mikro untuk memastikan bahwa pengguna dibatasi pada tindakan yang diperlukannya. Toko gambar tidak memiliki cara untuk membatasi setiap layanan Microsoft dengan pendekatan ini, sehingga berpotensi serpihan dan rentan kesalahan.

  3. Kami memberikan layanan penandaan tag kepada penggunanya sendiri, dengan READ_ForAnalysis sebagai izin. Kemudian, ketika layanan pemberian tag meminta gambar dari penyimpanan gambar, ia diberikan akses ke gambar itu, tetapi dilarang memodifikasinya. Pengguna pengguna hanya memiliki izin CRUD_OwnImages, sehingga ia dapat mengambil dan mendapatkan akses ke hanya gambarnya dari frontend. Jika layanan lain membutuhkan CRUD untuk semua data, kami dapat memberikannya CRUD_AllData atau serupa. Kami menyukai pendekatan ini karena setiap layanan kini bertanggung jawab atas datanya sendiri (daripada logika yang diduplikasi di beberapa layanan), tetapi bagaimana jika layanan tersebut memerlukan izin pengguna dan izin layanan-mikro? Bisakah kita mengirim dua token JWT (baik pengguna dan layanan mikro) dengan aman? Apakah ada cara untuk menggabungkan izin secara aman dan mengirimkannya melalui? misalnya

Masalahnya diperburuk jika informasi pengguna diperlukan lebih jauh ke hilir (2 atau 3 layanan microser jauh). Apakah kita hanya berasumsi bahwa itu tergantung pada masing-masing layanan mikro untuk membatasi diri pada tindakan yang mereka butuhkan, dan tidak membuat itu eksplisit?

awr
sumber
1
Apakah Anda satu-satunya pengembang microservices ini, atau apakah perusahaan / organisasi / departemen lain (yaitu apa pun dengan batas keamanan) juga menulis layanan microser yang menargetkan sistem Anda?
Robert Harvey
1
Kemungkinan besar akan ada layanan lain untuk sistem ini, dan kami ingin merancang untuk kasus itu.
awr

Jawaban:

6

Secara umum, sebanyak mungkin operasi harus dikaitkan dengan pengguna manusia yang nyata. Ini memaksa orang untuk mengotentikasi dengan benar, mendorong strategi otorisasi tunggal yang konsisten, dan itu merupakan bagian penting dari menyediakan jejak audit yang kohesif.

Dan secara umum, Anda memiliki tiga jenis skenario dengan layanan microser:

1. Pengguna masuk, mengunggah foto, dan perlu diberi tag. Bagus. Layanan foto dapat meneruskan JWT ke layanan penandaan (atau sebaliknya tergantung pada arah ketergantungan Anda) dan jika pengguna tidak memiliki hak untuk melakukan sub-operasi, Anda mengambil tindakan yang sesuai (mungkin mengunggah foto tanpa tag) , mungkin mengembalikan kesalahan, mungkin sesuatu yang lain).

2. Pengguna masuk, mengunggah foto, dan perlu diberi tag ... tetapi tidak sekarang. Keren. Anda menangani foto sekarang seperti biasa. Kemudian, ketika penandaan terjadi (penanganan peristiwa / pesan, pemrosesan perintah gaya CQRS, beberapa pemrosesan pekerjaan berkala, apa pun), layanan penandaan akan menyamar sebagai pengguna (kemungkinan besar dengan menggunakan rahasia bersama untuk meminta JWT khusus dari auth) dan kemudian melakukan sub-operasi atas nama pemohon asli (dengan semua izin dan batasannya). Metode ini memiliki masalah biasa dengan operasi asinkron di mana sulit untuk memberikan kesalahan kembali kepada pengguna jika ada yang tidak berjalan lancar, tetapi jika Anda menggunakan pola ini untuk operasi lintas-layanan, Anda harus sudah menyelesaikannya.

3. Beberapa sub-sistem perlu melakukan hal-hal di luar konteks pengguna. Mungkin Anda punya pekerjaan malam untuk mengarsipkan gambar lama. Mungkin tag Anda perlu dikonsolidasikan ... Dalam hal ini, Anda mungkin ingin masing-masing aktor memiliki pengguna semu sendiri dengan izin terbatas dan ID unik untuk jejak audit.

Yang digunakan bervariasi tergantung pada skenario Anda, kebutuhan Anda, dan toleransi risiko Anda. Dan tentu saja, ini hanya satu set generalisasi luas stroke yang tidak lengkap.

Namun secara umum, layanan microser sendiri tidak boleh menjadi pengguna jika memungkinkan.

Telastyn
sumber
1
Bukankah paragraf pertama dan terakhir Anda bertentangan?
Robert Harvey
1
Tidak? Operasi harus dikaitkan dengan pengguna. Layanan microser sendiri bukan pengguna ... Saya akan mengklarifikasi.
Telastyn
1
Saya menemukan solusi untuk masalah yang disarankan: menentukan ruang lingkup untuk setiap layanan microser yang menentukan titik akhir yang dapat diakses, dalam token aksesnya. Juga berikan token id JWT pengguna sebagai tajuk yang berbeda. Dengan cara ini kita dapat membatasi layanan microser dan pengguna (pertahanan mendalam). Bab 10 dari manning.com/books/microservices-in-net-core
AWR
Skenario 3 adalah skenario yang menarik, yang sebagian mengarahkan kami untuk memutuskan bahwa pengguna haruslah layanan mikro. Tapi sepertinya itu bisa menjadi pengecualian daripada aturan.
awr