8.5. Kerberos
Red Hat build of Keycloak は、Simple and Protected GSSAPI Negotiation Mechanism (SPNEGO) プロトコルを介した Kerberos チケットによるログインをサポートしています。ユーザーがセッションを認証した後、SPNEGO は Web ブラウザーを介して透過的に認証します。Web 以外の場合、またはログイン中にチケットが利用できない場合、Red Hat build of Keycloak は Kerberos ユーザー名とパスワードを使用したログインをサポートします。
Web 認証の一般的なユースケースは以下のとおりです。
- ユーザーはデスクトップにログインしています。
- ユーザーは、ブラウザーを使用して Red Hat build of Keycloak が保護する Web アプリケーションにアクセスします。
- アプリケーションは Red Hat build of Keycloak ログインにリダイレクトします。
-
Red Hat build of Keycloak は、ステータス 401 および HTTP ヘッダー
WWW-Authenticate: Negotiate
の HTML ログイン画面をレンダリングします。 -
ブラウザーにデスクトップログインからの Kerberos チケットがある場合、ブラウザーはヘッダー
Authorization: Negotiate 'spnego-token'
で、デスクトップサインオン情報を Red Hat build of Keycloak に転送します。それ以外の場合は、標準のログイン画面が表示され、ユーザーはログイン認証情報を入力します。 - Red Hat build of Keycloak は、ブラウザーからトークンを検証し、ユーザーを認証します。
- LDAPFederationProvider と Kerberos 認証サポートを使用している場合、Red Hat build of Keycloak は LDAP からユーザーデータをプロビジョニングします。KerberosFederationProvider を使用している場合、ユーザーは Red Hat build of Keycloak でプロファイルの更新とログインデータのプレフィルを行えます。
- Red Hat build of Keycloak がアプリケーションに戻ります。Red Hat build of Keycloak とアプリケーションは、OpenID Connect または SAML メッセージを通じて通信します。Red Hat build of Keycloak は、Kerberos/SPNEGO ログインのブローカーとして機能します。そのため、Kerberos を介して認証する Red Hat build of Keycloak はアプリケーションから認識されません。
Negotiate www-authenticate スキームにより、Kerberos へのフォールバックとして NTLM が可能になり、Windows の一部の Web ブラウザーでは NTLM がデフォルトでサポートされます。www-authenticate チャレンジがブラウザーの許可リスト外のサーバーから送信された場合、ユーザーに NTLM ダイアログプロンプトが表示される場合があります。Red Hat build of Keycloak はこのメカニズムをサポートしていないため、ユーザーはダイアログのキャンセルボタンをクリックして続行する必要があります。この状況は、イントラネットの Web ブラウザーが厳密に設定されていない場合、または Red Hat build of Keycloak がイントラネットとインターネットの両方のユーザーにサービスを提供している場合に発生する可能性があります。custom authenticator を使用すると、ネゴシエートチャレンジをホストのホワイトリストに制限できます。
Kerberos 認証を設定するには、以下の手順を実行します。
- Kerberos サーバー (KDC) のセットアップと設定。
- Red Hat build of Keycloak サーバーのセットアップと設定。
- クライアントマシンのセットアップと設定。
8.5.1. Kerberos サーバーの設定
Kerberos サーバーを設定する手順は、オペレーティングシステム (OS) および Kerberos ベンダーによって異なります。Kerberos サーバーのセットアップおよび設定方法は、Windows Active Directory、MIT Kerberos、および OS のドキュメントを参照してください。
セットアップ時に、以下の手順を実行します。
- Kerberos データベースにユーザープリンシパルを追加します。Kerberos と LDAP を統合することも可能です。つまり、ユーザーアカウントが LDAP サーバーからプロビジョニングされます。
"HTTP" サービスのサービスプリンシパルを追加します。たとえば、Red Hat build of Keycloak サーバーが
www.mydomain.org
で実行されている場合は、サービスプリンシパルHTTP/www.mydomain.org@<kerberos realm>
を追加します。MIT Kerberos では、"kadmin" セッションを実行します。MIT Kerberos を使用するマシンで、以下のコマンドを使用できます。
sudo kadmin.local
次に、以下のようなコマンドを使用して、HTTP プリンシパルを追加し、そのキーを keytab ファイルにエクスポートします。
addprinc -randkey HTTP/www.mydomain.org@MYDOMAIN.ORG ktadd -k /tmp/http.keytab HTTP/www.mydomain.org@MYDOMAIN.ORG
Red Hat build of Keycloak が実行されているホスト上で、keytab ファイル /tmp/http.keytab
にアクセスできることを確認します。
8.5.2. Red Hat build of Keycloak サーバーのセットアップと設定
Kerberos クライアントをマシンにインストールします。
手順
- Kerberos クライアントをインストールします。マシンが Fedora、Ubuntu、または RHEL を実行している場合は、Kerberos クライアントおよびその他のユーティリティーが含まれる freeipa-client パッケージをインストールします。
Kerberos クライアントを設定します (Linux では、設定は /etc/krb5.conf ファイルにあります)。
Kerberos レルムを設定に追加し、サーバー稼働している HTTP ドメインを設定します。
たとえば、MYDOMAIN.ORG レルムの場合は、以下のように
domain_realm
セクションを設定できます。[domain_realm] .mydomain.org = MYDOMAIN.ORG mydomain.org = MYDOMAIN.ORG
HTTP プリンシパルを含む keytab ファイルをエクスポートし、そのファイルに Red Hat build of Keycloak サーバーを実行しているプロセスからアクセスできることを確認します。本番環境では、このプロセスだけがこのファイルを読み取れるようにします。
上記の MIT Kerberos の例では、キータブを
/tmp/http.keytab
ファイルにエクスポートしました。Key Distribution Centre (KDC) と Red Hat build of Keycloak が同じホスト上で実行されている場合、ファイルはすでに使用可能です。
8.5.2.1. SPNEGO 処理の有効化
デフォルトでは、Red Hat build of Keycloak は SPNEGO プロトコルのサポートを無効にします。有効にするには、ブラウザーフロー に移動し、Kerberos を有効にします。
ブラウザーのフロー
Kerberos 要件を disabled から alternative(Kerberos は任意) または required(ブラウザーは Kerberos を有効にする必要があります) に設定します。SPNEGO または Kerberos で動作するようにブラウザーを設定していない場合、Red Hat build of Keycloak は通常のログイン画面にフォールバックします。
8.5.2.2. Kerberos ユーザーストレージフェデレーションプロバイダーを設定する
User Storage Federation を使用して、Red Hat build of Keycloak が Kerberos チケットを解釈する方法を設定する必要があります。Kerberos 認証のサポートには、2 つの異なるフェデレーションプロバイダーがあります。
LDAP サーバーがサポートする Kerberos で認証するには、LDAP フェデレーションプロバイダー を設定します。
手順
LDAP プロバイダーの設定ページに移動します。
Ldap kerberos の統合
- Allow Kerberos authentication を ON に切り替えます。
Allow Kerberos authentication では、Red Hat build of Keycloak は Kerberos プリンシパルアクセスユーザー情報を使用するため、情報を Red Hat build of Keycloak 環境にインポートできます。
LDAP サーバーが Kerberos ソリューションをサポートしていない場合は、Kerberos ユーザーストレージフェデレーションプロバイダーを使用します。
手順
- メニューの User Federation をクリックします。
Add provider 選択ボックスから Kerberos を選択します。
Kerberos ユーザーストレージプロバイダー
Kerberos プロバイダーは、シンプルなプリンシパル情報のために Kerberos チケットを解析し、情報をローカルの Red Hat build of Keycloak データベースにインポートします。ユーザー名、姓、電子メールなどのユーザープロファイル情報はプロビジョニングされません。
8.5.3. クライアントマシンの設定および設定
クライアントマシンには Kerberos クライアントが必要であり、上記 のように、krb5.conf
を設定する必要があります。クライアントマシンは、ブラウザーの SPNEGO ログインサポートも有効にする必要があります。Firefox ブラウザーを使用している場合は、configuring Firefox for Kerberos を参照してください。
.mydomain.org
URI は network.negotiate-auth.trusted-uris
設定オプションになければなりません。
Windows ドメインでは、クライアントは設定を調整する必要はありません。Internet Explorer および Edge は、すでに SPNEGO 認証に参加できます。
8.5.4. 認証情報の委譲
Kerberos は認証情報の委譲をサポートします。アプリケーションは Kerberos チケットを再利用して Kerberos でセキュリティーが保護された他のサービスと対話できるように、チケットへのアクセスが必要になる場合があります。Red Hat build of Keycloak サーバーが SPNEGO プロトコルを処理するため、OpenID Connect トークン要求または SAML アサーション属性内のアプリケーションに GSS 認証情報を反映させる必要があります。Red Hat build of Keycloak はこれを Red Hat build of Keycloak サーバーからアプリケーションに送信します。この要求をトークンまたはアサーションに挿入するには、各アプリケーションはビルトインプロトコルマッパー gss delegation credential
を有効にする必要があります。このマッパーは、アプリケーションのクライアントページの Mappers タブで利用できます。詳細は、プロトコルマッパー の章を参照してください。
アプリケーションは、Red Hat build of Keycloak から受信する要求を使用して他のサービスに対して GSS 呼び出しを行う前に、その要求をデシリアライズする必要があります。アクセストークンから GSSCredential オブジェクトに認証情報をデシリアライズする場合は、GSSManager.createContext
メソッドに渡されるこのクレデンシャルで GSSContext を作成します。以下に例を示します。
// Obtain accessToken in your application. KeycloakPrincipal keycloakPrincipal = (KeycloakPrincipal) servletReq.getUserPrincipal(); AccessToken accessToken = keycloakPrincipal.getKeycloakSecurityContext().getToken(); // Retrieve Kerberos credential from accessToken and deserialize it String serializedGssCredential = (String) accessToken.getOtherClaims(). get(org.keycloak.common.constants.KerberosConstants.GSS_DELEGATION_CREDENTIAL); GSSCredential deserializedGssCredential = org.keycloak.common.util.KerberosSerializationUtils. deserializeCredential(serializedGssCredential); // Create GSSContext to call other Kerberos-secured services GSSContext context = gssManager.createContext(serviceName, krb5Oid, deserializedGssCredential, GSSContext.DEFAULT_LIFETIME);
krb5.conf
ファイルで 転送可能な
Kerberos チケットを設定し、委譲された認証情報のサポートをブラウザーに追加します。
認証情報の委譲はセキュリティーに影響するため、必要かつ HTTPS を使用する場合にのみ使用してください。詳細と例は、この記事 を参照してください。
8.5.5. レルム間の信頼
Kerberos プロトコルでは、レルム
は Kerberos プリンシパルのセットです。これらのプリンシパルの定義は Kerberos データベース (通常は LDAP サーバー) に存在します。
Kerberos プロトコルは、レルム間の信頼を許可します。たとえば、2 つの Kerberos レルム A および B が存在する場合は、レルム間の信頼により、レルム A のユーザーがレルム B のリソースにアクセスできるようになります。レルム B がレルム A を信頼します。
Kerberos レルム間の信頼
Red Hat build of Keycloak サーバーは、レルム間の信頼をサポートします。これを実装するには、以下を実行します。
-
レルム間の信頼用に Kerberos サーバーを設定します。この手順の実装は、Kerberos サーバーの実装によって異なります。この手順は、Kerberos プリンシパル
krbtgt/B@A
をレルム A および B の Kerberos データベースに追加するために必要です。このプリンシパルは両方の Kerberos レルムで同じキーを持つ必要があります。プリンシパルは、両方のレルムで同じパスワード、キーバージョン番号、および暗号を持つ必要があります。詳細は、Kerberos サーバーのドキュメントを参照してください。
レルム間の信頼は、デフォルトで一方向です。レルム A とレルム B 間の双方向の信頼のために、プリンシパル krbtgt/A@B
を両方の Kerberos データベースに追加する必要があります。ただし、信頼はデフォルトで推移的です。レルム B がレルム A を信頼し、レルム C がレルム B を信頼する場合、レルム C は、プリンシパル krbtgt/C@A
なしでレルム A を信頼します。クライアントが信頼パスを見つけることができるように、Kerberos クライアント側で追加の設定 (例:capaths
) が必要になる場合があります。詳細は、Kerberos のドキュメントを参照してください。
Red Hat build of Keycloak サーバーを設定する
-
Kerberos がサポートされる LDAP ストレージプロバイダーを使用する場合は、レルム B のサーバープリンシパルを設定する必要があります (この例では
HTTP/mydomain.com@B
)。Red Hat build of Keycloak は SPNEGO フローを実行してからユーザーを見つける必要があるため、レルム A からのユーザーが Red Hat build of Keycloak で正常に認証されるためには、LDAP サーバーはレルム A からユーザーを見つける必要があります。
-
Kerberos がサポートされる LDAP ストレージプロバイダーを使用する場合は、レルム B のサーバープリンシパルを設定する必要があります (この例では
ユーザーの検索は、LDAP ストレージプロバイダーオプションの Kerberos principal attribute
に基づきます。これがたとえば userPrincipalName
などの値で設定されている場合、ユーザー john@A
の SPNEGO 認証後、Red Hat build of Keycloak は john@A
と同等の userPrincipalName
属性を持つ LDAP ユーザーを検索しようとします。Kerberos principal attribute
が空のままの場合、Red Hat build of Keycloak は、レルムを省略した Kerberos プリンシパルの接頭辞に基づき LDAP ユーザーを検索します。たとえば、Kerberos プリンシパルユーザーの john@A
は、LDAP 内 (通常は uid=john,ou=People,dc=example,dc=com
などの LDAP DN 配下) でユーザー名 john
として使用できる必要があります。レルム A および B からのユーザーを認証する場合は、LDAP がレルム A と B 両方からのユーザーを見つけられるようにします。
-
Kerberos ユーザーストレージプロバイダー (通常は LDAP 統合のない Kerberos) を使用する場合は、サーバープリンシパルを
HTTP/mydomain.com@B
に設定し、Kerberos レルム A および B からのユーザーを認証できる必要があります。
すべてのユーザーは、認証に使用される Kerberos プリンシパルを参照する KERBEROS_PRINCIPAL
属性を持ち、これを使用してさらにユーザーを検索するため、複数の Kerberos レルムからのユーザーの認証が許可されています。Kerberos レルム A
と B
の両方に john
というユーザーが存在する場合、競合を回避するために Red Hat build of Keycloak ユーザーのユーザー名には Kerberos レルムが小文字で含まれる場合があります。たとえば、ユーザー名は john@a
になります。設定された Kerberos realm
とレルムが一致する場合に備えて、生成されたユーザー名からレルムの接尾辞が省略される場合があります。たとえば、Kerberos プロバイダーで設定された Kerberos realm
が A
である限り、Kerberos プリンシパル john@A
のインスタンスユーザー名は john
になります。
8.5.6. トラブルシューティング
問題がある場合は、追加のロギングを有効にして問題をデバッグしてください。
-
Kerberos または LDAP フェデレーションプロバイダーについて、管理コンソールで
Debug
フラグを有効にします。 -
カテゴリー
org.keycloak
に対して TRACE ロギングを有効にして、サーバーログで詳細情報を受け取る -
システムプロパティー
-Dsun.security.krb5.debug=true
および-Dsun.security.spnego.debug=true
を追加します。