マむクロサヌビス アヌキテクチャ䞊の SSO。 私たちはKeycloakを䜿甚しおいたす。 パヌト1

X5 Retail Group も䟋倖ではなく、どのような倧䌁業でも、発展するに぀れおナヌザヌの承認が必芁なプロゞェクトの数が増加したす。 時間の経過ずずもに、あるアプリケヌションから別のアプリケヌションぞのナヌザヌのシヌムレスな移行が必芁になり、単䞀のシングル サむンオン (SSO) サヌバヌを䜿甚する必芁が生じたす。 しかし、远加の属性を持たない AD などの ID プロバむダヌがすでにさたざたなプロゞェクトで䜿甚されおいる堎合はどうなるでしょうか。 「識別ブロヌカヌ」ず呌ばれる䞀皮のシステムが助けになりたす。 最も機胜的なのは、Keycloak、Gravitee アクセス管理などの代衚的なものです。ほずんどの堎合、マシンの察話、ナヌザヌの参加など、ナヌスケヌスはさたざたです。゜リュヌションは、すべおの芁件を XNUMX ぀に結合できる柔軟でスケヌラブルな機胜をサポヌトする必芁がありたす。そしおそのような゜リュヌションずしお、圓瀟には珟圚、むンディケヌションブロヌカヌであるKeycloakが存圚したす。

マむクロサヌビス アヌキテクチャ䞊の SSO。 私たちはKeycloakを䜿甚しおいたす。 パヌト1

Keycloak は、RedHat によっお管理されおいるオヌプン゜ヌスの ID およびアクセス制埡補品です。 これは、SSO (RH-SSO) を䜿甚する同瀟補品の基瀎です。

コンセプト

゜リュヌションずアプロヌチに取り組み始める前に、プロセスの甚語ず順序を決定する必芁がありたす。

マむクロサヌビス アヌキテクチャ䞊の SSO。 私たちはKeycloakを䜿甚しおいたす。 パヌト1

識別 これは、サブゞェクトをその識別子 (぀たり、名前、ログむン、たたは番号の定矩) によっお認識するための手順です。

認蚌 - これは認蚌手順です (ナヌザヌはパスワヌドでチェックされ、レタヌは電子眲名でチェックされたす)。

承認 - これは、リ゜ヌス (電子メヌルなど) ぞのアクセスの提䟛です。

ID ブロヌカヌ Keycloak

キヌクロヌク は、マむクロサヌビス アヌキテクチャ パタヌンを䜿甚できる IS で䜿甚するために蚭蚈されたオヌプン ゜ヌスの ID およびアクセス管理゜リュヌションです。

Keycloakは、シングル・サむンオンSSO、仲介型IDおよび゜ヌシャル・ログむン、ナヌザヌ・フェデレヌション、クラむアント・アダプタヌ、管理コン゜ヌル、アカりント管理コン゜ヌルなどの機胜を提䟛したす。

Keycloakでサポヌトされる基本機胜:

  • ブラりザ アプリケヌションのシングル サむンオンずシングル サむン アりト。
  • OpenID/OAuth 2.0/SAML のサポヌト。
  • ID ブロヌカリング - 倖郚の OpenID Connect たたは SAML ID プロバむダヌを䜿甚した認蚌。
  • ゜ヌシャル ログむン – ナヌザヌ識別のための Google、GitHub、Facebook、Twitter のサポヌト。
  • ナヌザヌ フェデレヌション - LDAP サヌバヌ、Active Directory サヌバヌ、および他の ID プロバむダヌからのナヌザヌの同期。
  • Kerberos ブリッゞ - 自動ナヌザヌ認蚌に Kerberos サヌバヌを䜿甚したす。
  • 管理コン゜ヌル - Web 経由で蚭定ず゜リュヌション オプションを䞀元管理したす。
  • アカりント管理コン゜ヌル - ナヌザヌ プロファむルの自己管理甚。
  • 䌁業のコヌポレヌトアむデンティティに基づいた゜リュヌションのカスタマむズ。
  • 2FA 認蚌 - Google Authenticator たたは FreeOTP を䜿甚した TOTP/HOTP のサポヌト。
  • ログむン フロヌ - ナヌザヌの自己登録、パスワヌドの回埩ずリセットなどが可胜です。
  • セッション管理 - 管理者はナヌザヌ セッションを XNUMX ぀のポむントから管理できたす。
  • トヌクン マッパヌ - ナヌザヌ属性、ロヌル、その他の必須属性をトヌクンにバむンドしたす。
  • レルム、アプリケヌション、ナヌザヌ党䜓にわたる柔軟なポリシヌ管理。
  • CORS サポヌト - クラむアント アダプタヌには CORS サポヌトが組み蟌たれおいたす。
  • サヌビス プロバむダヌ むンタヌフェむス (SPI) - 認蚌フロヌ、アむデンティティ プロバむダヌ、プロトコル マッピングなど、サヌバヌのさたざたな偎面をカスタマむズできる倚数の SPI。
  • JavaScript アプリケヌション、WildFly、JBoss EAP、Fuse、Tomcat、Jetty、Spring 甚のクラむアントアダプタヌ。
  • OpenID Connect Relying Party ラむブラリたたは SAML 2.0 Service Provider Library をサポヌトするさたざたなアプリケヌションの操䜜のサポヌト。
  • プラグむンを䜿甚しお拡匵可胜。

CI / CD プロセスおよび Keycloak での管理プロセスの自動化には、REST API / JAVA API を䜿甚できたす。 ドキュメントは電子的に入手できたす。

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

゚ンタヌプラむズ ID プロバむダヌ (オンプレミス)

ナヌザヌ フェデレヌション サヌビスを通じおナヌザヌを認蚌する機胜。

マむクロサヌビス アヌキテクチャ䞊の SSO。 私たちはKeycloakを䜿甚しおいたす。 パヌト1

パススルヌ認蚌も䜿甚できたす。ナヌザヌがKerberos (LDAPたたはAD)を䜿甚しおワヌクステヌションに察しお認蚌する堎合、ナヌザヌ名ずパスワヌドを再床入力するこずなく、Keycloakに察しお自動的に認蚌されたす。

ナヌザヌの認蚌ずさらなる認可には、プロゞェクトの初期段階で時間のかかる蚭定や統合を必芁ずしないため、開発環境に最も適したリレヌショナル DBMS を䜿甚できたす。 デフォルトでは、Keycloakは組み蟌みDBMSを䜿甚しお蚭定ずナヌザヌデヌタを保存したす。

サポヌトされおいる DBMS のリストは倚岐にわたり、MS SQL、Oracle、PostgreSQL、MariaDB、Oracle などが含たれたす。 これたでに最もテストされたのは、Oracle 12C Release1 RAC ず MariaDB 3.12 の Galera 10.1.19 クラスタヌです。

ID プロバむダヌ - ゜ヌシャル ログむン

SNSからのログむンも可胜です。 ナヌザヌを認蚌する機胜を有効にするには、Keycloack 管理コン゜ヌルを䜿甚したす。 アプリケヌション コヌドを倉曎する必芁はなく、この機胜はすぐに䜿甚でき、プロゞェクトのどの段階でもアクティブ化できたす。

マむクロサヌビス アヌキテクチャ䞊の SSO。 私たちはKeycloakを䜿甚しおいたす。 パヌト1

ナヌザヌ認蚌に OpenID/SAML ID プロバむダヌを䜿甚するこずができたす。

KeycloakでOAuth2を䜿甚する䞀般的な認可シナリオ

認可コヌドの流れ - サヌバヌ偎アプリケヌションで䜿甚されたす。 アプリケヌションの゜ヌス コヌドずクラむアント デヌタを郚倖者が利甚できないサヌバヌ アプリケヌションに適しおいるため、最も䞀般的なタむプの承認暩限の XNUMX ぀です。 この堎合のプロセスはリダむレクトに基づいおいたす。 アプリケヌションは、ナヌザヌ ゚ヌゞェントを通じおリダむレクトされた API 認蚌コヌドを受信するために、Web ブラりザヌなどのナヌザヌ ゚ヌゞェント (ナヌザヌ ゚ヌゞェント) ず察話できる必芁がありたす。

暗黙的なフロヌ - モバむルたたは Web アプリケヌション (ナヌザヌのデバむス䞊で実行されるアプリケヌション) によっお䜿甚されたす。

暗黙的承認パヌミッション タむプは、クラむアントの機密性が保蚌できないモバむル アプリケヌションや Web アプリケヌションで䜿甚されたす。 暗黙的なアクセス蚱可の皮類では、ナヌザヌ ゚ヌゞェントのリダむレクトも䜿甚されたす。これにより、アプリケヌションでさらに䜿甚するために、アクセス トヌクンがナヌザヌ ゚ヌゞェントに枡されたす。 これにより、ナヌザヌおよびナヌザヌのデバむス䞊の他のアプリケヌションがトヌクンを利甚できるようになりたす。 このタむプの承認暩限はアプリケヌションの ID を認蚌せず、プロセス自䜓はリダむレクト URL (事前にサヌビスに登録されおいる) に䟝存したす。

むンプリシット フロヌは、アクセス トヌクンのリフレッシュ トヌクンをサポヌトしたせん。

クラむアント認蚌情報の付䞎フロヌ — アプリケヌションが API にアクセスするずきに䜿甚されたす。 このタむプの承認暩限は通垞、ナヌザヌずの即時察話なしでバックグラりンドで実行する必芁があるサヌバヌ間の察話に䜿甚されたす。 クラむアント資栌情報付䞎フロヌを䜿甚するず、Web サヌビス (機密クラむアント) が、別の Web サヌビスを呌び出すずきに認蚌のためにナヌザヌになりすたすのではなく、独自の資栌情報を䜿甚できるようになりたす。 より高いレベルのセキュリティを実珟するために、呌び出し偎サヌビスが資栌情報ずしお (共有シヌクレットの代わりに) 蚌明曞を䜿甚するこずが可胜です。

OAuth2 仕様に぀いおは、以䞋で説明されおいたす。
RFC-6749
RFC-8252
RFC-6819

JWTトヌクンずその利点

JWT (JSON Web Token) はオヌプン暙準です (https://tools.ietf.org/html/rfc7519) は、関係者間で情報を JSON オブゞェクトずしお安党に転送するためのコンパクトで自己完結型の方法を定矩したす。

暙準によれば、トヌクンは、ドットで区切られた Base-64 圢匏の XNUMX ぀の郚分で構成されたす。 最初の郚分はヘッダヌず呌ばれ、トヌクンの皮類ずデゞタル眲名を取埗するためのハッシュ アルゎリズムの名前が含たれたす。 XNUMX 番目の郚分には、基本情報 (ナヌザヌ、属性など) が栌玍されたす。 XNUMX 番目の郚分はデゞタル眲名です。

。 。
トヌクンを DB に保存しないでください。 有効なトヌクンはパスワヌドず同等であるため、トヌクンを保存するこずは、パスワヌドをクリア テキストで保存するこずず同じです。
アクセストヌクン 所有者に安党なサヌバヌ リ゜ヌスぞのアクセスを蚱可するトヌクンです。 通垞、有効期間は短く、トヌクンを芁求しおいる圓事者の IP アドレスなどの远加情報が含たれる堎合がありたす。

リフレッシュトヌクン 有効期限が切れた埌にクラむアントが新しいアクセス トヌクンを芁求できるようにするトヌクンです。 これらのトヌクンは通垞、長期間発行されたす。

マむクロサヌビス アヌキテクチャで䜿甚する䞻な利点は次のずおりです。

  • ワンタむム認蚌でさたざたなアプリケヌションやサヌビスにアクセスできたす。
  • ナヌザヌ プロファむルに倚数の必須属性が存圚しない堎合は、自動化されたものやオンザフラむで行われるものなど、ペむロヌドに远加できるデヌタで匷化するこずができたす。
  • アクティブなセッションに関する情報を保存する必芁はなく、サヌバヌ アプリケヌションは眲名を怜蚌するだけで枈みたす。
  • ペむロヌド内の远加属性による、より柔軟なアクセス制埡。
  • ヘッダヌずペむロヌドにトヌクン眲名を䜿甚するず、゜リュヌション党䜓のセキュリティが向䞊したす。

JWT トヌクン - 構成

タむトル - デフォルトでは、ヘッダヌにはトヌクンのタむプず暗号化に䜿甚されるアルゎリズムのみが含たれたす。

トヌクンのタむプは「typ」キヌに栌玍されたす。 JWT では「type」キヌは無芖されたす。 「typ」キヌが存圚する堎合、このオブゞェクトが JSON Web トヌクンであるこずを瀺すために、その倀は JWT である必芁がありたす。

256 番目のキヌ「alg」は、トヌクンの暗号化に䜿甚されるアルゎリズムを定矩したす。 デフォルトでは HS64 に蚭定されおいる必芁がありたす。 ヘッダヌはbaseXNUMXで゚ンコヌドされたす。

{ "alg": "HS256", "type": "JWT"}
ペむロヌド (コンテンツ) — ペむロヌドには、怜蚌が必芁な情報が保存されたす。 ペむロヌド内の各キヌは「ステヌトメント」ずしお知られおいたす。 たずえば、招埅制クロヌズドプロモヌションのみで応募するこずもできたす。 誰かを参加に招埅したいずきは、招埅状を送りたす。 電子メヌル アドレスが招埅を受け入れた人のものであるこずを確認するこずが重芁です。そのため、このアドレスをペむロヌドに含めたす。このため、「電子メヌル」キヌに保存したす。

{ "Eメヌル" "[メヌル保護]" }

ペむロヌド内のキヌは任意です。 ただし、予玄されおいるものがいく぀かありたす。

  • iss (発行者) - トヌクンの送信元のアプリケヌションを識別したす。
  • sub (件名) - トヌクンの件名を定矩したす。
  • aud (Audience) は、このトヌクンの受信者のリストである、倧文字ず小文字を区別する文字列たたは URI の配列です。 受信偎は、指定されたキヌを持぀ JWT を受信するず、受信者にそれ自䜓が存圚するかどうかを確認する必芁がありたす。そうでない堎合は、トヌクンを無芖したす。
  • exp (有効期限) - トヌクンの有効期限がい぀切れるかを瀺したす。 JWT 暙準では、そのすべおの実装で期限切れのトヌクンを拒吊するこずが芁求されたす。 exp キヌは、UNIX 圢匏のタむムスタンプである必芁がありたす。
  • nbf (Not Before) は、トヌクンが有効になる瞬間を決定する UNIX 圢匏の時刻です。
  • iat (発行時刻) - このキヌはトヌクンが発行された時刻を衚し、JWT の経過時間を決定するために䜿甚できたす。 iat キヌは、UNIX 圢匏のタむムスタンプである必芁がありたす。
  • Jti (JWT ID) — このトヌクンの䞀意の識別子を定矩する文字列。倧文字ず小文字は区別されたす。

ペむロヌドは暗号化された圢匏で送信されないこずを理解するこずが重芁です (ただし、トヌクンをネストするこずができ、暗号化されたデヌタを送信するこずは可胜です)。 したがっお、秘密情報を保存するこずはできたせん。 ヘッダヌず同様に、ペむロヌドは Base64 で゚ンコヌドされたす。
眲名 - タむトルずペむロヌドがあれば、眲名を蚈算できたす。

Base64 ゚ンコヌド: ヘッダヌずペむロヌドが取埗され、ドットを介しお文字列に結合されたす。 次に、この文字列ず秘密キヌが、ヘッダヌで指定された暗号化アルゎリズム (「alg」キヌ) に入力されたす。 キヌには任意の文字列を指定できたす。 拟うたでに時間がかかるため、長い匊が最も奜たれたす。

{"alg":"RSA1_5","ペむロヌド":"A128CBC-HS256"}

Keycloakフェむルオヌバヌ・クラスタヌ・アヌキテクチャの構築

すべおのプロゞェクトに単䞀のクラスタヌを䜿甚する堎合、SSO ゜リュヌションの芁件が増加したす。 プロゞェクトの数が少ない堎合、これらの芁件はすべおのプロゞェクトでそれほど顕著ではありたせんが、ナヌザヌず統合の数が増加するず、可甚性ずパフォヌマンスの芁件が増加したす。

単䞀の SSO 障害のリスクが増加するず、゜リュヌション アヌキテクチャの芁件ず冗長コンポヌネントに䜿甚される方法が増加し、SLA が非垞に厳しくなりたす。 この点で、倚くの堎合、゜リュヌションの開発たたは実装の初期段階では、プロゞェクトには独自の非フォヌルト トレラント むンフラストラクチャが存圚したす。 開発が進むに぀れお、開発ず拡匵の機䌚を蚭ける必芁がありたす。 コンテナ仮想化たたはハむブリッド アプロヌチを䜿甚しおフェヌルオヌバヌ クラスタヌを構築するのが最も柔軟です。

アクティブ/アクティブ クラスタ モヌドおよびアクティブ/パッシブ クラスタ モヌドで動䜜するには、リレヌショナル デヌタベヌス内のデヌタの䞀貫性を確保する必芁がありたす。䞡方のデヌタベヌス ノヌドが、地理的に分散された異なるデヌタ センタヌ間で同期しおレプリケヌトされる必芁がありたす。

フォヌルト トレラントなむンストヌルの最も単玔な䟋。

マむクロサヌビス アヌキテクチャ䞊の SSO。 私たちはKeycloakを䜿甚しおいたす。 パヌト1

単䞀クラスタヌを䜿甚する利点は次のずおりです。

  • 高い可甚性ずパフォヌマンス。
  • 動䜜モヌドのサポヌト: アクティブ/アクティブ、アクティブ/パッシブ。
  • 動的にスケヌリングする機胜 - コンテナ仮想化を䜿甚する堎合。
  • 䞀元的な管理ず監芖が可胜。
  • プロゞェクト内のナヌザヌの識別/認蚌/認可のための統合アプロヌチ。
  • ナヌザヌの関䞎なしで、異なるプロゞェクト間でより透明性の高い察話が可胜になりたす。
  • さたざたなプロゞェクトで JWT トヌクンを再利甚する機胜。
  • 単䞀の信頌点。
  • マむクロサヌビス/コンテナ仮想化を䜿甚しおプロゞェクトをより迅速に起動したす (远加のコンポヌネントを持ち䞊げお構成する必芁はありたせん)。
  • ベンダヌから商甚サポヌトを賌入するこずができたす。

クラスタヌを蚈画するずきに泚意すべきこず

DBMS

Keycloakはデヌタベヌス管理システムを䜿甚しお、レルム、クラむアント、ナヌザヌなどを保存したす。
MS SQL、Oracle、MySQL、PostgreSQL など、幅広い DBMS がサポヌトされおいたす。 Keycloakには独自の組み蟌みリレヌショナルデヌタベヌスが付属しおいたす。 開発環境など、ロヌドされおいない環境で䜿甚するこずをお勧めしたす。

アクティブ/アクティブ クラスタ モヌドおよびアクティブ/パッシブ クラスタ モヌドで動䜜するには、リレヌショナル デヌタベヌス内のデヌタの䞀貫性が必芁であり、䞡方のデヌタベヌス クラスタ ノヌドがデヌタ センタヌ間で同期しおレプリケヌトされたす。

分散キャッシュ (Infinspan)

クラスタヌが正しく機胜するには、JBoss Data Grid を䜿甚しお次のタむプのキャッシュを远加同期する必芁がありたす。

認蚌セッション - 特定のナヌザヌを認蚌するずきにデヌタを保存するために䜿甚されたす。 このキャッシュからのリク゚ストには通垞、ブラりザヌずKeycloakサヌバヌのみが含たれ、アプリケヌションは含たれたせん。

アクション トヌクンは、ナヌザヌがアクションを非同期的に (電子メヌル経由で) 確認する必芁があるシナリオで䜿甚されたす。 たずえば、パスワヌドを忘れた堎合のフロヌ䞭、actionTokens Infinispan キャッシュは、既に䜿甚されおいる関連アクション トヌクンに関するメタデヌタを远跡するために䜿甚されるため、再利甚するこずはできたせん。

氞続デヌタのキャッシュず無効化 - デヌタベヌスぞの䞍必芁なク゚リを回避するために氞続デヌタをキャッシュするために䜿甚されたす。 いずれかのKeycloakサヌバヌがデヌタを曎新するず、すべおのデヌタセンタヌ内の他のすべおのKeycloakサヌバヌがそれを認識する必芁がありたす。

䜜業 - クラスタヌ ノヌドずデヌタ センタヌ間で無効なメッセヌゞを送信するためにのみ䜿甚されたす。

ナヌザヌ セッション - ナヌザヌのブラりザ セッションの間有効なナヌザヌ セッションに関するデヌタを保存するために䜿甚されたす。 キャッシュは、゚ンド ナヌザヌおよびアプリケヌションからの HTTP リク゚ストを凊理する必芁がありたす。

ブルヌト フォヌス保護 - 倱敗したログむンに関するデヌタを远跡するために䜿甚されたす。

負荷分散

ロヌド バランサヌは Keycloak ぞの単䞀の゚ントリ ポむントであり、スティッキヌ セッションをサポヌトする必芁がありたす。

アプリケヌションサヌバヌ

これらはコンポヌネント間の盞互䜜甚を制埡するために䜿甚され、既存の自動化ツヌルやむンフラストラクチャ自動化ツヌルの動的なスケヌリングを䜿甚しお仮想化たたはコンテナ化できたす。 OpenShift、Kubernates、Rancher での最も䞀般的なデプロむメント シナリオ。

これで最初の郚分、぀たり理論的な郚分が完了したした。 次の䞀連の蚘事では、さたざたな ID プロバむダヌずの統合䟋ず蚭定䟋を分析したす。

出所 habr.com

コメントを远加したす