8.4. Kerberos
Red Hat Single Sign-On は、Simple and Protected GSSAPI Negotiation Mechanism (SPNEGO) プロトコルを使用した Kerberos チケットによるログインをサポートします。ユーザーがセッションを認証した後、SPNEGO は Web ブラウザーを介して透過的に認証します。Web 以外のケースや、ログイン時にチケットが利用できない場合、Red Hat Single Sign-On は Kerberos のユーザー名およびパスワードを使用したログインをサポートします。
Web 認証の一般的なユースケースは以下のとおりです。
- ユーザーはデスクトップにログインしています。
- ユーザーは、ブラウザーで Red Hat Single Sign-On によってセキュリティーが保護された Web アプリケーションにアクセスします。
- アプリケーションは Red Hat Single Sign-On ログインにリダイレクトされます。
-
Red Hat Single Sign-On は、ステータス 401 および HTTP ヘッダー
WWW-Authenticate: Negotiate
の HTML ログイン画面をレンダリングします。 -
ブラウザーにデスクトップログインからの Kerberos チケットがある場合、ブラウザーはヘッダー
Authorization: Negotiate 'spnego-token'
で、デスクトップサインオン情報を Red Hat Single Sign-On に転送します。それ以外の場合は、標準のログイン画面が表示され、ユーザーはログイン認証情報を入力します。 - Red Hat Single Sign-On は、ブラウザーからのトークンを検証し、ユーザーを認証します。
- LDAPFederationProvider と Kerberos 認証サポートを使用している場合、Red Hat Single Sign-On は LDAP からユーザーデータをプロビジョニングします。KerberosFederationProvider を使用する場合、Red Hat Single Sign-On では、ユーザーはプロファイルを更新でき、ログインデータをプレフィルします。
- Red Hat Single Sign-On はアプリケーションに戻ります。Red Hat Single Sign-On とアプリケーションは、OpenID Connect または SAML メッセージを介して通信します。Red Hat Single Sign-On は、Kerberos/SPNEGO ログインに対するブローカーとして機能します。したがって、Kerberos で認証する Red Hat Single Sign-On は、アプリケーションからは認識されません。
Kerberos 認証を設定するには、以下の手順を実行します。
- Kerberos サーバー (KDC) のセットアップと設定。
- Red Hat Single Sign-On サーバーのセットアップと設定。
- クライアントマシンのセットアップと設定。
8.4.1. Kerberos サーバーの設定
Kerberos サーバーを設定する手順は、オペレーティングシステム (OS) および Kerberos ベンダーによって異なります。Kerberos サーバーのセットアップおよび設定方法は、Windows Active Directory、MIT Kerberos、および OS のドキュメントを参照してください。
セットアップ時に、以下の手順を実行します。
- Kerberos データベースにユーザープリンシパルを追加します。Kerberos と LDAP を統合することも可能です。つまり、ユーザーアカウントが LDAP サーバーからプロビジョニングされます。
HTTP サービスのサービスプリンシパルを追加します。たとえば、Red Hat Single Sign-On サーバーが
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 Single Sign-On が稼働しているホストで keytab ファイル /tmp/http.keytab
にアクセスできる必要があります。
8.4.2. Red Hat Single Sign-On サーバーの設定および設定
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 Single Sign-On サーバーを実行するプロセスがファイルにアクセスできるようにします。本番環境では、このプロセスだけがこのファイルを読み取れるようにします。
上記の MIT Kerberos の例では、キータブを
/tmp/http.keytab
ファイルにエクスポートしました。Key Distribution Centre (KDC) および Red Hat Single Sign-On が同じホストで実行している場合は、ファイルがすでに利用可能です。
8.4.2.1. SPNEGO 処理の有効化
デフォルトでは、Red Hat Single Sign-On は SPNEGO プロトコルのサポートを無効にしています。有効にするには、ブラウザーフロー に移動し、Kerberos を有効にします。
ブラウザーのフロー
Kerberos 要件を disabled から alternative(Kerberos は任意) または required(ブラウザーは Kerberos を有効にする必要があります) に設定します。SPNEGO または Kerberos と連携するようにブラウザーを設定していない場合には、Red Hat Single Sign-On は通常のログイン画面にフォールバックします。
8.4.2.2. Kerberos ユーザーストレージフェデレーションプロバイダーの設定
User Storage Federation を使用して、Red Hat Single Sign-On が Kerberos チケットを解釈する方法を設定する必要があります。Kerberos 認証のサポートには、2 つの異なるフェデレーションプロバイダーがあります。
LDAP サーバーがサポートする Kerberos で認証するには、LDAP フェデレーションプロバイダー を設定します。
手順
LDAP プロバイダーの設定ページに移動します。
Ldap kerberos の統合
- Allow Kerberos authentication を ON に切り替えます。
Allow Kerberos authentication により、Red Hat Single Sign-On は Kerberos プリンシパルアクセスユーザー情報を使用するため、情報を Red Hat Single Sign-On 環境にインポートできます。
LDAP サーバーが Kerberos ソリューションをサポートしていない場合は、Kerberos ユーザーストレージフェデレーションプロバイダーを使用します。
手順
- メニューの User Federation をクリックします。
Add provider 選択ボックスから Kerberos を選択します。
Kerberos ユーザーストレージプロバイダー
Kerberos プロバイダーは、簡単なプリンシパル情報のために Kerberos チケットを解析し、情報をローカルの Red Hat Single Sign-On データベースにインポートします。ユーザー名、姓、電子メールなどのユーザープロファイル情報はプロビジョニングされません。
8.4.3. クライアントマシンの設定および設定
クライアントマシンには Kerberos クライアントが必要であり、上記 のように、krb5.conf
を設定する必要があります。クライアントマシンは、ブラウザーの SPNEGO ログインサポートも有効にする必要があります。Firefox ブラウザーを使用している場合は、configuring Firefox for Kerberos を参照してください。
.mydomain.org
URI は network.negotiate-auth.trusted-uris
設定オプションになければなりません。
Windows ドメインでは、クライアントは設定を調整する必要はありません。Internet Explorer および Edge は、すでに SPNEGO 認証に参加できます。
8.4.4. 認証情報の委譲
Kerberos は認証情報の委譲をサポートします。アプリケーションは Kerberos チケットを再利用して Kerberos でセキュリティーが保護された他のサービスと対話できるように、チケットへのアクセスが必要になる場合があります。Red Hat Single Sign-On サーバーが SPNEGO プロトコルを処理するため、OpenID Connect トークン要求または SAML アサーション属性内のアプリケーションに GSS 認証情報を反映させる必要があります。Red Hat Single Sign-On は、これを Red Hat Single Sign-On サーバーからアプリケーションに送信します。この要求をトークンまたはアサーションに挿入するには、各アプリケーションはビルトイン プロトコルマッパー gss delegation credential
を有効にする必要があります。このマッパーは、アプリケーションのクライアントページの Mappers タブで利用できます。詳細は、プロトコルマッパー の章を参照してください。
アプリケーションは、Red Hat Single Sign-On から受信する要求を使用して他のサービスに対して 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.4.5. レルム間の信頼
Kerberos プロトコルでは、レルム
は Kerberos プリンシパルのセットです。これらのプリンシパルの定義は Kerberos データベース (通常は LDAP サーバー) に存在します。
Kerberos プロトコルは、レルム間の信頼を許可します。たとえば、2 つの Kerberos レルム A および B が存在する場合は、レルム間の信頼により、レルム A のユーザーがレルム B のリソースにアクセスできるようになります。レルム B がレルム A を信頼します。
Kerberos レルム間の信頼
Red Hat Single Sign-On サーバーは、レルム間の信頼をサポートします。これを実装するには、以下を実行します。
-
レルム間の信頼用に 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 Single Sign-On サーバーの設定
-
Kerberos がサポートされる LDAP ストレージプロバイダーを使用する場合は、レルム B のサーバープリンシパルを設定する必要があります (この例では
HTTP/mydomain.com@B
)。Red Hat Single Sign-On は SPNEGO フローを実行し、ユーザーを見つける必要があるため、レルム A からのユーザーが Red Hat Single Sign-On に対して正常に認証されるためには、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.4.6. トラブルシューティング
問題がある場合は、追加のロギングを有効にして問題をデバッグしてください。
-
Kerberos または LDAP フェデレーションプロバイダーについて、管理コンソールで
Debug
フラグを有効にします。 -
カテゴリー
org.keycloak
に対して TRACE ロギングを有効にして、サーバーログで詳細情報を受け取る -
システムプロパティー
-Dsun.security.krb5.debug=true
および-Dsun.security.spnego.debug=true
を追加します。