次の方法で共有


OpenID Connect を使用した Microsoft Entra ID による Quarkus アプリケーションの保護

この記事では、OpenID Connect (OIDC) を使用して、Microsoft Entra ID で Red Hat Quarkus アプリケーションをセキュリティで保護する方法について説明します。

この記事では、次のことについて説明します。

  • Microsoft Entra ID を使用して、OpenID Connect プロバイダーを設定します。
  • OpenID Connect を使用して、Quarkus アプリを保護します。
  • Quarkus アプリを実行してテストします。

前提条件

Microsoft Entra ID を使用して、OpenID Connect プロバイダーを設定する

このセクションでは、Microsoft Entra ID で OpenID Connect プロバイダーを設定して、Quarkus アプリで使用します。 後のセクションでは、OpenID Connect を使用して Microsoft Entra テナントのユーザーを認証および承認することで、Quarkus アプリを構成します。

Microsoft Entra テナントにユーザーを作成する

まず、「ユーザーを作成、招待、削除する方法」の手順に従って、Microsoft Entra テナントに 2 人のユーザーを作成します。 必要なのは、「新しいユーザーの作成」セクションだけです。 この記事を読み進める際には、以下の手順に従い、Microsoft Entra テナントにユーザーを作成した後でこの記事に戻ってください。

アプリで「管理者」として機能するユーザーを作成するには、次の手順に従います。

  1. [新しいユーザーの作成]セクションの [基本] タブに移動したら、次の手順を実行します。
    1. [ユーザー プリンシパル名]「管理者」と入力します。後でアプリにサインインするときに使用できるように、値を保存します。

    2. [メール ニックネーム] で、[Derive from user principal name] (ユーザー プリンシパル名から派生する) を選択します

    3. [表示名] に「管理者」と入力します。

    4. [パスワード] で、[パスワードの自動生成] を選択します。 後でアプリにサインインするときに使用するパスワード値をコピーして保存します。

    5. [アカウントが有効] を選択します。

      管理者ユーザーの [新しいユーザーの基本情報の作成] ウィンドウが表示された Azure ポータルのスクリーンショット。

    6. [確認と作成]>[作成] の順に選択します。 ユーザーが作成されるまで待ちます。

    7. 少し待ってから、更新] を選択します。 新しいユーザーがリストに表示されます。

アプリ内で「ユーザー」として機能するユーザーを作成するには、これらの手順を繰り返しますが、次の値を使用します。

  • [ユーザー プリンシパル名] に、「ユーザー」と入力します。
  • [表示名] に「ユーザー」と入力します。

通常のユーザーの [新しいユーザーの基本情報の作成] ウィンドウが表示された Azure ポータルのスクリーンショット。

Microsoft Entra ID でアプリケーションの登録

次に、以下の手順に従ってアプリケーションを登録するには、「クイック スタート: Microsoft ID プラットフォームにアプリケーションを登録する」を参照してください。 この記事を読みながら次の指示に従い、アプリケーションを登録して構成した後でこの記事に戻ってください。

  1. アプリケーションを登録する」セクションにアクセスしたら、次の手順を実行します。
    1. [サポートされているアカウントの種類] で、 [Accounts in this organizational directory only (Default Directory only - Single tenant)] (この組織ディレクトリのアカウントのみ (既定のディレクトリのみ - シングル テナント)) を選択します。
    2. 登録が完了したら、アプリケーション (クライアント) IDディレクトリ (テナント) ID 値を保存して、後でアプリ構成で使用します。
  2. [リダイレクト URI の追加] セクションにアクセスしたら、今の時点では手順をスキップします。 この記事では、後でサンプル アプリをローカルで実行してテストするときに、リダイレクト URI を追加します。
  3. [資格情報の追加] セクションに到達したら、 [クライアント シークレットの追加] タブを選択します。
  4. クライアント シークレットを追加するときは、後でアプリ構成で使用する [クライアント シークレット] 値を書き留めます。

アプリケーションにアプリ ロールを追加する

次に、「アプリケーションにアプリ ロールを追加し、トークンで受け取る」の手順に従って、アプリケーションにアプリ ロールを追加します。 必要なのは、「アプリケーションのロール宣言」セクションと「ユーザーとグループを Microsoft Entra ロールに割り当てる」セクションだけです。 この記事を読み進める際には次の指示に従い、アプリケーションのロール宣言が完了したらこの記事に戻ってください。

  1. アプリケーションのロールを宣言する」セクションに到達したら、[アプリ ロール] UI を使用して、管理者と通常のユーザーのロールを作成します。

    1. 次の値を使用して管理者ユーザー ロールを作成します。

      • [表示名] に「管理者」と入力します。
      • [許可されたメンバーの種類][ユーザー/グループ] を選択します。
      • [値] には、「admin」と入力します。
      • [説明] に「管理者」と入力します。
      • [Do you want to enable this app role?] (このアプリのロールを有効にしますか?) を選択します。

      管理者ユーザーの [アプリ ロールの作成] ウィンドウが表示された Azure ポータルのスクリーンショット。

    2. 適用を選択します。 ロールが作成されるまで待ちます。

    3. 同じ手順で、次の値を使用して通常のユーザー ロールを作成します。

      • [表示名] に「ユーザー」と入力します。
      • [値] には、「管理者」と入力します。
      • [説明] には、「ユーザー」と入力します。

      通常のユーザーの [アプリ ロールの作成] ウィンドウが表示された Azure ポータルのスクリーンショット。

  2. Microsoft Entra ロールへのユーザーとグループの割り当て」セクションに到達したら、次の手順を使用します。

    1. [Add user/group](ユーザーまたはグループの追加) を選択します。

    2. [割り当ての追加] ウィンドウの [ユーザー]で、ユーザー [管理者] を選択し、[ロールの選択] を選択して、ロール [管理者] を選択します。次に、[割り当て] を選択します。 アプリケーションの割り当てが成功するまで待ちます。 テーブルを横にスクロールして、[割り当てられたロール] 列を表示する必要がある場合があります。

    3. 前の手順を繰り返して、ユーザー ロールをユーザー [ユーザー] に割り当てます。

    4. [更新] を選択すると、[ユーザーとグループ] ペインに割り当てられているユーザーとロールが表示されます。

      割り当てられたユーザーとロールを示す Azure portal のスクリーンショット。

      ビューを画像のように見えるようにするには、列ヘッダーの幅を調整する必要がある場合があります。

アプリケーションにアプリ ロールを追加し、トークンで受け取る」の手順は実行しないでください。

OpenID Connect を使用して、Quarkus アプリを保護する

このセクションでは、OpenID Connect を使用して、Microsoft Entra テナント内のユーザーを認証および承認する Quarkus アプリを保護します。 また、ロールベースのアクセス制御 (RBAC) を使用して、アプリの特定の部分へのアクセス権をユーザーに付与する方法についても説明します。

このクイックスタートのサンプル Quarkus アプリは、[quarkus-azure] リポジトリの GitHub にあり、[entra-id-quarkus] ディレクトリにあります。

認証と承認を有効にしてアプリのセキュリティを確保する

アプリには、次のコード例に示すように、WelcomePage.java で定義されたウェルカム ページ リソースがあります。 このページには、認証されていないユーザーがアクセスできます。 ウェルカム ページのルート パスは、/ にあります。

@Path("/")
public class WelcomePage {

    private final Template welcome;

    public WelcomePage(Template welcome) {
        this.welcome = requireNonNull(welcome, "welcome page is required");
    }

    @GET
    @Produces(MediaType.TEXT_HTML)
    public TemplateInstance get() {
        return welcome.instance();
    }

}

ウェルカム ページから、ユーザーはアプリにサインインしてプロファイル ページにアクセスできます。 ウェルカム ページには、ユーザーまたは管理者としてサインインするためのリンクがあります。リンクはそれぞれ /profile/user/profile/admin にあります。 ウェルカム ページ UI は、welcome.qute.html で定義され、次の例に示されています。

<html>
    <head>
        <meta charset="UTF-8">
        <title>Greeting</title>
    </head>
    <body>
        <h1>Hello, welcome to Quarkus and Microsoft Entra ID integration!</h1>
        <h1>
            <a href="/profile/user">Sign in as user</a>
        </h1>
        <h1>
            <a href="/profile/admin">Sign in as admin</a>
        </h1>
    </body>
</html>

/profile/user/profile/adminの両方のリンクは、次のコード例に示すように、ProfilePage.java で定義されているプロファイル ページ リソースを指します。 このページには、jakarta.annotation.security.RolesAllowed パッケージの @RolesAllowed("**") 注釈を使用して、認証されたユーザーのみがアクセスできます。 @RolesAllowed("**")注釈は、認証されたユーザーのみが /profile パスにアクセスできることを指定します。

@Path("/profile")
@RolesAllowed("**")
public class ProfilePage {

    private final Template profile;

    @Inject
    SecurityIdentity identity;

    @Inject
    JsonWebToken accessToken;

    public ProfilePage(Template profile) {
        this.profile = requireNonNull(profile, "profile page is required");
    }

    @Path("/admin")
    @GET
    @Produces(MediaType.TEXT_HTML)
    @RolesAllowed("admin")
    public TemplateInstance getAdmin() {
        return getProfile();
    }

    @Path("/user")
    @GET
    @Produces(MediaType.TEXT_HTML)
    @RolesAllowed({"user","admin"})
    public TemplateInstance getUser() {
        return getProfile();
    }

    private TemplateInstance getProfile() {
        return profile
                .data("name", identity.getPrincipal().getName())
                .data("roles", identity.getRoles())
                .data("scopes", accessToken.getClaim("scp"));
    }

}

プロファイル ページ リソースは、@RolesAllowed 注釈を使用して RBAC を有効にします。 @RolesAllowed 注釈の引数では、admin ロールを持つユーザーのみが /profile/admin パスにアクセスでき、user または admin ロールを持つユーザーのみが /profile/user パスにアクセスできることを指定します。

/profile/admin エンドポイントと /profile/user エンドポイントの両方がプロファイル ページを返します。 プロファイル ページ UI は、次の例に示すように、profile.qute.html で定義されます。 このページには、ユーザーの名前、ロール、およびスコープが表示されます。 プロファイル ページには、/logout にサインアウト リンクもあり、ユーザーを OIDC プロバイダーにリダイレクトしてサインアウトします。プロファイル ページは、Qute テンプレート エンジンを使用して記述されます。 ページでの {} 式の使用に注意してください。 これらの式では、data() メソッドを使用して TemplateInstance に渡される値を使用します。 Qute の詳細については、「Qute テンプレート エンジン」を参照してください。

<html>
    <head>
        <meta charset="UTF-8">
        <title>Profile</title>
    </head>
    <body>
        <h1>Hello, {name}</h1>
        <h2>Roles</h2>
        <ul>
            {#if roles}
                {#for role in roles}
                    <li>{role}</li>
                {/for}
            {#else}
                <li>No roles found!</li>
            {/if}
        </ul>
        <h2>Scopes</h2>
        <p>
            {scopes}
        </p>
        <h1>
            <b><a href="/logout">Sign out</a></b>
        </h1>
    </body>
</html>

サインアウト後、ユーザーはウェルカム ページにリダイレクトされ、再度サインインできるようになります。

Quarkus アプリを実行してテストする

このセクションでは、Quarkus アプリを実行してテストし、OpenID Connect プロバイダーとして Microsoft Entra ID を使用してどのように動作するかを確認します。

アプリケーション登録にリダイレクト URI を追加する

アプリをローカルで正常に実行してテストするには、アプリ登録にリダイレクト URI を追加する必要があります。 「クイック スタート: マイクロソフト ID プラットフォームを使用してアプリケーションを登録する」「リダイレクト URI を追加する」セクションの手順を実行して、次の値をしっ要します。

  • [プラットフォームの構成][Web] を選びます。
  • [リダイレクト URI] に「http://localhost:8080」を入力します。

サンプルを準備する

サンプル Quarkus アプリを準備するには、次の手順に従います。

  1. 次のコマンドを使用して、GitHub からサンプル Quarkus アプリをクローンし、entra-id-quarkus ディレクトリに移動します。

    git clone https://github.com/Azure-Samples/quarkus-azure
    cd quarkus-azure/entra-id-quarkus
    git checkout 2024-09-26
    

    HEAD がデタッチされた状態であることを示すメッセージが表示された場合、このメッセージは無視しても問題ありません。 この記事ではコミットを必要としないため、HEAD がデタッチされた状態が適切です。

  2. 次のコマンドを使用して、前に書き留めた値で次の環境変数を定義します。

    export QUARKUS_OIDC_CLIENT_ID=<application/client-ID>
    export QUARKUS_OIDC_CREDENTIALS_SECRET=<client-secret>
    export QUARKUS_OIDC_AUTH_SERVER_URL=https://login.microsoftonline.com/<directory/tenant-ID>/v2.0
    

    これらの環境変数は、Quarkus の OpenID Connect の組み込みサポートの値を提供します。 application.properties の対応するプロパティを次の例に示します。

    quarkus.oidc.client-id=
    quarkus.oidc.credentials.secret=
    quarkus.oidc.auth-server-url=
    

    application.properties でプロパティの値が空白の場合、Quarkus はプロパティ名を環境変数に変換し、環境から値を読み取ります。 命名変換の詳細については、「MicroProfile Config の仕様」を参照してください。

Quarkus アプリを実行する

Quarkus アプリはさまざまなモードで実行できます。 以下のいずれかの方法を選択して、Quarkus アプリを実行します。 Quarkus が Microsoft Entra ID に接続できるようにするには、前のセクションで示した環境変数を定義したシェルでコマンドを必ず実行してください。

  • Quarkus アプリを開発モードで実行します。

    mvn quarkus:dev
    
  • Quarkus アプリを JVM モードで実行します。

    mvn install
    java -jar target/quarkus-app/quarkus-run.jar
    
  • Quarkus アプリをネイティブ モードで実行します。

    mvn install -Dnative -Dquarkus.native.container-build
    ./target/quarkus-ad-1.0.0-SNAPSHOT-runner
    

さまざまなモードを試す場合は、Ctrl+C を使用して Quarkus アプリを停止し、別のモードで Quarkus アプリを実行します。

Quarkus アプリをテストする

Quarkus アプリが実行されたら、プライベート タブで Web ブラウザーを開き、http://localhost:8080 に移動します。 ウェルカム ページが表示され、ユーザーまたは管理者としてサインインするためのリンクが表示されます。プライベート タブを使用すると、通常のブラウザーで実行されている既存の Microsoft Entra ID アクティビティが汚染されることがなくなります。

ウェルカム ページを表示するサンプル アプリケーションのスクリーンショット。

2 人のユーザーの資格情報を収集する

この記事では、Microsoft Entra ID はサインイン用のユーザー ID として各ユーザーのメール アドレスを使用します。 管理者ユーザーと通常ユーザーのメール アドレスを取得するには、次の手順に従います。

  1. クラウド アプリケーション管理者以上として Microsoft Entra 管理センターにサインインします。
  2. 複数のテナントにアクセスできる場合は、トップ メニューの [設定] アイコン ( ) を使用して、[ディレクトリ + サブスクリプション] メニューからアプリケーションを登録するテナントに切り替えます。
  3. [ID] > [ユーザー] > [すべてのユーザー] を参照します。
  4. 一覧で管理者ユーザーを見つけて選択します。
  5. [ユーザー プリンシパル名] フィールドを見つけます。
  6. フィールドの値の横にあるコピー アイコンを使用して、ユーザーのメール アドレスをクリップボードに保存します。 後で使用するために値を保存します。
  7. 通常のユーザーのメール アドレスを取得するには、同じ手順に従います。

管理者ユーザーと、ユーザーの作成時に設定した通常のユーザーのパスワードを使用します。

アプリの機能を実行する

機能を実行するには、次の手順に従います。

  1. [ユーザーとしてサインイン] リンクを選択します。 先ほど作成した通常のユーザーとしてサインインします。 サインインすると、Microsoft Entra ID によってプロファイル ページにリダイレクトされ、名前、ロール、スコープが表示されます。

    ユーザー プロファイルを示すサンプル アプリケーションのスクリーンショット。

  2. 初めてサインインする場合は、パスワードを更新するように求められます。 手順に従ってパスワードを更新します。

  3. メッセージが表示された場合は、組織で追加のセキュリティ情報が必要です。指示に従って Microsoft Authenticator アプリをダウンロードしてセットアップします。[後で質問する] を選択してテストを続行できます。

  4. [要求されているアクセス許可] を求められた場合は、アプリによって要求されたアクセス許可を確認します。 [同意する] を選択してテストを続行します。

  5. [サインアウト] を選択して、Quarkus アプリからサインアウトします。 Microsoft Entra ID がサインアウトを実行します。サインアウト後、Microsoft Entra ID はウェルカム ページにリダイレクトします。

  6. [管理者としてサインイン] リンクを選択します。 Microsoft Entra IDは、サインイン ページにリダイレクトします。 先ほど作成した管理者ユーザーとしてサインインします。 サインインすると、Microsoft Entra ID によって、別のロール admin を持つ同様のプロファイル ページにリダイレクトされます。

    管理者プロファイルを示すサンプル アプリケーションのスクリーンショット。

  7. もう一度サインアウトし、前に作成した通常のユーザーで管理者としてサインインを試みます。 通常のユーザーには admin ロールがないため、エラー メッセージが表示されます。

    アクセス拒否メッセージを示すサンプル アプリケーションのスクリーンショット。

リソースをクリーンアップする

この記事では、アプリを Azure にデプロイする方法については説明しません。 Microsoft Entra ID リソースはありますが、アプリ用にクリーン アップする Azure リソースはありません。 アプリを Azure にデプロイするには、次のセクションで参照されているガイダンスに従ってください。

このサンプル アプリのリソースの使用が完了したら、次の手順に従って Microsoft Entra ID リソースをクリーンアップします。 使用されていない Microsoft Entra ID リソースを削除することは、重要なセキュリティのベスト プラクティスです。

  1. Microsoft ID プラットフォームに登録されているアプリケーションを削除する」手順に従って、作成したアプリの登録を削除します。 必要なのは、「組織が作成したアプリケーションの削除」セクションの手順に従うだけです。
  2. アプリの登録を削除すると、エンタープライズ アプリケーションも削除されます。 エンタープライズ アプリケーションの削除の詳細については、「エンタープライズ アプリケーションの削除」を参照してください。
  3. ユーザーを作成、招待、削除する方法」の手順に従って、作成したユーザーを削除します。

次のステップ

このクイック スタートでは、OpenID Connect を使用して Microsoft Entra ID で Quarkus アプリケーションを保護します。 詳細については、次のリソースを参照してください。