本連載では、近年注目されている認証プロトコル「OpenID Connect」をサポートするオープンソースのシングルサインオン(SSO)ソフトウェア「Keycloak」の活用方法を解説していきます。Keycloakは、Active Directoryなどの外部ユーザーストレージと連携し、それらで管理されたユーザーによるシングルサインオンを実現できます。
近年は、ユーザー情報をクラウド上で管理する「IDaaS(Identity as a Service)」のようなサービスも利用されるようになっています。しかし、企業などの組織ネットワークにおける認証サービスの中心は、今もなお「Active Directory」や「Red Hat Directory Server」といったLDAP(Lightweight Directory Access Protocol)サーバではないでしょうか。
LDAPサーバは、ユーザーだけでなく、組織内のコンピュータやその設定も一元管理でき、連携している組織内のシステムも多いため、今後も活用されていくことが予想されます。
Keycloakは、これらのLDAPサーバに保存されているユーザーを簡単に認証に利用できます。これを実現するのが「ユーザーストレージ連携」機能です。
Keycloakのユーザーストレージ連携機能とは、LDAPなどの外部ユーザーストレージと連携するための機能です。これにより、外部ユーザーストレージに保存されているユーザーを使用して、Keycloakと連携しているアプリケーションにシングルサインオンできるようになります(図1)。
現在Keycloakでは、外部ユーザーストレージとしてActive DirectoryやRed Hat Directory ServerなどのLDAPサーバをデフォルトでサポートしています。さらに、「ユーザーストレージSPI(サービスプロバイダーインタフェース)」というインタフェースを実装して、上記以外のユーザーストレージ(RDBMSなど)と連携することもできます。Active DirectoryやRed Hat Directory Serverとの連携も、このユーザーストレージSPIを実装したもので実現しています。
Keycloakには内部ユーザーストレージとして、「H2」というRDBMSが組み込まれています。デフォルト設定のままであれば、H2でユーザーのデータが管理されることになります。通常は、「MySQL」などのRDBMSを使用するように設定を変更します。さらに、設定を追加することで、複数の異なる外部ユーザーストレージとも連携することもできます。
外部ユーザーストレージと連携した場合のユーザー情報を検索する優先順位は、以下の図2のようになります。
Keycloakは、まず内部ユーザーストレージを検索します(図2の1)。そこにユーザーが存在しなければ、一致するユーザーが見つかるまで、設定した全ての外部ユーザーストレージを検索します(図2の2、3)。外部ユーザーストレージには優先度を設定できるようになっており、検索の順番はそれによって決まります。
一般的なユースケースでは、ユーザー情報をKeycloakの内部ユーザーストレージではなく、外部ユーザーストレージとして既存のLDAPサーバで管理することが多いのではないかと思います。その場合に注意しなければならないのは、Keycloakの機能を利用する上で必要なユーザー情報を、既存のLDAPサーバに保存できるとは限らないということです。
例えば、Keycloakのワンタイムパスワード(以下、OTP)機能を使用する場合を考えてみましょう。一般的なLDAPサーバには、OTPの秘密鍵や生成時刻を保存するためのユーザー属性がありません。従って、OTPの秘密鍵や生成時刻を保存するために、内部ユーザーストレージも併用する必要があります(図3)。
この場合、外部ユーザーストレージだけでなく、内部ユーザーストレージにもユーザー情報が保存されることになります。そのため、ユーザー情報は不整合が発生しないように、両者の間で同期しなければなりません。
同期の方法を決めるのは、主に以下の2つの動作モードです。
「ストレージモード」は、外部ユーザーストレージから内部ユーザーストレージにユーザーをインポートするかどうかを制御します。デフォルトは「オン」で、インポートするようになっています。インポートされたユーザーは、必要に応じて管理コンソールで同期するか、または定期的なバックグラウンドタスクによって同期します。
例外の1つはパスワードです。パスワードはインポートされず、値の検証はLDAPサーバに委任されます。ストレージモードを「オフ」にすると、ユーザーはインポートされません。両者のメリットは、以下の表1のようになります。
ストレージモード | メリット |
---|---|
オン(インポートする) | ・Keycloakの動作に必要なユーザー属性を全て保存できるため、全てのKeycloakの機能が利用可能 ・パスワードの検証を除くユーザー操作に対して、外部ストレージへのアクセスが不要になるため、外部ストレージへの負荷が軽減できる |
オフ(インポートしない) | ・ユーザー情報を内部ユーザーストレージにインポートして同期するオーバーヘッドがない ・その後の同期も不要 |
表1 ストレージモードの選択肢とメリット |
「編集モード」は、外部ユーザーストレージで管理されたユーザー情報に対する更新のポリシーを決定します。ユーザー情報の更新は、エンドユーザーの場合はユーザーアカウントサービスを介して、管理者の場合は管理コンソールを介してできますが、このモードによりその際の動作が変わります(表2)。
編集モード | 動作 | 利用シチュエーション |
---|---|---|
READONLY | ユーザー属性は変更できない。これらのフィールドを更新しようとすると、Keycloakはエラーを表示する。パスワードの更新もサポートされない | 読み取り専用の外部ユーザーストレージと連携し、ユーザー属性の更新をサポートしなくてもよい場合 |
WRITABLE | ユーザー属性は全て更新でき、外部ユーザーストレージと自動的に同期される | 書き込み可能な外部ユーザーストレージと連携し、ユーザー属性の更新をサポートしたい場合 |
UNSYNCED | パスワードを含むユーザー属性の変更は、内部ユーザーストレージに保存される。外部ユーザーストレージに同期する方法は別途検討する必要がある。このオプションは、ストレージモードが「オン」の場合にのみ適用される | 読み取り専用の外部ユーザーストレージと連携するが、ユーザー属性の更新もサポートしたい場合 |
表2 編集モードの選択肢 |
Copyright © ITmedia, Inc. All Rights Reserved.