セキュリティーのスタートガイド
概要
Red Hat build of Quarkus ドキュメントへのフィードバックの提供 リンクのコピーリンクがクリップボードにコピーされました!
エラーを報告したり、ドキュメントを改善したりするには、Red Hat Jira アカウントにログインし、課題を送信してください。Red Hat Jira アカウントをお持ちでない場合は、アカウントを作成するように求められます。
手順
- 次のリンクをクリックして チケットを作成します。
- Summary に課題の簡単な説明を入力します。
- Description に課題や機能拡張の詳細な説明を入力します。問題があるドキュメントのセクションへの URL も記載してください。
- Submit をクリックすると、課題が作成され、適切なドキュメントチームに転送されます。
第1章 Basic 認証と Jakarta Persistence を使用したセキュリティーのスタートガイド リンクのコピーリンクがクリップボードにコピーされました!
組み込みの Quarkus Basic 認証 と Jakarta Persistence アイデンティティープロバイダーを使用して Quarkus アプリケーションエンドポイントを保護し、ロールベースのアクセス制御を有効にすることで、Quarkus Security の使用を開始します。
Jakarta Persistence IdentityProvider は、Basic 認証 のユーザー名とパスワードのペアを検証して、アクセス要求の許可に使用される SecurityIdentity インスタンスに変換します。これにより、Quarkus アプリケーションがセキュアになります。
Jakarta Persistence の詳細は、Jakarta Persistence を使用した Quarkus Security を参照してください。
このチュートリアルでは、OpenID Connect (OIDC) 認証メカニズムの使用方法など、Quarkus でより高度なセキュリティーメカニズムを実装するための準備を行います。
1.1. 前提条件 リンクのコピーリンクがクリップボードにコピーされました!
このガイドを完了するには、以下が必要です。
- 約 15 分
- IDE
-
JAVA_HOMEが適切に設定された状態でインストールされた JDK 17 以降 - Apache Maven 3.8.6 以降
- オプション: Quarkus CLI (使用する場合)
- オプション: ネイティブ実行可能ファイルをビルドする場合は、インストールおよび 適切に設定された Mandrel または GraalVM (ネイティブコンテナービルドを使用する場合は Docker)。
1.2. アプリケーションのビルド リンクのコピーリンクがクリップボードにコピーされました!
このチュートリアルでは、さまざまな認可ポリシーを示すエンドポイントを使用してアプリケーションを作成する詳細な手順を示します。
| Endpoint (エンドポイント) | 説明 |
|---|---|
|
| このエンドポイントは認証なしでアクセス可能で、匿名アクセスを使用できます。 |
|
|
ロールベースのアクセス制御 (RBAC) で保護されたこのエンドポイントには、 |
|
|
このエンドポイントも RBAC によって保護されており、 |
1.3. Maven プロジェクトの作成および検証 リンクのコピーリンクがクリップボードにコピーされました!
Quarkus Security がセキュリティーソースを Jakarta Persistence エンティティーにマップできるようにするには、このチュートリアルの Maven プロジェクトに quarkus-security-jpa エクステンションが含まれていることを確認してください。
ユーザー ID の保存には、Hibernate ORM with Panache が使用されます。ただし、Hibernate ORM と quarkus-security-jpa エクステンションを使用することもできます。
任意のデータベースコネクターライブラリーも追加する必要があります。このサンプルチュートリアルの手順では、アイデンティティーストアに PostgreSQL データベースを使用します。
1.3.1. Maven プロジェクトの作成 リンクのコピーリンクがクリップボードにコピーされました!
Security Jakarta Persistence エクステンションを使用して新しい Maven プロジェクトを作成したり、既存の Maven プロジェクトに拡張機能を追加したりできます。Hibernate ORM または Hibernate Reactive のいずれかを使用できます。
1.3.1.1. 新しい Maven プロジェクトの作成 リンクのコピーリンクがクリップボードにコピーされました!
Jakarta Persistence エクステンションで新しい Maven プロジェクトを作成するには、以下のいずれかの手順を実行します。
- Hibernate ORM を使用して Maven プロジェクトを作成するには、次のコマンドを使用します。
Quarkus CLI を使用する場合:
quarkus create app org.acme:security-jpa-quickstart \ --extension='security-jpa,jdbc-postgresql,rest,hibernate-orm-panache' \ --no-code cd security-jpa-quickstartquarkus create app org.acme:security-jpa-quickstart \ --extension='security-jpa,jdbc-postgresql,rest,hibernate-orm-panache' \ --no-code cd security-jpa-quickstartCopy to Clipboard Copied! Toggle word wrap Toggle overflow Gradle プロジェクトを作成するには、
--gradleオプションまたは--gradle-kotlin-dslオプションを追加します。Quarkus CLI のインストール方法と使用方法の詳細は、Quarkus CLI ガイドを参照してください。
Maven を使用する場合:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Gradle プロジェクトを作成するには、
-DbuildTool=gradleまたは-DbuildTool=gradle-kotlin-dslオプションを追加します。
Windows ユーザーの場合:
-
cmd を使用する場合は、バックスラッシュ
\を使用せず、すべてを同じ行に記述してください。 -
Powershell を使用する場合は、
-Dパラメーターを二重引用符で囲みます (例:"-DprojectArtifactId=security-jpa-quickstart")。
1.3.1.2. 既存のプロジェクトに Jakarta Persistence 拡張機能を追加する リンクのコピーリンクがクリップボードにコピーされました!
既存の Maven プロジェクトに Jakarta Persistence エクステンションを追加するには、次のいずれかの手順を実行します。
Hibernate ORM を使用して既存の Maven プロジェクトに Security Jakarta Persistence エクステンションを追加するには、プロジェクトベースディレクトリーから次のコマンドを実行します。
Quarkus CLI を使用する場合:
quarkus extension add security-jpa
quarkus extension add security-jpaCopy to Clipboard Copied! Toggle word wrap Toggle overflow Maven を使用する場合:
./mvnw quarkus:add-extension -Dextensions='security-jpa'
./mvnw quarkus:add-extension -Dextensions='security-jpa'Copy to Clipboard Copied! Toggle word wrap Toggle overflow Gradle を使用する場合:
./gradlew addExtension --extensions='security-jpa'
./gradlew addExtension --extensions='security-jpa'Copy to Clipboard Copied! Toggle word wrap Toggle overflow
1.3.2. quarkus-security-jpa 依存関係の確認 リンクのコピーリンクがクリップボードにコピーされました!
上記のいずれかのコマンドを実行して Maven プロジェクトを作成した後、quarkus-security-jpa 依存関係がプロジェクトビルド XML ファイルに追加されたことを確認します。
quarkus-security-jpaエクステンションを確認するには、以下の設定を確認します。Maven を使用する場合:
<dependency> <groupId>io.quarkus</groupId> <artifactId>quarkus-security-jpa</artifactId> </dependency><dependency> <groupId>io.quarkus</groupId> <artifactId>quarkus-security-jpa</artifactId> </dependency>Copy to Clipboard Copied! Toggle word wrap Toggle overflow Gradle を使用する場合:
implementation("io.quarkus:quarkus-security-jpa")implementation("io.quarkus:quarkus-security-jpa")Copy to Clipboard Copied! Toggle word wrap Toggle overflow
1.4. アプリケーションの作成 リンクのコピーリンクがクリップボードにコピーされました!
次のいずれかの方法を使用して、API エンドポイントを保護し、アプリケーションにアクセスできるユーザーを決定します。
すべてのユーザーがアプリケーションにアクセスできるように、
/api/publicエンドポイントを実装します。次のコードスニペットに示すように、通常の Jakarta REST リソースを Java ソースコードに追加します。src/main/java/org/acme/security/jpa/PublicResource.javaCopy to Clipboard Copied! Toggle word wrap Toggle overflow 管理者ロールを持つユーザーのみがアクセスできる /api/admin エンドポイントを実装します。
/api/adminエンドポイントのソースコードも同様ですが、代わりに@RolesAllowedアノテーションを使用して、adminロールが付与されたユーザーのみがエンドポイントにアクセスできるようにします。以下の@RolesAllowedアノテーションを使用して Jakarta REST リソースを追加します。src/main/java/org/acme/security/jpa/AdminResource.javaCopy to Clipboard Copied! Toggle word wrap Toggle overflow userロールを持つユーザーのみがアクセスできる/api/users/meエンドポイントを実装します。SecurityContextを使用して、現在認証されているPrincipalユーザーにアクセスし、そのユーザー名を返します。これらはすべてデータベースから取得されます。src/main/java/org/acme/security/jpa/UserResource.javaCopy to Clipboard Copied! Toggle word wrap Toggle overflow
1.5. ユーザーエンティティーの定義 リンクのコピーリンクがクリップボードにコピーされました!
次のアノテーションを user エンティティーに追加して、セキュリティー情報をモデルに保存する方法を指定します。
src/main/java/org/acme/security/jpa/User.java
quarkus-security-jpa エクステンションは、単一のエンティティーに @UserDefinition アノテーションが付けられている場合にのみ初期化されます。
- 1
@UserDefinitionアノテーションは、単一のエンティティー (通常の Hibernate ORM エンティティーまたは Hibernate ORM with Panache エンティティー) に存在する必要があります。- 2
- ユーザー名に使用されるフィールドを示します。
- 3
- パスワードに使用されるフィールドを示します。デフォルトでは、bcrypt でハッシュされたパスワードを使用します。プレーンテキストまたはカスタムパスワードを使用するように設定できます。
- 4
- ターゲットプリンシパル表現属性に追加されたロールのコンマ区切りリストを示します。
- 5
- 適切な bcrypt ハッシュを使用してパスワードをハッシュ化して、ユーザーを追加できます。
必ず Panache と PostgreSQL JDBC ドライバーをセットアップしてください。詳細は Setting up and configuring Hibernate ORM with Panache を参照してください。
1.6. アプリケーションの設定 リンクのコピーリンクがクリップボードにコピーされました!
quarkus.http.auth.basicプロパティーをtrueに設定して、組み込みの Quarkus Basic 認証 メカニズムを有効にします。quarkus.http.auth.basic=true注記アクセスをセキュアにする必要があり、他の認証メカニズムが有効になっていない場合は、Quarkus に組み込まれている Basic 認証 がフォールバック認証メカニズムになります。したがって、このチュートリアルでは、プロパティー
quarkus.http.auth.basicをtrueに設定する必要はありません。quarkus-security-jpaエクステンションがデータベースにアクセスできるように、src/main/resources/application.propertiesファイルで少なくとも 1 つのデータソースを設定します。以下に例を示します。src/main/resources/application.properties
Copy to Clipboard Copied! Toggle word wrap Toggle overflow プロファイル接頭辞の
%prod.を追加することで、本番モードで実行されているアプリケーションによってのみデータソースプロパティーが監視されるようになります。-
ユーザーとロールを使用してデータベースを初期化するには、次のコードスニペットに示すように、
Startupクラスを実装します。
src/main/java/org/acme/security/jpa/Startup.java
上記の例は、指定されたデータベースによってアプリケーションがどのように保護されて ID が提供されるかを示しています。
実稼働環境では、プレーンテキストのパスワードを保存しないでください。そのため、quarkus-security-jpa はデフォルトで bcrypt でハッシュされたパスワードを使用します。
1.7. Dev Services for PostgreSQL を使用した開発モードでのアプリケーションのテスト リンクのコピーリンクがクリップボードにコピーされました!
アプリケーションを本番モードで実行する前に、Dev Services for PostgreSQL を使用して、JVM モードとネイティブモードでアプリケーションの結合テストを完了します。
まず、テストプロジェクトに次の依存関係を追加します。
Maven を使用する場合:
<dependency> <groupId>io.rest-assured</groupId> <artifactId>rest-assured</artifactId> <scope>test</scope> </dependency><dependency> <groupId>io.rest-assured</groupId> <artifactId>rest-assured</artifactId> <scope>test</scope> </dependency>Copy to Clipboard Copied! Toggle word wrap Toggle overflow Gradle を使用する場合:
testImplementation("io.rest-assured:rest-assured")testImplementation("io.rest-assured:rest-assured")Copy to Clipboard Copied! Toggle word wrap Toggle overflow
アプリケーションを開発モードで実行するには、以下を実行します。
Quarkus CLI を使用する場合:
quarkus dev
quarkus devCopy to Clipboard Copied! Toggle word wrap Toggle overflow Maven を使用する場合:
./mvnw quarkus:dev
./mvnw quarkus:devCopy to Clipboard Copied! Toggle word wrap Toggle overflow Gradle を使用する場合:
./gradlew --console=plain quarkusDev
./gradlew --console=plain quarkusDevCopy to Clipboard Copied! Toggle word wrap Toggle overflow
このシナリオでは、Dev Services for PostgreSQL が PostgreSQL テストコンテナーを起動して設定します。Podman または Docker のいずれかがコンピューターにインストールされていることを確認してください。
結合テストを記述するには、次のコードサンプルを使用します。
src/test/java/org/acme/security/jpa/JpaSecurityRealmTest.java
このコードサンプルからわかるように、テストコードからテストコンテナーを起動する必要はありません。
これらのテストを実行するには、開発モードでアプリケーションを起動した後、コンソールに表示される Press [r] to resume testing オプションを選択します。
開発モードでアプリケーションを起動すると、Dev Services for PostgreSQL は PostgreSQL 開発モードコンテナーを起動して、アプリケーションの開発を開始できるようにします。アプリケーションの開発中に、継続的テスト 機能を使用してテストを個別に追加および実行できます。Dev Services for PostgreSQL は、開発モードコンテナーと競合しない別の PostgreSQL テストコンテナーを提供することで、開発中のテストをサポートします。
または、Maven を使用してこれらのテストを実行することもできます。
./mvnw test
./mvnw test
1.8. Curl またはブラウザーを使用した本番モードでのアプリケーションのテスト リンクのコピーリンクがクリップボードにコピーされました!
Curl またはブラウザーを使用してアプリケーションをテストするには、まず PostgreSQL サーバーを起動します。次に、JVM モードまたはネイティブモードのいずれかでアプリケーションをコンパイルして実行します。
1.8.1. PostgreSQL サーバーの起動 リンクのコピーリンクがクリップボードにコピーされました!
docker run --rm=true --name security-getting-started -e POSTGRES_USER=quarkus \
-e POSTGRES_PASSWORD=quarkus -e POSTGRES_DB=quarkus \
-p 5432:5432 postgres:17
docker run --rm=true --name security-getting-started -e POSTGRES_USER=quarkus \
-e POSTGRES_PASSWORD=quarkus -e POSTGRES_DB=quarkus \
-p 5432:5432 postgres:17
1.8.2. アプリケーションのコンパイルおよび実行 リンクのコピーリンクがクリップボードにコピーされました!
以下の方法のいずれかを使用して、Quarkus アプリケーションをコンパイルして実行します。
JVM モード
アプリケーションをコンパイルします。
Quarkus CLI を使用する場合:
quarkus build
quarkus buildCopy to Clipboard Copied! Toggle word wrap Toggle overflow Maven を使用する場合:
./mvnw install
./mvnw installCopy to Clipboard Copied! Toggle word wrap Toggle overflow Gradle を使用する場合:
./gradlew build
./gradlew buildCopy to Clipboard Copied! Toggle word wrap Toggle overflow
アプリケーションを実行します。
java -jar target/quarkus-app/quarkus-run.jar
java -jar target/quarkus-app/quarkus-run.jarCopy to Clipboard Copied! Toggle word wrap Toggle overflow
ネイティブモード
アプリケーションをコンパイルします。
Quarkus CLI を使用する場合:
quarkus build --native
quarkus build --nativeCopy to Clipboard Copied! Toggle word wrap Toggle overflow Maven を使用する場合:
./mvnw install -Dnative
./mvnw install -DnativeCopy to Clipboard Copied! Toggle word wrap Toggle overflow Gradle を使用する場合:
./gradlew build -Dquarkus.native.enabled=true
./gradlew build -Dquarkus.native.enabled=trueCopy to Clipboard Copied! Toggle word wrap Toggle overflow
アプリケーションを実行します。
./target/security-jpa-quickstart-1.0.0-SNAPSHOT-runner
./target/security-jpa-quickstart-1.0.0-SNAPSHOT-runnerCopy to Clipboard Copied! Toggle word wrap Toggle overflow
1.8.3. Curl を使用してアプリケーションのセキュリティーにアクセスしてテストする リンクのコピーリンクがクリップボードにコピーされました!
アプリケーションの実行中に、以下の Curl コマンドのいずれかを使用してエンドポイントにアクセスできます。
保護されたエンドポイントに匿名で接続します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 保護されたエンドポイントに匿名で接続します。
curl -i -X GET http://localhost:8080/api/admin HTTP/1.1 401 Unauthorized WWW-Authenticate: Basic
$ curl -i -X GET http://localhost:8080/api/admin HTTP/1.1 401 Unauthorized WWW-Authenticate: BasicCopy to Clipboard Copied! Toggle word wrap Toggle overflow 承認されたユーザーとして保護されたエンドポイントに接続します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
ブラウザーを使用して同じエンドポイント URL にアクセスすることもできます。
1.8.4. ブラウザーでアプリケーションのセキュリティーにアクセスしてテストする リンクのコピーリンクがクリップボードにコピーされました!
ブラウザーを使用して保護されたリソースに匿名で接続する場合は、Basic 認証フォームが表示され、認証情報の入力を求められます。
1.8.5. 結果 リンクのコピーリンクがクリップボードにコピーされました!
admin:admin などの承認済みユーザーの認証情報を提供すると、Jakarta Persistence セキュリティーエクステンションによりユーザーのロールが認証され、読み込まれます。admin ユーザーには、保護されたリソースにアクセスする権限が与えられます。
リソースが @RolesAllowed ("user") で保護されている場合は、次の例に示すように、admin ユーザーは、"user" ロールに割り当てられていないため、リソースにアクセスする権限がありません。
curl -i -X GET -u admin:admin http://localhost:8080/api/users/me HTTP/1.1 403 Forbidden
$ curl -i -X GET -u admin:admin http://localhost:8080/api/users/me
HTTP/1.1 403 Forbidden
最後に、user という名前のユーザーが承認され、セキュリティーコンテキストにはユーザー名などのプリンシパルの詳細が含まれます。
1.9. 次のステップ リンクのコピーリンクがクリップボードにコピーされました!
このガイドでは、セキュアな Quarkus アプリケーションを作成してテストする方法を説明しました。これを実現するために、Quarkus に組み込まれている Basic 認証 を Jakarta Persistence アイデンティティープロバイダーと統合しました。
このチュートリアルを完了したら、Quarkus のより高度なセキュリティーメカニズムを調べることを推奨します。次の資料では、OpenID Connect を使用して Quarkus エンドポイントへのシングルサインオンアクセスをセキュアに実行する方法を示しています。
1.10. 参考資料 リンクのコピーリンクがクリップボードにコピーされました!
第2章 Jakarta Persistence を使用した Quarkus Security リンクのコピーリンクがクリップボードにコピーされました!
Jakarta Persistence を使用してユーザーの ID を保存するようにアプリケーションを設定できます。
Quarkus は、JDBC アイデンティティープロバイダー に似た Jakarta Persistence アイデンティティープロバイダーを提供します。Jakarta Persistence は、ユーザー名とパスワードの認証情報を必要とする Basic および フォームベース の Quarkus Security メカニズムでの使用に適しています。
Jakarta Persistence IdentityProvider は SecurityIdentity インスタンスを作成します。ユーザー認証中、このインスタンスはアクセス要求の検証と承認に使用されます。
実際の例は、Basic 認証と Jakarta Persistence を使用したセキュリティーのスタートガイド のチュートリアルを参照してください。
2.1. Jakarta Persistence エンティティー仕様 リンクのコピーリンクがクリップボードにコピーされました!
Quarkus セキュリティーは、ユーザー名、パスワード、ロールを収集し、それらを Jakarta Persistence データベースエンティティーに保存するために Jakarta Persistence を統合します。
次の Jakarta Persistence エンティティー仕様は、Quarkus がデータベースからこの情報を取得できるように、ユーザーの情報を Jakarta Persistence エンティティーに保存し、正しくマッピングする方法を示しています。
-
Jakarta Persistence エンティティーには、
@UserDefinitionアノテーションが存在する必要があります。Panache による Hibernate ORM の簡略化 が使用されているかどうかは関係ありません。 -
@Usernameおよび@Passwordフィールドタイプは常にStringです。 -
@Rolesフィールドは、String、Collection<String>、またはCollection<X>のいずれかである必要があります。ここで、Xは、@RolesValueとしてアノテーションが付けられた単一のStringフィールドを持つエンティティークラスです。 -
各
Stringロール要素タイプは、コンマで区切られたロールのリストとして解析されます。
次の例は、user エンティティーにアノテーションを追加してセキュリティー情報を保存する方法を示しています。
quarkus-security-jpa エクステンションは、単一のエンティティーに @UserDefinition アノテーションが付けられている場合にのみ初期化されます。
- 1
- テーブル名。
userとして定義しないでください。これは、ほとんどのデータベースで制限されているキーワードです。 - 2
@UserDefinitionアノテーションは、単一のエンティティー (通常の Hibernate ORM エンティティーまたは Hibernate ORM with Panache エンティティー) に存在する必要があります。- 3
- ユーザー名に使用されるフィールドを示します。
- 4
- パスワードに使用されるフィールドを示します。デフォルトでは、
quarkus-security-jpaは bcrypt ハッシュパスワードを使用しますが、代わりにプレーンテキストまたはカスタムパスワードを設定することもできます。 - 5
- これは、ターゲットプリンシパル表現属性に追加されたロールのコンマ区切りリストを示します。
- 6
- この方法を使用すると、適切な
bcryptハッシュを使用してパスワードをハッシュ化し、ユーザーを追加できます。
2.2. ロールのストレージとしての Jakarta Persistence エンティティー リンクのコピーリンクがクリップボードにコピーされました!
次の例を使用して、別の Jakarta Persistence エンティティー内にロールを保存します。
この例では、ロールの保存とアクセスを示します。既存のユーザーを更新したり、新しいユーザーを作成したりするには、public List<Role> roles に @Cascade(CascadeType.ALL) をアノテーションするか、特定の CascadeType を選択します。
2.3. パスワードストレージおよびハッシュ リンクのコピーリンクがクリップボードにコピーされました!
Quarkus を使用してアプリケーションを開発する場合は、パスワードの保存とハッシュの管理方法を決定できます。Quarkus のデフォルトのパスワードとハッシュ設定をそのまま使用することも、手動でパスワードをハッシュすることもできます。
デフォルトオプションでは、パスワードは Modular Crypt Format (MCF) に基づいて bcrypt で保存およびハッシュされます。MCF を使用する場合は、ハッシュアルゴリズム、反復回数、および salt はハッシュ値の一部として保存されます。そのため、それらを保存するための専用の列は必要ありません。
暗号化において、salt とは、データ、パスワード、またはパスフレーズをハッシュする一方向関数への追加入力として使用されるランダムデータの名前です。
異なるアルゴリズムによってハッシュされ、データベースに保存されているパスワードを表すには、次の例に示すように、org.wildfly.security.password.PasswordProvider を実装するクラスを作成します。
次のスニペットは、SHA256 ハッシュアルゴリズムでハッシュされたパスワードを表すカスタムパスワードプロバイダーを設定する方法を示しています。
ハッシュ化されたパスワードをすばやく作成するには、String BcryptUtil.bcryptHash (String password) を使用します。デフォルトでは、ランダムな salt が作成され、反復 10 回分、ハッシュ化されます。このメソッドでは、使用される反復回数と salt の数を指定することもできます。
実稼働環境で実行されるアプリケーションの場合は、パスワードをプレーンテキストとして保存しないでください。
ただし、テスト環境で操作する場合は、@Password (PasswordType.CLEAR) アノテーションを使用してパスワードをプレーンテキストとして保存できます。
Hibernate マルチテナンシー がサポートされており、マルチテナンシーが有効な永続ユニットにユーザーエンティティーを保存できます。ただし、io.quarkus.hibernate.orm.runtime.tenant.TenantResolver が io.vertx.ext.web.RoutingContext にアクセスしてリクエストの詳細を解決する必要がある場合は、プロアクティブ認証を無効にする必要があります。プロアクティブ認証の詳細は、Quarkus の プロアクティブ認証 ガイドを参照してください。
🔒 ビルド時に固定: 設定プロパティーはビルド時に固定されます。他のすべての設定プロパティーは実行時にオーバーライドできます。
| 設定プロパティー | 型 | デフォルト |
|
🔒 ビルド時に修正 Hibernate ORM 永続ユニットを選択します。値の指定がない場合はデフォルトの永続ユニットが使用されます。
環境変数: | string |
|