9.3. Securing applications using OpenID Connect with Red Hat Single Sign-On
OpenID Connect (OIDC) を使用して、認証を外部の OpenID プロバイダーに委任できます。elytron-oidc-client サブシステムは、外部の OpenID プロバイダーと接続するための JBoss EAP のネイティブ OIDC クライアントを提供します。
Red Hat Single Sign-On を使用して OpenID Connect でセキュリティー保護されたアプリケーションを作成するには、次の手順に従います。
9.3.1. OpenID プロバイダーとしての Red Hat Single Sign-On の設定 リンクのコピーリンクがクリップボードにコピーされました!
Red Hat Single Sign-On は、Single Sign-On (SSO) で Web アプリケーションをセキュリティー保護するための ID およびアクセス管理プロバイダーです。OpenID Connect (OAuth 2.0 のエクステンション) をサポートしています。
前提条件
- Red Hat Single Sign-On サーバーをインストールしました。詳細については、Red Hat Single Sign-On Getting Started Guide の Installing the Red Hat Single Sign-On server を参照してください。
- Red Hat Single Sign-On サーバーインスタンスにユーザーを作成しました。詳細については、Red Hat Single Sign-On Getting Started Guide の Creating a user を参照してください。
手順
JBoss EAP のデフォルトポートは 8080 であるため、Red Hat Single Sign-On サーバーを 8080 以外のポートで起動します。
構文
$ RH_SSO_HOME/bin/standalone.sh -Djboss.socket.binding.port-offset=<offset-number>例:
$ /home/servers/rh-sso-7.4/bin/standalone.sh -Djboss.socket.binding.port-offset=100-
http://localhost:<port>/auth/で管理コンソールにログインします。たとえば、http://localhost:8180/auth/です。 - レルムを作成するには、管理コンソールで Master にカーソルを合わせ、Add realm をクリックします。
-
レルムの名前を入力します。たとえば、
example_realm。Enabled が オン になっていることを確認し、Create をクリックします。 - Users をクリックし、ユーザーの Add user をクリックしてユーザーをレルムに追加します。
-
ユーザー名を入力。たとえば、
jane_doe。User Enabled が ON になっていることを確認し、Save をクリックします。 - Credentials をクリックして、ユーザーにパスワードを追加します。
-
ユーザーのパスワードを設定します。たとえば、
janedoep@$$。Temporary を OFF に切り替えて、Set Password をクリックします。確認プロンプトで、Set password をクリックします。 - Clients をクリックし、Create をクリックしてクライアント接続を設定します。
-
クライアント ID を入力します。たとえば、
my_jbeap。Client Protocol がopenid-connectに設定されていることを確認し、Save をクリックします。 Installation をクリックし、Format Option として
Keycloak OIDC JSONを選択して、接続パラメーターを確認します。{ "realm": "example_realm", "auth-server-url": "http://localhost:8180/auth/", "ssl-required": "external", "resource": "my_jbeap", "public-client": true, "confidential-port": 0 }Red Hat Single Sign-On をアイデンティティプロバイダーとして使用するように JBoss EAP アプリケーションを設定する場合は、次のようにパラメーターを使用します。
"provider-url" : "http://localhost:8180/auth/realms/example_realm", "ssl-required": "external", "client-id": "my_jbeap", "public-client": true, "confidential-port": 0- Clients をクリックし、my_jbeap の横にある Edit をクリックしてクライアント設定を編集します。
Valid Redirect URIs に、認証が成功した後にページがリダイレクトする URL を入力します。
この例では、この値を
http://localhost:8080/simple-oidc-example/secured/*に設定します
9.3.2. セキュアなアプリケーションを作成するための Maven プロジェクトの設定 リンクのコピーリンクがクリップボードにコピーされました!
セキュリティー保護されたアプリケーションを作成するために必要な依存関係とディレクトリー構造を使用して Maven プロジェクトを作成します。
前提条件
- Maven がインストールされている。詳細については、Downloading Apache Maven を参照してください。
- 最新リリース用に Maven リポジトリーを設定しました。詳細については、Maven and the JBoss EAP microprofile maven repository を参照してください。
手順
mvnコマンドを使用して Maven プロジェクトを設定します。このコマンドは、プロジェクトのディレクトリー構造とpom.xml設定ファイルを作成します。構文
$ mvn archetype:generate \ -DgroupId=${group-to-which-your-application-belongs} \ -DartifactId=${name-of-your-application} \ -DarchetypeGroupId=org.apache.maven.archetypes \ -DarchetypeArtifactId=maven-archetype-webapp \ -DinteractiveMode=false例
$ mvn archetype:generate \ -DgroupId=com.example.oidc \ -DartifactId=simple-oidc-example \ -DarchetypeGroupId=org.apache.maven.archetypes \ -DarchetypeArtifactId=maven-archetype-webapp \ -DinteractiveMode=falseアプリケーションのルートディレクトリーに移動します。
構文
$ cd <name-of-your-application>例
$ cd simple-oidc-example生成された
pom.xmlファイルを次のように更新します。以下のプロパティーを設定します。
<properties> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> <failOnMissingWebXml>false</failOnMissingWebXml> <version.server.bom>4.0.0.GA</version.server.bom> <version.server.bootable-jar>4.0.0.GA</version.server.bootable-jar> <version.wildfly-jar.maven.plugin>4.0.0.GA</version.wildfly-jar.maven.plugin> </properties>次の依存関係を設定します。
<dependencies> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0.redhat-1</version> <scope>provided</scope> </dependency> </dependencies>mvn widlfy:deployを使用してアプリケーションをデプロイするには、次のビルド設定を設定します。<build> <finalName>${project.artifactId}</finalName> <plugins> <plugin> <groupId>org.wildfly.plugins</groupId> <artifactId>wildfly-maven-plugin</artifactId> <version>2.1.0.Final</version> </plugin> </plugins> </build>
検証
アプリケーションのルートディレクトリーで、次のコマンドを入力します。
$ mvn install次のような出力が得られます。
[INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 1.440 s [INFO] Finished at: 2021-12-27T14:45:12+05:30 [INFO] ------------------------------------------------------------------------
これで、セキュアなアプリケーションを作成できます。
9.3.3. OpenID Connect を使用するセキュアなアプリケーションの作成 リンクのコピーリンクがクリップボードにコピーされました!
アプリケーションをセキュリティー保護するには、デプロイメント設定を更新するか、elytron-oidc-client サブシステムを設定します。次の例は、ログインしたユーザーのプリンシパルを出力するサーブレットの作成を示しています。既存のアプリケーションの場合、デプロイメント設定または elytron-oidc-client サブシステムの更新に関連するステップのみが必要です。
この例では、プリンシパルの値は OpenID プロバイダーの ID トークンから取得されます。デフォルトでは、プリンシパルはトークンからの "sub" クレームの値です。次のいずれかで、ID トークンからプリンシパルとして使用するクレーム値を指定できます。
-
elytron-oidc-clientサブシステム属性principal-attribute。 -
oidc.jsonファイル。
プロシージャの <application_root> は、pom.xml ファイルディレクトリーを示します。pom.xml ファイルには、アプリケーションの Maven 設定が含まれています。
前提条件
- Maven プロジェクトを作成しました。詳細は、Configuring Maven project for creating a secure application を参照してください。
- Red Hat Single Sign-On を OpenID プロバイダーとして設定しました。詳細は、Configuring Red Hat Single Sign-On as an OpenID provider を参照してください。
-
elytron-oidc-clientサブシステムを有効にしました。詳細は、Enabling the elytron-oidc-client subsystem を参照してください。
手順
Java ファイルを保存するディレクトリーを作成します。
構文
$ mkdir -p <application_root>/src/main/java/com/example/oidc例
$ mkdir -p simple-oidc-example/src/main/java/com/example/oidc新しいディレクトリーに移動します。
構文
$ cd <application_root>/src/main/java/com/example/oidc例
$ cd simple-oidc-example/src/main/java/com/example/oidc次の内容のサーブレット SecuredServlet.java を作成します。
package com.example.oidc; import java.io.IOException; import java.io.PrintWriter; import java.security.Principal; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * A simple secured HTTP servlet. * */ @WebServlet("/secured") public class SecuredServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { try (PrintWriter writer = resp.getWriter()) { writer.println("<html>"); writer.println(" <head><title>Secured Servlet</title></head>"); writer.println(" <body>"); writer.println(" <h1>Secured Servlet</h1>"); writer.println(" <p>"); writer.print(" Current Principal '"); Principal user = req.getUserPrincipal(); writer.print(user != null ? user.getName() : "NO AUTHENTICATED USER"); writer.print("'"); writer.println(" </p>"); writer.println(" </body>"); writer.println("</html>"); } } }アプリケーションの
WEB-INFディレクトリーにあるデプロイメント記述子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>*</role-name> </auth-constraint> </security-constraint> <security-role> <role-name>*</role-name> </security-role> </web-app>OpenID Connect を使用してアプリケーションをセキュリティー保護するには、デプロイメント設定を更新するか、
elytron-oidc-clientサブシステムを設定します。注記デプロイメント設定と
elytron-oidc-clientサブシステムの両方で OpenID Connect を設定する場合、elytron-oidc-clientサブシステムのsecure-deployment属性の設定は、アプリケーションデプロイメント記述子の設定よりも優先されます。デプロイメント設定の更新:
次のように、
WEB-INFディレクトリーにファイルoidc.jsonを作成します。{ "provider-url" : "http://localhost:8180/auth/realms/example_realm", "ssl-required": "external", "client-id": "my_jbeap", "public-client": true, "confidential-port": 0 }デプロイメント記述子
web.xmlファイルを次のテキストで更新して、このアプリケーションが OIDC を使用することを宣言します。<login-config> <auth-method>OIDC</auth-method> </login-config>
elytron-oidc-clientサブシステムの設定:アプリケーションを保護するには、次の管理 CLI コマンドを使用します。
/subsystem=elytron-oidc-client/secure-deployment=simple-oidc-example.war/:add(client-id=my_jbeap,provider-url=http://localhost:8180/auth/realms/example_realm,public-client=true,ssl-required=external)
アプリケーションのルートディレクトリーで、次のコマンドを使用してアプリケーションをコンパイルします。
$ mvn packageアプリケーションをデプロイします。
$ mvn wildfly:deploy
検証
-
ブラウザーで、
http://localhost:8080/simple-oidc-example/securedに移動します。 クレデンシャルを使用してログインします。以下に例を示します。
username: jane_doe password: janedoep@$$次の出力が得られます。
Secured Servlet Current Principal '5cb0c4ca-0477-44c3-bdef-04db04d7e39d'これで、Red Hat Single Sign-On で OpenID プロバイダーとして設定したクレデンシャルを使用してアプリケーションにログインできます。
9.3.4. ユーザーのロールに基づいてアプリケーションへのアクセスを制限する リンクのコピーリンクがクリップボードにコピーされました!
ユーザーのロールに基づいて、アプリケーションのすべてまたは一部へのアクセスを制限できます。たとえば、public ロールを持つユーザーに、機密性の低いアプリケーションの部分へのアクセスを許可し、admin ロールを持つユーザーに、機密性の高い部分へのアクセス権を与えることができます。
前提条件
- OpenID Connect を使用してアプリケーションをセキュリティー保護しました。詳細は、Creating a secure application that uses OpenID Connect を参照してください。
手順
デプロイメント記述子
web.xmlファイルを次のテキストで更新します。構文
<security-constraint> ... <auth-constraint> <role-name><allowed_role></role-name> </auth-constraint> </security-constraint>例
<security-constraint> ... <auth-constraint> <role-name>example_role</role-name>1 </auth-constraint> </security-constraint>- 1
- ロール
example_roleを持つユーザーのみにアプリケーションへのアクセスを許可します。
アプリケーションのルートディレクトリーで、次のコマンドを使用してアプリケーションを再コンパイルします。
$ mvn packageアプリケーションをデプロイします。
$ mvn wildfly:deploy
検証
-
ブラウザーで、
http://localhost:8080/simple-oidc-example/securedに移動します。 クレデンシャルを使用してログインします。以下に例を示します。
username: jane_doe password: janedoep@$$次の出力が得られます。
Forbiddenユーザー jane_doe に必要なロールを割り当てていないため、jane_doe はアプリケーションにログインできません。必要なロールを持つユーザーのみがログインできます。
ユーザーに必要なロールを割り当てるには、Creating and assigning roles to users in Red Hat Single Sign-On を参照してください。
9.3.5. Red Hat Single Sign-On でのユーザーロールの作成と割り当て リンクのコピーリンクがクリップボードにコピーされました!
Red Hat Single Sign-On は、シングルサインオン (SSO) を使用して Web アプリケーションを保護するためのアイデンティティーおよびアクセス管理プロバイダーです。Red Hat Single Sign-On でユーザーを定義し、ロールを割り当てることができます。
前提条件
- Red Hat Single Sign-On を設定しました。詳細は、Configuring Red Hat Single Sign-On as an OpenID provider を参照してください。
手順
-
http://localhost:<port>/auth/で管理コンソールにログインします。たとえば、http://localhost:8180/auth/です。 - JBoss EAP との接続に使用するレルムをクリックします。たとえば、example_realm。
-
Clients をクリックしてから、JBoss EAP 用に設定した
client-nameをクリックします。たとえば、my_jbeap。 - Roles、Add Role の順にクリックします。
- example_role などのロール名を入力し、Save をクリックします。これは、JBoss EAP で承認のために設定するロール名です。
- Users、View all users の順にクリックします。
- ID をクリックして、作成したロールを割り当てます。たとえば、jane_doe の ID をクリックします。
-
Role Mappings をクリックします。Client Roles フィールドで、JBoss EAP 用に設定した
client-nameを選択します。たとえば、my_jbeap。 - Available Roles で、割り当てるロールを選択します。たとえば、example_role。Add selected をクリックします。
検証
- ブラウザーで、アプリケーションの URL に移動します。
クレデンシャルを使用してログインします。以下に例を示します。
username: jane_doe password: janedoep@$$次の出力が得られます。
Secured Servlet Current Principal '5cb0c4ca-0477-44c3-bdef-04db04d7e39d'必要なロールを持つユーザーは、アプリケーションにログインできます。