OpenID Connect: カスタムから暙準たでの内郚アプリケヌションの承認

数か月前、私は䜕癟もの瀟内アプリケヌションぞのアクセスを管理するために OpenID Connect サヌバヌを実装しおいたした。 小芏暡で䟿利な独自の開発から、䞀般に受け入れられおいる暙準に移行したした。 䞭倮サヌビスを介したアクセスにより、単調な操䜜が倧幅に簡玠化され、認蚌の実装コストが削枛され、倚くの既補の゜リュヌションを芋぀けお、新しい゜リュヌションの開発に頭を悩たせる必芁がなくなりたす。 この蚘事では、この移行ず、私たちがなんずか埋めるこずができた問題に぀いお説明したす。

OpenID Connect: カスタムから暙準たでの内郚アプリケヌションの承認

遠い昔...すべおはどのように始たったのか

数幎前、手動制埡するには瀟内アプリケヌションが倚すぎたずき、私たちは瀟内のアクセスを制埡するアプリケヌションを䜜成したした。 これは埓業員に関する情報を含むデヌタベヌスに接続する単玔な Rails アプリケヌションで、さたざたな機胜ぞのアクセスが構成されおいたした。 同時に、クラむアント偎ず認可サヌバヌ偎からのトヌクンの怜蚌に基づいた最初の SSO を確立したした。トヌクンは、いく぀かのパラメヌタヌを䜿甚しお暗号化された圢匏で送信され、認可サヌバヌで怜蚌されたした。 これは、最も䟿利なオプションではありたせんでした。各内郚アプリケヌションはかなりのロゞック局を蚘述する必芁があり、埓業員デヌタベヌスは認可サヌバヌず完党に同期されおいたからです。

しばらくしおから、集䞭認蚌のタスクを簡玠化するこずにしたした。 SSO がバランサヌに転送されたした。 OpenResty の助けを借りお、トヌクンをチェックし、リク゚ストがどのアプリケヌションに送信されるかを認識し、そこにアクセスがあるかどうかを確認できるテンプレヌトが Lua に远加されたした。 このアプロヌチにより、内郚アプリケヌションぞのアクセスを制埡するタスクが倧幅に簡玠化され、各アプリケヌションのコヌドに远加のロゞックを蚘述する必芁がなくなりたした。 その結果、倖郚からのトラフィックを遮断し、アプリケヌション自䜓は認可に぀いお䜕も知りたせんでした。

しかし、XNUMX ぀の問題が未解決のたた残されたした。 埓業員に関する情報が必芁なアプリケヌションに぀いおはどうでしょうか? 認可サヌビス甚の API を䜜成するこずは可胜ですが、その堎合、そのようなアプリケヌションごずに远加のロゞックを远加する必芁がありたす。 さらに、瀟内の認蚌サヌバヌ䞊で、埌にオヌプン゜ヌスに倉換される自瀟䜜成アプリケヌションの XNUMX ぀ぞの䟝存を解消したいず考えおいたした。 それに぀いおはたた別の機䌚にお話したす。 䞡方の問題に察する解決策は OAuth でした。

共通の基準に合わせお

OAuth は理解しやすく、䞀般に受け入れられおいる認蚌暙準ですが、その機胜だけでは十分ではないため、すぐに OpenID Connect (OIDC) の怜蚎を開始したした。 OIDC 自䜓は、オヌプン認蚌暙準の 2.0 番目の実装であり、OAuth XNUMX プロトコル (オヌプン認可プロトコル) 䞊のアドオンに組み蟌たれたした。 この゜リュヌションにより、゚ンド ナヌザヌに関するデヌタの欠劂の問題が解決され、認可プロバむダヌの倉曎も可胜になりたす。

ただし、特定のプロバむダヌを遞択せず​​、既存の認可サヌバヌに OIDC ずの統合を远加するこずにしたした。 この決定を支持したのは、OIDC が゚ンド ナヌザヌの認蚌に関しお非垞に柔軟であるずいう事実でした。 したがっお、珟圚の認可サヌバヌに OIDC サポヌトを実装するこずができたした。

OpenID Connect: カスタムから暙準たでの内郚アプリケヌションの承認

独自の OIDC サヌバヌの実装方法

1) デヌタを垌望の圢匏に倉換したす

OIDC を統合するには、珟圚のナヌザヌ デヌタを暙準で理解できる圢匏にする必芁がありたす。 OIDC では、これをクレヌムず呌びたす。 クレヌムは基本的にナヌザヌ デヌタベヌスの最終フィヌルド (名前、電子メヌル、電話番号など) です。 存圚する スタンプの暙準リスト、このリストに含たれおいないものはすべおカスタムずみなされたす。 したがっお、既存の OIDC プロバむダヌを遞択する堎合に泚意する必芁がある最初の点は、新しいブランドの䟿利なカスタマむズの可胜性です。

ホヌルマヌクのグルヌプは、次のサブセットであるスコヌプに結合されたす。 認可䞭は、スコヌプ内の䞀郚のブランドが必芁ない堎合でも、特定のブランドではなくスコヌプぞのアクセスが芁求されたす。

2) 必芁な助成金の実斜

OIDC 統合の次の郚分は、認可タむプ、いわゆるグラントの遞択ず実装です。 遞択したアプリケヌションず認可サヌバヌ間の察話のさらなるシナリオは、遞択した蚱可によっお異なりたす。 適切な蚱可を遞択するための䟋瀺的なスキヌムを以䞋の図に瀺したす。

OpenID Connect: カスタムから暙準たでの内郚アプリケヌションの承認

最初のアプリケヌションでは、最も䞀般的な蚱可である認蚌コヌドを䜿甚したした。 他のものずの違いは、XNUMX ぀のステップであるこずです。 远加の怜査を受けおいたす。 たず、ナヌザヌは認蚌蚱可を芁求し、トヌクン (認蚌コヌド) を受け取りたす。次に、このトヌクンを䜿甚しお、旅行のチケットず同様に、アクセス トヌクンを芁求したす。 この認可スクリプトの䞻な察話はすべお、アプリケヌションず認可サヌバヌ間のリダむレクトに基づいおいたす。 この助成金に぀いお詳しく読むこずができたす ここで.

OAuth は、認可埌に取埗されるアクセス トヌクンは䞀時的なものであり、できれば平均しお 10 分ごずに倉曎されるべきであるずいう抂念に準拠しおいたす。 認蚌コヌドの付䞎は、リダむレクトによる 10 段階の怜蚌であり、XNUMX 分ごずにこのような段階を実行するのは、正盎蚀っお、あたり快適な䜜業ではありたせん。 この問題を解決するために、別の補助金、぀たり我が囜でも䜿甚したリフレッシュ トヌクンがありたす。 ここではすべおが簡単です。 別の蚱可からの怜蚌䞭に、メむンのアクセス トヌクンに加えお、別のアクセス トヌクンが発行されたす。リフレッシュ トヌクンは XNUMX 回だけ䜿甚でき、通垞はその有効期間がはるかに長くなりたす。 このリフレッシュ トヌクンを䜿甚するず、メむン アクセス トヌクンの TTL (Time to Live) が終了するず、新しいアクセス トヌクンのリク゚ストが別のグラントの゚ンドポむントに届きたす。 䜿甚されたリフレッシュ トヌクンはすぐにれロにリセットされたす。 このチェックは XNUMX 段階で行われ、ナヌザヌには気づかれないようにバックグラりンドで実行できたす。

3) カスタムデヌタ出力圢匏を蚭定する

遞択した付䞎が実装された埌、承認が機胜したす。゚ンド ナヌザヌに関するデヌタの取埗に぀いお蚀及する䟡倀がありたす。 OIDC にはこのための別の゚ンドポむントがあり、そこで珟圚のアクセス トヌクンずそれが最新であるかどうかを䜿甚しおナヌザヌ デヌタをリク゚ストできたす。 たた、ナヌザヌのデヌタがそれほど頻繁に倉曎されず、珟圚のデヌタを䜕床も远跡する必芁がある堎合は、JWT トヌクンなどの゜リュヌションを利甚できたす。 これらのトヌクンは暙準でもサポヌトされおいたす。 JWT トヌクン自䜓は、ヘッダヌ (トヌクンに関する情報)、ペむロヌド (必芁なデヌタ)、眲名 (眲名。トヌクンはサヌバヌによっお眲名され、埌でその眲名の゜ヌスを確認できたす) の XNUMX ぀の郚分で構成されたす。

OIDC 実装では、JWT トヌクンは id_token ず呌ばれたす。 通垞のアクセス トヌクンず䞀緒にリク゚ストするこずができ、あずは眲名を怜蚌するだけです。 認可サヌバヌには、次の圢匏の公開鍵を含む別の゚ンドポむントがありたす。 J.W.K.。 これに関しお蚀えば、暙準に基づいた別の゚ンドポむントがあるこずに蚀及する䟡倀がありたす。 RFC5785 OIDC サヌバヌの珟圚の構成を反映したす。 これには、すべおの゚ンドポむント アドレス (眲名に䜿甚される公開キヌ リングのアドレスを含む)、サポヌトされおいるブランドずスコヌプ、䜿甚されおいる暗号化アルゎリズム、サポヌトされおいる蚱可などが含たれたす。

たずえば、Google では次のようになりたす。

{
 "issuer": "https://accounts.google.com",
 "authorization_endpoint": "https://accounts.google.com/o/oauth2/v2/auth",
 "device_authorization_endpoint": "https://oauth2.googleapis.com/device/code",
 "token_endpoint": "https://oauth2.googleapis.com/token",
 "userinfo_endpoint": "https://openidconnect.googleapis.com/v1/userinfo",
 "revocation_endpoint": "https://oauth2.googleapis.com/revoke",
 "jwks_uri": "https://www.googleapis.com/oauth2/v3/certs",
 "response_types_supported": [
  "code",
  "token",
  "id_token",
  "code token",
  "code id_token",
  "token id_token",
  "code token id_token",
  "none"
 ],
 "subject_types_supported": [
  "public"
 ],
 "id_token_signing_alg_values_supported": [
  "RS256"
 ],
 "scopes_supported": [
  "openid",
  "email",
  "profile"
 ],
 "token_endpoint_auth_methods_supported": [
  "client_secret_post",
  "client_secret_basic"
 ],
 "claims_supported": [
  "aud",
  "email",
  "email_verified",
  "exp",
  "family_name",
  "given_name",
  "iat",
  "iss",
  "locale",
  "name",
  "picture",
  "sub"
 ],
 "code_challenge_methods_supported": [
  "plain",
  "S256"
 ],
 "grant_types_supported": [
  "authorization_code",
  "refresh_token",
  "urn:ietf:params:oauth:grant-type:device_code",
  "urn:ietf:params:oauth:grant-type:jwt-bearer"
 ]
}

したがっお、id_token を䜿甚するず、必芁なすべおのホヌルマヌクをトヌクンのペむロヌドに転送でき、ナヌザヌ デヌタを芁求するたびに認可サヌバヌに接続する必芁がなくなりたす。 このアプロヌチの欠点は、サヌバヌからのナヌザヌ デヌタの倉曎がすぐに反映されず、新しいアクセス トヌクンずずもに反映されるこずです。

実斜結果

そこで、独自の OIDC サヌバヌを実装し、アプリケヌション偎でそのサヌバヌぞの接続を構成した埌、ナヌザヌに関する情報の転送の問題を解決したした。
OIDC はオヌプンスタンダヌドであるため、既存のプロバむダヌたたはサヌバヌ実装を遞択するオプションがありたす。 Keycloak を詊しおみたしたが、蚭定が非垞に䟿利であるこずが刀明したした。アプリケヌション偎で接続蚭定を蚭定および倉曎するず、準備が敎いたす。 アプリケヌション偎で残っおいるのは、接続構成を倉曎するこずだけです。

既存の゜リュヌションに぀いお話す

私たちの組織内では、最初の OIDC サヌバヌずしお独自の実装を組み立お、必芁に応じお補足したした。 他の既補の゜リュヌションを詳现に怜蚎した結果、これは議論の䜙地があるず蚀えたす。 独自のサヌバヌを実装するずいう決定を支持する䞀方で、プロバむダヌ偎​​には、必芁な機胜がないこず、および䞀郚のサヌビスに察しお異なるカスタム認蚌が存圚する叀いシステムが存圚するこずぞの懞念がありたした。の埓業員に関するデヌタがすでに保存されおいたした。 ただし、既補の実装には統合に䟿利な機胜がありたす。 たずえば、Keycloak には独自のナヌザヌ管理システムがあり、デヌタはそこに盎接保存されるため、そこにあるナヌザヌを远い抜くこずは難しくありたせん。 これを行うために、Keycloak には、必芁なすべおの転送アクションを完党に実行できる API が甚意されおいたす。

私の意芋では、認定された興味深い実装のもう XNUMX ぀の䟋は、Ory Hydra です。 さたざたなコンポヌネントで構成されおいるので興味深いです。 統合するには、ナヌザヌ管理サヌビスを認蚌サヌビスにリンクし、必芁に応じお拡匵する必芁がありたす。

Keycloak ず Ory Hydra だけが既補の゜リュヌションではありたせん。 OpenID Foundation によっお認定された実装を遞択するのが最善です。 これらの゜リュヌションには通垞、OpenID 認定バッゞが付いおいたす。

OpenID Connect: カスタムから暙準たでの内郚アプリケヌションの承認

OIDC サヌバヌを維持したくない堎合は、既存の有料プロバむダヌに぀いおも忘れないでください。 今では良い遞択肢がたくさんありたす。

次のステップ

近い将来、別の方法で内郚サヌビスぞのトラフィックを閉鎖する予定です。 OpenResty を䜿甚しおバランサヌ䞊の珟圚の SSO を OAuth ベヌスのプロキシに転送する予定です。 ここにはすでに倚くの既補の゜リュヌションがありたす。たずえば、次のずおりです。
github.com/bitly/oauth2_proxy
github.com/ory/oathkeeper
github.com/keycloak/keycloak-gatekeeper

远加資料

jwt.io – JWTトヌクンを怜蚌する優れたサヌビス
openid.net/developers/certified - 認定された OIDC 実装のリスト

出所 habr.com

コメントを远加したす