SSO pada seni bina perkhidmatan mikro. Kami menggunakan Keycloak. Bahagian 1

Dalam mana-mana syarikat besar, dan Kumpulan Runcit X5 tidak terkecuali, apabila ia berkembang, bilangan projek yang memerlukan kebenaran pengguna meningkat. Dari masa ke masa, peralihan lancar pengguna dari satu aplikasi ke aplikasi lain diperlukan, dan kemudian terdapat keperluan untuk menggunakan pelayan Single-Sing-On (SSO) tunggal. Tetapi bagaimana pula apabila pembekal identiti seperti AD atau lain-lain yang tidak mempunyai atribut tambahan sudah digunakan dalam pelbagai projek. Kelas sistem yang dipanggil "broker pengenalan" akan datang untuk menyelamatkan. Yang paling berfungsi ialah wakilnya, seperti Keycloak, pengurusan Gravitee Access, dsb. Selalunya, kes penggunaan boleh berbeza: interaksi mesin, penyertaan pengguna, dll. Penyelesaian mesti menyokong fungsi fleksibel dan berskala yang boleh menggabungkan semua keperluan dalam satu, dan penyelesaian sedemikian syarikat kami kini mempunyai broker petunjuk - Keycloak.

SSO pada seni bina perkhidmatan mikro. Kami menggunakan Keycloak. Bahagian 1

Keycloak ialah identiti sumber terbuka dan produk kawalan akses yang diselenggara oleh RedHat. Ia adalah asas untuk produk syarikat menggunakan SSO - RH-SSO.

Konsep asas

Sebelum anda mula berurusan dengan penyelesaian dan pendekatan, anda harus membuat keputusan dari segi dan urutan proses:

SSO pada seni bina perkhidmatan mikro. Kami menggunakan Keycloak. Bahagian 1

Pengenalan ialah prosedur untuk mengenali subjek dengan pengecamnya (dengan kata lain, ini adalah takrifan nama, log masuk atau nombor).

Pengesahan - ini adalah prosedur pengesahan (pengguna disemak dengan kata laluan, surat itu disemak dengan tandatangan elektronik, dsb.)

Kebenaran - ini ialah penyediaan akses kepada sumber (contohnya, kepada e-mel).

Jubah Kunci Broker Identiti

Jubah kunci ialah identiti sumber terbuka dan penyelesaian pengurusan akses yang direka untuk digunakan dalam IS di mana corak seni bina perkhidmatan mikro boleh digunakan.

Keycloak menawarkan ciri seperti log masuk tunggal (SSO), identiti pembrokeran dan log masuk sosial, persekutuan pengguna, penyesuai pelanggan, konsol pentadbir dan konsol pengurusan akaun.

Fungsi asas yang disokong oleh Keycloak:

  • Single-Sign On dan Single-Sign Out untuk aplikasi penyemak imbas.
  • Sokongan untuk OpenID/OAuth 2.0/SAML.
  • Pembrokeran Identiti - pengesahan menggunakan OpenID Connect luaran atau pembekal identiti SAML.
  • Log Masuk Sosial - Google, GitHub, Facebook, sokongan Twitter untuk pengenalan pengguna.
  • Persekutuan Pengguna - penyegerakan pengguna daripada pelayan LDAP dan Active Directory serta pembekal identiti lain.
  • Jambatan Kerberos - menggunakan pelayan Kerberos untuk pengesahan pengguna automatik.
  • Konsol Pentadbiran - untuk pengurusan bersatu tetapan dan pilihan penyelesaian melalui Web.
  • Konsol Pengurusan Akaun - untuk pengurusan sendiri profil pengguna.
  • Penyesuaian penyelesaian berdasarkan identiti korporat syarikat.
  • Pengesahan 2FA - Sokongan TOTP/HOTP menggunakan Google Authenticator atau FreeOTP.
  • Aliran Log Masuk - pendaftaran diri pengguna, pemulihan kata laluan dan tetapan semula, dan lain-lain adalah mungkin.
  • Pengurusan Sesi - pentadbir boleh menguruskan sesi pengguna dari satu titik.
  • Pemeta Token - mengikat atribut pengguna, peranan dan atribut lain yang diperlukan kepada token.
  • Pengurusan dasar yang fleksibel merentas alam, aplikasi dan pengguna.
  • Sokongan CORS - Penyesuai pelanggan mempunyai sokongan CORS terbina dalam.
  • Antara Muka Pembekal Perkhidmatan (SPI) - Sebilangan besar SPI yang membolehkan anda menyesuaikan pelbagai aspek pelayan: aliran pengesahan, pembekal identiti, pemetaan protokol dan banyak lagi.
  • Penyesuai pelanggan untuk aplikasi JavaScript, WildFly, JBoss EAP, Fuse, Tomcat, Jetty, Spring.
  • Sokongan untuk bekerja dengan pelbagai aplikasi yang menyokong perpustakaan OpenID Connect Relying Party atau Perpustakaan Penyedia Perkhidmatan SAML 2.0.
  • Boleh dikembangkan menggunakan pemalam.

Untuk proses CI / CD, serta automasi proses pengurusan dalam Keycloak, API REST / API JAVA boleh digunakan. Dokumentasi tersedia secara elektronik:

REST API https://www.keycloak.org/docs-api/8.0/rest-api/index.html
API Java https://www.keycloak.org/docs-api/8.0/javadocs/index.html

Penyedia Identiti Perusahaan (Di Premis)

Keupayaan untuk mengesahkan pengguna melalui perkhidmatan Persekutuan Pengguna.

SSO pada seni bina perkhidmatan mikro. Kami menggunakan Keycloak. Bahagian 1

Pengesahan lulus juga boleh digunakan - jika pengguna membuat pengesahan terhadap stesen kerja dengan Kerberos (LDAP atau AD), maka mereka boleh disahkan secara automatik kepada Keycloak tanpa perlu memasukkan nama pengguna dan kata laluan mereka semula.

Untuk pengesahan dan kebenaran pengguna selanjutnya, adalah mungkin untuk menggunakan DBMS hubungan, yang paling sesuai untuk persekitaran pembangunan, kerana ia tidak melibatkan tetapan dan penyepaduan yang panjang pada peringkat awal projek. Secara lalai, Keycloak menggunakan DBMS terbina dalam untuk menyimpan tetapan dan data pengguna.

Senarai DBMS yang disokong adalah luas dan termasuk: MS SQL, Oracle, PostgreSQL, MariaDB, Oracle dan lain-lain. Yang paling diuji setakat ini ialah Oracle 12C Release1 RAC dan gugusan Galera 3.12 untuk MariaDB 10.1.19.

Pembekal identiti - log masuk sosial

Ia adalah mungkin untuk menggunakan log masuk dari rangkaian sosial. Untuk mengaktifkan keupayaan untuk mengesahkan pengguna, gunakan konsol pentadbir Keycloack. Perubahan dalam kod aplikasi tidak diperlukan dan fungsi ini tersedia di luar kotak dan boleh diaktifkan pada mana-mana peringkat projek.

SSO pada seni bina perkhidmatan mikro. Kami menggunakan Keycloak. Bahagian 1

Anda boleh menggunakan pembekal OpenID/SAML Identity untuk pengesahan pengguna.

Senario kebenaran biasa menggunakan OAuth2 dalam Keycloak

Aliran Kod Kebenaran - digunakan dengan aplikasi sebelah pelayan. Salah satu jenis kebenaran kebenaran yang paling biasa kerana ia sangat sesuai untuk aplikasi pelayan yang kod sumber aplikasi dan data pelanggan tidak tersedia kepada orang luar. Proses dalam kes ini adalah berdasarkan pengalihan. Aplikasi mesti boleh berinteraksi dengan ejen pengguna (pengguna-ejen), seperti pelayar web - untuk menerima kod kebenaran API yang diubah hala melalui ejen pengguna.

aliran tersirat - digunakan oleh aplikasi mudah alih atau web (aplikasi yang dijalankan pada peranti pengguna).

Jenis kebenaran kebenaran tersirat digunakan oleh aplikasi mudah alih dan web di mana kerahsiaan pelanggan tidak dapat dijamin. Jenis kebenaran tersirat juga menggunakan pengalihan ejen pengguna, yang mana token akses dihantar kepada ejen pengguna untuk kegunaan selanjutnya dalam aplikasi. Ini menjadikan token tersedia kepada pengguna dan aplikasi lain pada peranti pengguna. Jenis kebenaran kebenaran ini tidak mengesahkan identiti aplikasi dan proses itu sendiri bergantung pada URL ubah hala (sebelum ini didaftarkan dengan perkhidmatan).

Aliran Tersirat tidak menyokong token muat semula token akses.

Aliran Pemberian Bukti Kelayakan Pelanggan β€” digunakan apabila aplikasi mengakses API. Jenis kebenaran kebenaran ini biasanya digunakan untuk interaksi pelayan-ke-pelayan yang mesti dilakukan di latar belakang tanpa interaksi pengguna segera. Aliran pemberian kelayakan pelanggan membenarkan perkhidmatan web (klien sulit) menggunakan bukti kelayakannya sendiri dan bukannya menyamar sebagai pengguna untuk mengesahkan apabila memanggil perkhidmatan web lain. Untuk tahap keselamatan yang lebih tinggi, perkhidmatan panggilan mungkin menggunakan sijil (bukan rahsia yang dikongsi) sebagai bukti kelayakan.

Spesifikasi OAuth2 diterangkan dalam
RFC-6749
RFC-8252
RFC-6819

Token JWT dan faedahnya

JWT (JSON Web Token) ialah standard terbuka (https://tools.ietf.org/html/rfc7519) yang mentakrifkan cara yang padat dan serba lengkap untuk memindahkan maklumat dengan selamat antara pihak sebagai objek JSON.

Menurut piawaian, token terdiri daripada tiga bahagian dalam format asas-64, dipisahkan oleh titik. Bahagian pertama dipanggil pengepala, yang mengandungi jenis token dan nama algoritma cincang untuk mendapatkan tandatangan digital. Bahagian kedua menyimpan maklumat asas (pengguna, atribut, dll.). Bahagian ketiga ialah tandatangan digital.

. .
Jangan sekali-kali menyimpan token dalam DB anda. Oleh kerana token yang sah adalah bersamaan dengan kata laluan, menyimpan token adalah seperti menyimpan kata laluan dalam teks yang jelas.
Token akses ialah token yang memberikan pemiliknya akses kepada sumber pelayan yang selamat. Ia biasanya mempunyai jangka hayat yang singkat dan mungkin membawa maklumat tambahan seperti alamat IP pihak yang meminta token.

Muat semula token ialah token yang membolehkan pelanggan meminta token akses baharu selepas hayat mereka tamat. Token ini biasanya dikeluarkan untuk jangka masa yang panjang.

Kelebihan utama penggunaan dalam seni bina perkhidmatan mikro:

  • Keupayaan untuk mengakses pelbagai aplikasi dan perkhidmatan melalui pengesahan sekali.
  • Dengan ketiadaan beberapa atribut yang diperlukan dalam profil pengguna, adalah mungkin untuk memperkayakan dengan data yang boleh ditambahkan pada muatan, termasuk automatik dan on-the-fly.
  • Tidak perlu menyimpan maklumat tentang sesi aktif, aplikasi pelayan hanya perlu mengesahkan tandatangan.
  • Kawalan akses yang lebih fleksibel melalui atribut tambahan dalam muatan.
  • Penggunaan tandatangan token untuk pengepala dan muatan meningkatkan keselamatan penyelesaian secara keseluruhan.

Token JWT - komposisi

Tajuk - secara lalai, pengepala hanya mengandungi jenis token dan algoritma yang digunakan untuk penyulitan.

Jenis token disimpan dalam kekunci "taip". Kekunci 'jenis' diabaikan dalam JWT. Jika kekunci "taip" ada, nilainya mestilah JWT untuk menunjukkan bahawa objek ini ialah Token Web JSON.

Kunci kedua "alg" mentakrifkan algoritma yang digunakan untuk menyulitkan token. Ia harus ditetapkan kepada HS256 secara lalai. Pengepala dikodkan dalam base64.

{ "alg": "HS256", "type": "JWT"}
muatan (kandungan) - muatan menyimpan sebarang maklumat yang perlu disemak. Setiap kunci dalam muatan dikenali sebagai "tuntutan". Sebagai contoh, anda boleh memasukkan permohonan hanya dengan jemputan (promo tertutup). Apabila kita ingin menjemput seseorang untuk mengambil bahagian, kita menghantar surat jemputan. Adalah penting untuk menyemak sama ada alamat e-mel milik orang yang menerima jemputan, jadi kami akan memasukkan alamat ini dalam muatan, untuk ini kami menyimpannya dalam kekunci "e-mel"

{ "e-mel": "[e-mel dilindungi]"}

Kunci dalam muatan boleh sewenang-wenangnya. Walau bagaimanapun, terdapat beberapa yang dikhaskan:

  • iss (Pengeluar) - Mengenal pasti aplikasi dari mana token dihantar.
  • sub (Subjek) - mentakrifkan subjek token.
  • aud (Khalayak) ialah tatasusunan rentetan sensitif huruf besar atau URI yang merupakan senarai penerima token ini. Apabila pihak penerima menerima JWT dengan kunci yang diberikan, ia mesti menyemak kehadiran dirinya dalam penerima - jika tidak, abaikan token.
  • exp (Masa Tamat Tempoh) - Menunjukkan apabila token tamat tempoh. Piawaian JWT memerlukan semua pelaksanaannya untuk menolak token yang telah tamat tempoh. Kunci exp mestilah cap masa dalam format unix.
  • nbf (Bukan Sebelum) ialah masa dalam format unix yang menentukan saat token menjadi sah.
  • iat (Dikeluarkan Pada) - Kunci ini mewakili masa token dikeluarkan dan boleh digunakan untuk menentukan umur JWT. Kunci iat mestilah cap masa dalam format unix.
  • Jti (ID JWT) β€” rentetan yang mentakrifkan pengecam unik token ini, sensitif huruf besar-besaran.

Adalah penting untuk memahami bahawa muatan tidak dihantar secara disulitkan (walaupun token boleh bersarang dan kemudian adalah mungkin untuk menghantar data yang disulitkan). Oleh itu, anda tidak boleh menyimpan sebarang maklumat rahsia di dalamnya. Seperti pengepala, muatan dikodkan base64.
Tandatangan - apabila kita mempunyai tajuk dan muatan, kita boleh mengira tandatangan.

Base64-encoded: pengepala dan muatan diambil, ia digabungkan menjadi rentetan melalui titik. Kemudian rentetan dan kunci rahsia ini dimasukkan ke algoritma penyulitan yang dinyatakan dalam pengepala (kunci "alg"). Kuncinya boleh berupa sebarang rentetan. Rentetan yang lebih panjang akan lebih disukai kerana ia akan mengambil masa yang lebih lama untuk diambil.

{"alg":"RSA1_5","payload":"A128CBC-HS256"}

Membina Seni Bina Kluster Keycloak Failover

Apabila menggunakan satu kluster untuk semua projek, terdapat peningkatan keperluan untuk penyelesaian SSO. Apabila bilangan projek adalah kecil, keperluan ini tidak begitu ketara untuk semua projek, namun, dengan peningkatan dalam bilangan pengguna dan penyepaduan, keperluan untuk ketersediaan dan peningkatan prestasi.

Meningkatkan risiko kegagalan SSO tunggal meningkatkan keperluan untuk seni bina penyelesaian dan kaedah yang digunakan untuk komponen berlebihan, dan membawa kepada SLA yang sangat ketat. Dalam hal ini, lebih kerap dalam pembangunan atau peringkat awal pelaksanaan penyelesaian, projek mempunyai infrastruktur sendiri yang tidak selamat. Apabila pembangunan berkembang, adalah perlu untuk membina peluang untuk pembangunan dan penskalaan. Ia adalah paling fleksibel untuk membina kelompok failover menggunakan virtualisasi kontena atau pendekatan hibrid.

Untuk bekerja dalam mod kelompok Aktif/Aktif dan Aktif/Pasif, ia diperlukan untuk memastikan ketekalan data dalam pangkalan data hubungan - kedua-dua nod pangkalan data mesti direplikasi secara serentak antara pusat data teragih geo yang berbeza.

Contoh paling mudah pemasangan tahan kerosakan.

SSO pada seni bina perkhidmatan mikro. Kami menggunakan Keycloak. Bahagian 1

Apakah faedah menggunakan satu kluster:

  • Ketersediaan dan prestasi tinggi.
  • Sokongan untuk mod pengendalian: Aktif / Aktif, Aktif / Pasif.
  • Keupayaan untuk skala secara dinamik - apabila menggunakan virtualisasi kontena.
  • Kemungkinan pengurusan dan pemantauan berpusat.
  • Pendekatan bersatu untuk pengenalpastian/pengesahan/keizinan pengguna dalam projek.
  • Interaksi yang lebih telus antara projek yang berbeza tanpa penglibatan pengguna.
  • Keupayaan untuk menggunakan semula token JWT dalam pelbagai projek.
  • Satu titik kepercayaan.
  • Pelancaran projek yang lebih pantas menggunakan virtualisasi perkhidmatan mikro/bekas (tidak perlu mengangkat dan mengkonfigurasi komponen tambahan).
  • Anda boleh membeli sokongan komersial daripada vendor.

Perkara yang Perlu Diperhatikan Semasa Merancang Kluster

DBMS

Keycloak menggunakan sistem pengurusan pangkalan data untuk menyimpan: alam, pelanggan, pengguna, dsb.
Pelbagai DBMS disokong: MS SQL, Oracle, MySQL, PostgreSQL. Keycloak datang dengan pangkalan data hubungan terbina dalam sendiri. Adalah disyorkan untuk digunakan untuk persekitaran tidak dimuatkan - seperti persekitaran pembangunan.

Untuk bekerja dalam mod kluster Aktif/Aktif dan Aktif/Pasif, ketekalan data dalam pangkalan data hubungan diperlukan dan kedua-dua nod kluster pangkalan data direplikasi secara serentak antara pusat data.

Cache teragih (Infinspan)

Untuk kluster berfungsi dengan betul, penyegerakan tambahan bagi jenis cache berikut menggunakan Grid Data JBoss diperlukan:

Sesi pengesahan - digunakan untuk menyimpan data semasa mengesahkan pengguna tertentu. Permintaan daripada cache ini biasanya hanya termasuk penyemak imbas dan pelayan Keycloak, bukan aplikasi.

Token tindakan digunakan untuk senario di mana pengguna perlu mengesahkan tindakan secara tidak segerak (melalui e-mel). Contohnya, semasa aliran lupa kata laluan, cache actionTokens Infinispan digunakan untuk menjejaki metadata tentang token tindakan berkaitan yang telah digunakan, jadi ia tidak boleh digunakan semula.

Caching dan penolakan data berterusan - digunakan untuk cache data berterusan untuk mengelakkan pertanyaan yang tidak perlu kepada pangkalan data. Apabila mana-mana pelayan Keycloak mengemas kini data, semua pelayan Keycloak lain di semua pusat data perlu mengetahui tentangnya.

Kerja - Hanya digunakan untuk menghantar mesej tidak sah antara nod kluster dan pusat data.

Sesi pengguna - digunakan untuk menyimpan data tentang sesi pengguna yang sah untuk tempoh sesi penyemak imbas pengguna. Cache mesti memproses permintaan HTTP daripada pengguna akhir dan aplikasi.

Perlindungan kekerasan - digunakan untuk menjejak data tentang log masuk yang gagal.

Pengimbangan beban

Pengimbang beban ialah titik masuk tunggal ke kunci dan mesti menyokong sesi melekit.

Pelayan Aplikasi

Ia digunakan untuk mengawal interaksi komponen antara satu sama lain dan boleh dimayakan atau dikontena menggunakan alat automasi sedia ada dan penskalaan dinamik alat automasi infrastruktur. Senario penggunaan yang paling biasa dalam OpenShift, Kubernates, Rancher.

Ini menyimpulkan bahagian pertama - yang teori. Dalam siri artikel seterusnya, contoh penyepaduan dengan pelbagai pembekal identiti dan contoh tetapan akan dianalisis.

Sumber: www.habr.com

Tambah komen