Mikro hizmet mimarisinde SSO. Keycloak kullanıyoruz. Bölüm 1

Herhangi bir büyük şirkette ve X5 Perakende Grubu da bir istisna değildir, geliştikçe kullanıcı yetkilendirmesi gerektiren projelerin sayısı artar. Zamanla kullanıcıların bir uygulamadan diğerine sorunsuz geçişi gerekli olur ve ardından tek bir Tek Oturum Açma (SSO) sunucusunun kullanılmasına ihtiyaç duyulur. Peki ya AD gibi kimlik sağlayıcıları veya ek öznitelikleri olmayan diğerleri çeşitli projelerde zaten kullanılıyorsa? “Kimlik aracıları” adı verilen bir sistem sınıfı kurtarmaya gelecek. En işlevsel olanlar Keycloak, Gravitee Access yönetimi vb. gibi temsilcileridir. Çoğu zaman kullanım durumları farklı olabilir: makine etkileşimi, kullanıcı katılımı vb. Çözüm, tüm gereksinimleri tek bir yerde birleştirebilen esnek ve ölçeklenebilir işlevselliği desteklemelidir. ve bu tür çözümler Şirketimizin artık bir gösterge komisyoncusu var – Keycloak.

Mikro hizmet mimarisinde SSO. Keycloak kullanıyoruz. Bölüm 1

Keycloak, RedHat tarafından sağlanan açık kaynaklı bir kimlik ve erişim kontrolü ürünüdür. Şirketin SSO - RH-SSO kullanan ürünlerinin temelini oluşturur.

Temel Kavramlar

Çözümler ve yaklaşımlarla ilgilenmeye başlamadan önce, süreçlerin terimlerine ve sırasına karar vermelisiniz:

Mikro hizmet mimarisinde SSO. Keycloak kullanıyoruz. Bölüm 1

kimlik bir konuyu tanımlayıcısından tanımaya yönelik bir prosedürdür (başka bir deyişle, bu bir adın, giriş bilgilerinin veya numaranın tanımıdır).

kimlik doğrulama – bu bir kimlik doğrulama prosedürüdür (kullanıcı bir şifre kullanılarak doğrulanır, mektup elektronik imza kullanılarak doğrulanır, vb.)

Yetki - bu, bir kaynağa (örneğin, e-postaya) erişimin sağlanmasıdır.

Kimlik Komisyoncusu Keycloak

tuş pelerini mikro hizmet mimarisi kalıplarının kullanılabileceği IS'de kullanılmak üzere tasarlanmış açık kaynaklı bir kimlik ve erişim yönetimi çözümüdür.

Keycloak, Tek Oturum Açma (SSO), Aracılı Kimlik ve Sosyal Oturum Açma, Kullanıcı Federasyonu, İstemci Bağdaştırıcıları, Yönetici Konsolu ve Hesap Yönetim Konsolu gibi özellikler sunar.

Keycloak'ta desteklenen temel işlevler:

  • Tarayıcı uygulamaları için Tek Oturum Açma ve Tek Oturum Kapatma.
  • OpenID/OAuth 2.0/SAML desteği.
  • Kimlik Aracılığı - harici OpenID Connect veya SAML kimlik sağlayıcılarını kullanarak kimlik doğrulama.
  • Sosyal Giriş - Kullanıcı tanımlama için Google, GitHub, Facebook, Twitter desteği.
  • Kullanıcı Federasyonu - LDAP ve Active Directory sunucularından ve diğer kimlik sağlayıcılarından kullanıcıların senkronizasyonu.
  • Kerberos köprüsü - otomatik kullanıcı kimlik doğrulaması için Kerberos sunucusunun kullanılması.
  • Yönetici Konsolu - Web üzerinden ayarların ve çözüm seçeneklerinin birleşik yönetimi için.
  • Hesap Yönetim Konsolu – bağımsız kullanıcı profili yönetimi için.
  • Çözümün şirketin kurumsal kimliğine göre özelleştirilmesi.
  • 2FA Kimlik Doğrulaması - Google Authenticator veya FreeOTP kullanılarak TOTP/HOTP desteği.
  • Oturum Açma Akışları - kullanıcının kendi kendine kaydı, parola kurtarma ve sıfırlama ve diğerleri mümkündür.
  • Oturum Yönetimi – yöneticiler kullanıcı oturumlarını tek bir noktadan yönetebilirler.
  • Token Eşleyicileri - kullanıcı niteliklerini, rollerini ve diğer gerekli nitelikleri tokenlara bağlar.
  • Bölge, uygulama ve kullanıcılar aracılığıyla esnek politika yönetimi.
  • CORS Desteği – İstemci bağdaştırıcılarının yerel CORS desteği vardır.
  • Servis Sağlayıcı Arayüzleri (SPI) - Sunucunun çeşitli yönlerini özelleştirmenize olanak tanıyan çok sayıda SPI: kimlik doğrulama akışları, kimlik sağlayıcıları, protokol eşleme ve daha fazlası.
  • JavaScript uygulamaları için istemci adaptörleri, WildFly, JBoss EAP, Fuse, Tomcat, Jetty, Spring.
  • OpenID Connect Relying Party kitaplığını veya SAML 2.0 Servis Sağlayıcı Kitaplığını destekleyen çeşitli uygulamalarla çalışma desteği.
  • Eklentiler kullanılarak genişletilebilir.

Keycloak'ta CI/CD süreçlerinin yanı sıra yönetim süreçlerinin otomasyonu için de REST API/JAVA API kullanılabilir. Dokümantasyon elektronik olarak mevcuttur:

REST API https://www.keycloak.org/docs-api/8.0/rest-api/index.html
JAVA API'sı https://www.keycloak.org/docs-api/8.0/javadocs/index.html

Kurumsal Kimlik Sağlayıcıları (Şirket İçi)

Kullanıcı Federasyonu hizmetleri aracılığıyla kullanıcıların kimliğini doğrulayabilme.

Mikro hizmet mimarisinde SSO. Keycloak kullanıyoruz. Bölüm 1

Doğrudan kimlik doğrulama da kullanılabilir; eğer kullanıcıların kimlikleri Kerberos (LDAP veya AD) ile iş istasyonlarında doğrulanırsa, kullanıcı adlarını ve şifrelerini tekrar girmek zorunda kalmadan Keycloak'ta otomatik olarak kimlikleri doğrulanabilir.

Kullanıcıların kimlik doğrulaması ve daha fazla yetkilendirilmesi için, projelerin ilk aşamalarında uzun ayarlar ve entegrasyonlar içermediğinden, geliştirme ortamları için en uygun olan ilişkisel bir DBMS'nin kullanılması mümkündür. Varsayılan olarak Keycloak, ayarları ve kullanıcı verilerini depolamak için yerleşik bir DBMS kullanır.

Desteklenen DBMS listesi kapsamlıdır ve şunları içerir: MS SQL, Oracle, PostgreSQL, MariaDB, Oracle ve diğerleri. Şu ana kadar en çok test edilenler Oracle 12C Sürüm1 RAC ve MariaDB 3.12 için Galera 10.1.19 kümesidir.

Kimlik sağlayıcılar - sosyal giriş

Sosyal ağlardan giriş yapmak mümkündür. Kullanıcıların kimliğini doğrulama özelliğini etkinleştirmek için Keycloack yönetici konsolunu kullanın. Uygulama kodunda değişiklik yapılmasına gerek yoktur ve bu işlevsellik kutudan çıktığı haliyle mevcuttur ve projenin herhangi bir aşamasında etkinleştirilebilir.

Mikro hizmet mimarisinde SSO. Keycloak kullanıyoruz. Bölüm 1

Kullanıcı kimlik doğrulaması için OpenID/SAML Kimlik sağlayıcılarını kullanmak mümkündür.

Keycloak'ta OAuth2 kullanan tipik yetkilendirme senaryoları

Yetkilendirme Kodu Akışı — sunucu tarafı uygulamalarla kullanılır. En yaygın yetkilendirme izni türlerinden biridir çünkü uygulamanın kaynak kodunun ve istemci verilerinin başkaları tarafından erişilemediği sunucu tarafı uygulamaları için çok uygundur. Bu durumda süreç yeniden yönlendirmeye dayanmaktadır. Uygulamanın, kullanıcı aracısı aracılığıyla iletilen API yetkilendirme kodlarını alabilmesi için web tarayıcısı gibi bir kullanıcı aracısıyla (kullanıcı aracısı) iletişim kurabilmesi gerekir.

örtülü akış - mobil veya web uygulamaları (kullanıcının cihazında çalışan uygulamalar) tarafından kullanılır.

Örtülü yetkilendirme izin türü, istemci gizliliğinin garanti edilemediği mobil ve web uygulamaları tarafından kullanılır. Örtülü izin türü aynı zamanda kullanıcı aracısı yeniden yönlendirmesini de kullanır; bu sayede erişim belirteci, uygulamada daha fazla kullanılmak üzere kullanıcı aracısına iletilir. Bu, jetonun kullanıcı tarafından ve kullanıcının cihazındaki diğer uygulamalar tarafından kullanılabilir olmasını sağlar. Bu tür yetkilendirme izni, uygulamanın kimliğini doğrulamaz ve sürecin kendisi bir yönlendirme URL'sine (hizmete daha önce kayıtlı) dayanır.

Implicit Flow, erişim belirteci yenileme belirteçlerini desteklemez.

Müşteri Kimlik Bilgileri Hibe Akışı — uygulama API'ye eriştiğinde kullanılır. Bu tür yetkilendirme izni genellikle, hemen kullanıcı etkileşimi olmadan arka planda gerçekleşmesi gereken sunucular arası etkileşimler için kullanılır. İstemci kimlik bilgisi verme akışı, bir web hizmetinin (gizli istemci), başka bir web hizmetini çağırırken kimlik doğrulama için kullanıcının kimliğine bürünmek yerine kendi kimlik bilgilerini kullanmasına olanak tanır. Daha yüksek düzeyde güvenlik için, arayan hizmetin kimlik bilgileri olarak (paylaşılan sır yerine) bir sertifika kullanması mümkündür.

OAuth2 spesifikasyonu şurada açıklanmıştır:
RFC 6749
RFC 8252
RFC 6819

JWT tokenı ve avantajları

JWT (JSON Web Token) açık bir standarttır (https://tools.ietf.org/html/rfc7519) bilgileri taraflar arasında bir JSON nesnesi olarak güvenli bir şekilde aktarmanın kompakt ve bağımsız bir yolunu tanımlar.

Standarda göre token, noktalarla ayrılmış, base-64 formatında üç parçadan oluşuyor. İlk bölüm, token türünü ve dijital imza elde etmek için kullanılan karma algoritmanın adını içeren başlık olarak adlandırılır. İkinci bölüm temel bilgileri (kullanıcı, özellikler vb.) saklar. Üçüncü bölüm dijital imzadır.

. .
Belirteci asla veritabanınızda saklamayın. Geçerli bir belirteç parolaya eşdeğer olduğundan, belirteci saklamak, parolayı açık metin olarak saklamak gibidir.
Erişim jetonu sahibine güvenli sunucu kaynaklarına erişim izni veren bir belirteçtir. Genellikle kısa bir ömrü vardır ve tokenı talep eden tarafın IP adresi gibi ek bilgileri taşıyabilir.

Jetonu yenile Müşterilerin kullanım süreleri dolduktan sonra yeni erişim belirteçleri talep etmelerine olanak tanıyan bir belirteçtir. Bu tokenlar genellikle uzun bir süre için verilir.

Mikro hizmet mimarisinde kullanmanın başlıca avantajları:

  • Tek seferlik kimlik doğrulama yoluyla çeşitli uygulama ve hizmetlere erişme yeteneği.
  • Kullanıcı profilinde gerekli bir dizi özelliğin bulunmaması durumunda, otomatikleştirilmiş ve anında olmak üzere veri yüküne eklenebilecek verilerle zenginleştirmek mümkündür.
  • Aktif oturumlara ilişkin bilgilerin saklanmasına gerek yoktur; sunucu uygulamasının yalnızca imzayı doğrulaması gerekir.
  • Yükteki ek özellikler aracılığıyla daha esnek erişim kontrolü.
  • Başlık ve yük için belirteç imzasının kullanılması, çözümün güvenliğini bir bütün olarak artırır.

JWT belirteci - bileşim

Başlık — varsayılan olarak başlık yalnızca belirteç türünü ve şifreleme için kullanılan algoritmayı içerir.

Belirteç türü "tip" anahtarında saklanır. JWT'de "type" tuşu dikkate alınmaz. "typ" anahtarı mevcutsa bu nesnenin bir JSON Web Token olduğunu belirtmek için değerinin JWT olması gerekir.

İkinci anahtar "alg", jetonu şifrelemek için kullanılan algoritmayı belirtir. Varsayılan olarak HS256'ya ayarlanmalıdır. Başlık base64'te kodlanmıştır.

{ "alg": "HS256", "type": "JWT"}
yük (içerik) - yük, kontrol edilmesi gereken her türlü bilgiyi saklar. Yükteki her anahtar bir "talep" olarak bilinir. Örneğin uygulamaya yalnızca davetle girebilirsiniz (promosyon kapalı). Birini katılmaya davet etmek istediğimizde ona bir davet mektubu göndeririz. E-posta adresinin daveti kabul eden kişiye ait olup olmadığını kontrol etmek önemlidir, dolayısıyla bu adresi payload'a dahil edeceğiz, bunun için "e-posta" anahtarında saklıyoruz

{ "e-posta": "[e-posta korumalı]" }

Yükteki anahtarlar isteğe bağlı olabilir. Ancak birkaç tane saklıdır:

  • iss (Verici) - Belirtecin gönderildiği uygulamayı tanımlar.
  • sub (Konu) - belirtecin konusunu tanımlar.
  • aud (Kitle) – bu belirtecin alıcılarının listesi olan büyük/küçük harfe duyarlı dizeler veya URI'ler dizisi. Alıcı taraf, belirli bir anahtara sahip bir JWT aldığında, alıcılarda kendisini kontrol etmelidir; aksi halde belirteci dikkate almayın.
  • exp (Son Kullanım Süresi) - Belirtecin süresinin ne zaman dolduğunu gösterir. JWT standardı, tüm uygulamalarının süresi dolmuş belirteçleri reddetmesini gerektirir. Exp anahtarı unix formatında bir zaman damgası olmalıdır.
  • nbf (Önce Değil), tokenin geçerli olacağı anı belirleyen, unix formatındaki bir zamandır.
  • iat (Verilme Tarihi) - Bu anahtar, tokenin düzenlendiği zamanı temsil eder ve JWT'nin yaşını belirlemek için kullanılabilir. iat anahtarı unix formatında bir zaman damgası olmalıdır.
  • Jti (JWT ID), bu belirteç için benzersiz, büyük/küçük harfe duyarlı bir tanımlayıcıyı tanımlayan bir dizedir.

Yükün şifreli biçimde iletilmediğini anlamak önemlidir (her ne kadar belirteçler iç içe yerleştirilebilse ve şifrelenmiş verileri iletmek mümkün olsa da). Bu nedenle herhangi bir gizli bilgiyi saklayamaz. Başlık gibi, yük de base64 kodludur.
imza - Bir unvanımız ve payloadımız olduğunda imzayı hesaplayabiliriz.

Base64'te kodlanan başlık ve yük alınır ve noktayla ayrılmış bir çizgide birleştirilir. Bu dize ve gizli anahtar daha sonra başlıkta belirtilen şifreleme algoritmasına (“alg” anahtarı) girilir. Anahtar herhangi bir dize olabilir. Daha uzun dizeler, seçim için daha fazla zaman gerektireceğinden en çok tercih edilenler olacaktır.

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

Keycloak Yük Devretme Kümesi Mimarisi Oluşturma

Tüm projeler için tek bir küme kullanıldığında SSO çözümüne yönelik gereksinimler artar. Proje sayısı az olduğunda bu gereksinimler tüm projelerde çok belirgin değildir ancak kullanıcı sayısı ve entegrasyonların artmasıyla birlikte kullanılabilirlik ve performans gereksinimleri de artar.

Tek SSO hatası riskinin artması, çözüm mimarisine ve yedekli bileşenler için kullanılan yöntemlere yönelik gereksinimleri artırır ve çok sıkı bir SLA'ya yol açar. Bu bağlamda, çoğunlukla geliştirme aşamasında veya çözümlerin uygulanmasının ilk aşamalarında, projelerin hataya dayanıklı olmayan kendi altyapıları vardır. Geliştirme ilerledikçe, geliştirme ve ölçeklendirme fırsatlarının ortaya konulması gerekir. Konteyner sanallaştırma veya hibrit bir yaklaşım kullanarak bir yük devretme kümesi oluşturmak en esnek yöntemdir.

Aktif/Aktif ve Aktif/Pasif küme modlarında çalışmak için ilişkisel veritabanında veri tutarlılığının sağlanması gerekir; her iki veritabanı düğümünün farklı coğrafi olarak dağıtılmış veri merkezleri arasında eşzamanlı olarak kopyalanması gerekir.

Hataya dayanıklı kurulumun en basit örneği.

Mikro hizmet mimarisinde SSO. Keycloak kullanıyoruz. Bölüm 1

Tek bir küme kullanmanın faydaları nelerdir:

  • Yüksek kullanılabilirlik ve performans.
  • Desteklenen çalışma modları: Aktif/Aktif, Aktif/Pasif.
  • Konteyner sanallaştırmasını kullanırken dinamik olarak ölçeklendirme yeteneği.
  • Merkezi yönetim ve izleme imkanı.
  • Projelerdeki kullanıcıların tanımlanması/kimlik doğrulanması/yetkilendirilmesi için birleşik yaklaşım.
  • Kullanıcı katılımı olmadan farklı projeler arasında daha şeffaf etkileşim.
  • JWT jetonunu çeşitli projelerde yeniden kullanma imkanı.
  • Tek güven noktası.
  • Mikro hizmetler/konteyner sanallaştırması kullanılarak projelerin daha hızlı başlatılması (ek bileşenleri kaldırmaya ve yapılandırmaya gerek yoktur).
  • Satıcıdan ticari destek satın almak mümkündür.

Küme planlarken dikkate alınması gerekenler

DBMS

Keycloak depolamak için bir veritabanı yönetim sistemi kullanır: alanlar, istemciler, kullanıcılar vb.
Çok çeşitli DBMS desteklenir: MS SQL, Oracle, MySQL, PostgreSQL. Keycloak kendi yerleşik ilişkisel veritabanıyla birlikte gelir. Geliştirme ortamları gibi yüklü olmayan ortamlar için kullanılması önerilir.

Aktif/Aktif ve Aktif/Pasif küme modlarında çalışmak için ilişkisel bir veritabanındaki veri tutarlılığı gerekir ve her iki veritabanı kümesi düğümü, veri merkezleri arasında eşzamanlı olarak çoğaltılır.

Dağıtılmış önbellek (Infinspan)

Kümenin doğru çalışması için JBoss Data Grid kullanılarak aşağıdaki önbellek türlerinin ek senkronizasyonu gerekir:

Kimlik doğrulama oturumları - belirli bir kullanıcının kimliğini doğrularken verileri kaydetmek için kullanılır. Bu önbellekten gelen istekler genellikle uygulamayı değil, yalnızca tarayıcıyı ve Keycloak sunucusunu içerir.

Eylem belirteçleri, kullanıcının bir eylemi eşzamansız olarak (e-posta yoluyla) onaylaması gereken senaryolar için kullanılır. Örneğin, parola unutma akışı sırasında, actionTokens Infinispan önbelleği, daha önce kullanılmış olan ilişkili eylem belirteçleri hakkındaki meta verileri takip etmek için kullanılır, dolayısıyla yeniden kullanılamaz.

Kalıcı verilerin önbelleğe alınması ve geçersiz kılınması: Veritabanına yapılan gereksiz sorguları önlemek amacıyla kalıcı verileri önbelleğe almak için kullanılır. Herhangi bir Keycloak sunucusu verileri güncellediğinde, tüm veri merkezlerindeki diğer tüm Keycloak sunucularının bunu bilmesi gerekir.

İş - Yalnızca küme düğümleri ve veri merkezleri arasında geçersiz mesajlar göndermek için kullanılır.

Kullanıcı oturumları - kullanıcının tarayıcı oturumu süresince geçerli olan kullanıcı oturumları hakkındaki verileri depolamak için kullanılır. Önbellek, son kullanıcıdan ve uygulamadan gelen HTTP isteklerini işlemelidir.

Kaba kuvvet koruması - başarısız oturum açmalarla ilgili verileri izlemek için kullanılır.

Yük dengeleme

Yük dengeleyici, keycloak'a tek giriş noktasıdır ve yapışkan oturumları desteklemelidir.

Uygulama Sunucuları

Bileşenlerin birbirleriyle etkileşimini kontrol etmek için kullanılırlar ve mevcut otomasyon araçları ve altyapı otomasyon araçlarının dinamik ölçeklendirilmesi kullanılarak sanallaştırılabilir veya kapsayıcı hale getirilebilir. OpenShift, Kubernates ve Rancher'daki en yaygın dağıtım senaryoları.

Bu, ilk kısmı - teorik kısmı - tamamlıyor. Sonraki yazı dizimizde çeşitli kimlik sağlayıcılarla entegrasyon örnekleri ve ayar örnekleri incelenecektir.

Kaynak: habr.com

Yorum ekle