2.4. SAML によるアプリケーションの保護
Keycloak SAML アダプター機能パックによって提供される Galleon レイヤーを使用すると、Security Assertion Markup Language (SAML) で Web アプリケーションを保護できます。
Keycloak SAML アダプター機能パックについては、SAML を使用してアプリケーションを保護するための Keycloak SAML アダプター機能パック を参照してください。
SAML を使用してアプリケーションを保護するには、次の手順に従います。
2.4.1. JBoss EAP の SAML によるアプリケーションの保護
Keycloak SAML アダプター Galleon パックは、keycloak-saml
、keycloak-client-saml
、および keycloak-client-saml-ejb
という 3 つのレイヤーを含む Galleon 機能パックです。この機能パックのレイヤーを使用して、Security Assertion Markup Language (SAML) を使用したシングルサインオンのアイデンティティープロバイダーとして Red Hat build of Keycloak を使用するために必要なモジュールと設定を JBoss EAP にインストールします。
次の表で各レイヤーの用途を説明します。
レイヤー | 適用対象 | 説明 |
---|---|---|
| OpenShift |
このレイヤーは、SAML クライアントの自動登録とともに Source to Image (s2i) に使用します。このレイヤーは |
| ベアメタル、OpenShift |
このレイヤーは、ベアメタル上の web-application に使用します。また、CLI スクリプトまたはデプロイメント設定で提供される |
| ベアメタル | このレイヤーは、Jakarta Enterprise Beans にアイデンティティーを伝播するアプリケーションに使用します。 |
SAML の使用を有効にするには、keycloak-saml
サブシステムまたはアプリケーション自体を設定できます。
デプロイメント設定
デプロイメント記述子を使用して SAML でアプリケーションを保護するには、アプリケーションのデプロイメント設定を次のように更新します。
アプリケーションのデプロイメント記述子
web.xml
ファイルで、auth-method
プロパティーをSAML
に設定します。デプロイメント記述子の更新例
<login-config> <auth-method>SAML</auth-method> </login-config>
SAML 設定情報を含む
keycloak-saml.xml
というファイルをWEB-INF
ディレクトリーに作成します。このファイルは SAML プロバイダーから取得できます。keycloak-saml.xml
の例<keycloak-saml-adapter> <SP entityID="" sslPolicy="EXTERNAL" logoutPage="SPECIFY YOUR LOGOUT PAGE!"> <Keys> <Key signing="true"> <PrivateKeyPem>PRIVATE KEY NOT SET UP OR KNOWN</PrivateKeyPem> <CertificatePem>...</CertificatePem> </Key> </Keys> <IDP entityID="idp" signatureAlgorithm="RSA_SHA256" signatureCanonicalizationMethod="http://www.w3.org/2001/10/xml-exc-c14n#"> <SingleSignOnService signRequest="true" validateResponseSignature="true" validateAssertionSignature="false" requestBinding="POST" bindingUrl="http://localhost:8180/realms/example_saml_realm/protocol/saml"/> <SingleLogoutService signRequest="true" signResponse="true" validateRequestSignature="true" validateResponseSignature="true" requestBinding="POST" responseBinding="POST" postBindingUrl="http://localhost:8180/realms/example_saml_realm/protocol/saml" redirectBindingUrl="http://localhost:8180/realms/example_saml_realm/protocol/saml"/> </IDP> </SP> </keycloak-saml-adapter>
PrivateKeyPem
およびCertificatePem
の値は、クライアントごとに一意です。
サブシステムの設定
keycloak-saml
サブシステムを設定することで、SAML を使用してアプリケーションを保護できます。サブシステム設定コマンドを含むクライアント設定ファイルは、Red Hat build of Keycloak から取得できます。詳細は、クライアントアダプター設定の生成 を参照してください。
2.4.2. Red Hat build of Keycloak での SAML クライアントの作成
Red Hat build of Keycloak で Security Assertion Markup Language (SAML) クライアントを作成し、JBoss EAP で使用してアプリケーションを保護します。
以下の手順は、テスト目的で Red Hat build of Keycloak を使用して JBoss EAP にデプロイしたアプリケーションの保護を開始するために必要な最小限の手順を示しています。詳細な設定については、Red Hat build of Keycloak サーバー管理ガイドの SAML クライアントの作成 を参照してください。
前提条件
Red Hat build of Keycloak でレルムを作成し、ユーザーを定義している。
詳細は、JBoss EAP でのレルムとユーザーの作成 を参照してください。
手順
- Red Hat build of Keycloak 管理コンソールに移動します。
クライアントを作成します。
- Clients をクリックし、Create client をクリックします。
- Client type として SAML を選択します。
保護するアプリケーションの URL を Client ID として入力します。たとえば、
http://localhost:8080/simple-webapp-example/secured/
です。重要クライアント ID はアプリケーションの URL と正確に一致する必要があります。クライアント ID が一致しない場合は、次のようなエラーが表示されます。
2023-05-17 19:54:31,586 WARN [org.keycloak.events] (executor-thread-0) type=LOGIN_ERROR, realmId=eba0f106-389f-4216-a676-05fcd0c0c72e, clientId=null, userId=null, ipAddress=127.0.0.1, error=client_not_found, reason=Cannot_match_source_hash
-
クライアント名を入力します。たとえば、
jbeap-saml
です。 - Next をクリックします。
以下の情報を入力します。
-
Root URL: アプリケーションの URL (例:
http://localhost:8080/simple-webapp-example/
)。 Home URL: アプリケーションの URL (例:
http://localhost:8080/simple-webapp-example/
)。重要Home URL を設定しないと、クライアント設定の
SP entityID
が空白のままになり、エラーが発生します。管理 CLI コマンドを使用すると、次のエラーが発生します。
Can't reset to root in the middle of the path @72
それぞれの設定ファイルで
SP entityID
の値を定義することで、エラーを解決できます。-
Valid Redirect URI: ユーザーのログイン後に利用可能な URI (例:
http://localhost:8080/simple-webapp-example/secured/*
)。 Master SAML Processing URL: アプリケーションの URL の後に
saml
を付けます。たとえば、http://localhost:8080/simple-webapp-example/saml
です。重要URL に
saml
を追加しないと、リダイレクトエラーが発生します。詳細は、SAML クライアントの作成 を参照してください。
-
Root URL: アプリケーションの URL (例:
これで、設定したクライアントを使用して、JBoss EAP にデプロイした Web アプリケーションを保護できるようになりました。詳細は、SAML を使用した Web アプリケーションの保護 を参照してください。
次のステップ
2.4.3. SAML を使用した Web アプリケーションの保護
Keycloak SAML アダプター機能パックは、OpenShift 以外のデプロイメント用の keycloak-client-saml
および keycloak-client-saml-ejb
という 2 つのレイヤーを提供します。keycloak-client-saml
レイヤーはサーブレットベースの Web アプリケーションの保護に、keycloak-client-saml-ejb
は Jakarta Enterprise Beans アプリケーションの保護に使用します。
SAML を使用するようにアプリケーションを設定するには、次の 2 つの方法があります。
keycloak-saml
サブシステムを設定する方法アプリケーションのデプロイメントに設定を追加しない場合は、この方法を使用します。
デプロイメント設定を更新する方法
サーバーに設定を追加せず、アプリケーションのデプロイメント内に設定を保持する場合は、この方法を使用します。
前提条件
Red Hat build of Keycloak で SAML クライアントを作成している。
詳細は、Red Hat build of Keycloak での SAML クライアントの作成 を参照してください。
jboss-eap-installation-manager
を使用して JBoss EAP をインストールしている。詳細は、Red Hat JBoss Enterprise Application Platform のインストール方法 ガイドの
jboss-eap-installation-manager
を使用した JBoss EAP 8.0 のインストール を参照してください。
手順
jboss-eap-installation-manager
を使用して、必要な Keycloak SAML アダプターレイヤーをサーバーに追加します。利用可能なレイヤーの詳細は次のとおりです。-
機能パック:
org.keycloak:keycloak-saml-adapter-galleon-pack
レイヤー:
-
keycloak-client-saml
: このレイヤーを使用してサーブレットを保護します。 keycloak-client-saml-ejb
: このレイヤーを使用して、サーブレットから Jakarta Enterprise Beans にアイデンティティーを伝播します。JBoss EAP での機能パックとレイヤーの追加については、Red Hat JBoss Enterprise Application Platform のインストール方法 ガイドの jboss-eap-installation-manager を使用した既存の JBoss EAP サーバーへの機能パックの追加 を参照してください。
-
-
機能パック:
アプリケーションの
web.xml
を設定して、アプリケーションリソースを保護します。<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" metadata-complete="false"> <security-constraint> <web-resource-collection> <web-resource-name>secured</web-resource-name> <url-pattern>/secured</url-pattern> </web-resource-collection> <auth-constraint> <role-name>Admin</role-name> 1 </auth-constraint> </security-constraint> <security-role> <role-name>*</role-name> </security-role> </web-app>
- 1
Admin
ロールを持つユーザーのみがアプリケーションにアクセスできるようにします。任意のロールを持つユーザーがアプリケーションにアクセスできるようにするには、role-name
の値としてワイルドカード**
を使用します。
管理 CLI を使用するか、アプリケーションのデプロイメントを更新することにより、SAML でアプリケーションを保護します。
アプリケーションのデプロイメントを更新する場合
認証方法として SAML を指定するログイン設定を、アプリケーションの
web.xml
に追加します。<web-app> ... <login-config> <auth-method>SAML</auth-method> 1 </login-config> ... </web-app>
- 1
- SAML を使用してアプリケーションを保護します。
Red Hat build of Keycloak から
keycloak-saml.xml
設定ファイルをダウンロードし、アプリケーションのWEB-INF/
ディレクトリーに保存します。詳細は、クライアントアダプター設定の生成 を参照してください。
keycloak-saml.xml
の例<keycloak-saml-adapter> <SP entityID="" sslPolicy="EXTERNAL" logoutPage="SPECIFY YOUR LOGOUT PAGE!"> <Keys> <Key signing="true"> <PrivateKeyPem>PRIVATE KEY NOT SET UP OR KNOWN</PrivateKeyPem> <CertificatePem>...</CertificatePem> </Key> </Keys> <IDP entityID="idp" signatureAlgorithm="RSA_SHA256" signatureCanonicalizationMethod="http://www.w3.org/2001/10/xml-exc-c14n#"> <SingleSignOnService signRequest="true" validateResponseSignature="true" validateAssertionSignature="false" requestBinding="POST" bindingUrl="http://localhost:8180/realms/example_saml_realm/protocol/saml"/> <SingleLogoutService signRequest="true" signResponse="true" validateRequestSignature="true" validateResponseSignature="true" requestBinding="POST" responseBinding="POST" postBindingUrl="http://localhost:8180/realms/example_saml_realm/protocol/saml" redirectBindingUrl="http://localhost:8180/realms/example_saml_realm/protocol/saml"/> </IDP> </SP> </keycloak-saml-adapter>
PrivateKeyPem
およびCertificatePem
の値は、クライアントごとに一意です。
管理 CLI を使用する場合
Red Hat build of Keycloak からクライアント設定ファイル
keycloak-saml-subsystem.cli
をダウンロードします。詳細は、クライアントアダプター設定の生成 を参照してください。
keycloak-saml-subsystem.cli
の例/subsystem=keycloak-saml/secure-deployment=YOUR-WAR.war/:add /subsystem=keycloak-saml/secure-deployment=YOUR-WAR.war/SP="http://localhost:8080/simple-webapp-example/"/:add(sslPolicy=EXTERNAL,logoutPage="SPECIFY YOUR LOGOUT PAGE!" /subsystem=keycloak-saml/secure-deployment=YOUR-WAR.war/SP="http://localhost:8080/simple-webapp-example/"/Key=KEY1:add(signing=true, \ PrivateKeyPem="...", CertificatePem="...") /subsystem=keycloak-saml/secure-deployment=YOUR-WAR.war/SP="http://localhost:8080/simple-webapp-example/"/IDP=idp/:add( \ SingleSignOnService={ \ signRequest=true, \ validateResponseSignature=true, \ validateAssertionSignature=false, \ requestBinding=POST, \ bindingUrl=http://localhost:8180/realms/example-saml-realm/protocol/saml}, \ SingleLogoutService={ \ signRequest=true, \ signResponse=true, \ validateRequestSignature=true, \ validateResponseSignature=true, \ requestBinding=POST, \ responseBinding=POST, \ postBindingUrl=http://localhost:8180/realms/example-saml-realm/protocol/saml, \ redirectBindingUrl=http://localhost:8180/realms/example-saml-realm/protocol/saml} \ ) /subsystem=keycloak-saml/secure-deployment=YOUR-WAR.war/SP="http://localhost:8080/simple-webapp-example/"/IDP=idp/:write-attribute(name=signatureAlgorithm,value=RSA_SHA256) /subsystem=keycloak-saml/secure-deployment=YOUR-WAR.war/SP="http://localhost:8080/simple-webapp-example/"/IDP=idp/:write-attribute(name=signatureCanonicalizationMethod,value=http://www.w3.org/2001/10/xml-exc-c14n#)
PrivateKeyPem
およびCertificatePem
の値は、クライアントごとに一意です。クライアント設定ファイル内のすべての
YOUR-WAR.war
を、実際のアプリケーション WAR の名前 (例:simple-webapp-example.war
) で更新します。注記生成される CLI スクリプトの 2 番目のステートメントの末尾には、
)
がありません。/subsystem=keycloak-saml/secure-deployment=YOUR-WAR.war/SP=""/:add(sslPolicy=EXTERNAL,logoutPage="SPECIFY YOUR LOGOUT PAGE!"
不足している
)
を追加する必要があります。管理 CLI を使用して
keycloak-saml-subsystem.cli
スクリプトを実行して、JBoss EAP を設定します。$ <EAP_HOME>/bin/jboss-cli.sh -c --file=<path_to_the_file>/keycloak-saml-subsystem.cli
アプリケーションをデプロイします。
$ mvn wildfly:deploy
検証
ブラウザーで、アプリケーションの URL に移動します。たとえば、
http://localhost:8080/simple-webapp-example/secured
です。Red Hat build of Keycloak のログインページにリダイレクトされます。
- Red Hat build of Keycloak で定義したユーザーの認証情報を使用してログインできます。
これで、アプリケーションが SAML を使用して保護されました。