セキュリティーの使用
概要
Red Hat build of Quarkus ドキュメントへのフィードバックの提供 リンクのコピーリンクがクリップボードにコピーされました!
エラーを報告したり、ドキュメントを改善したりするには、Red Hat Jira アカウントにログインし、課題を送信してください。Red Hat Jira アカウントをお持ちでない場合は、アカウントを作成するように求められます。
手順
- 次のリンクをクリックして チケットを作成します。
- Summary に課題の簡単な説明を入力します。
- Description に課題や機能拡張の詳細な説明を入力します。問題があるドキュメントのセクションへの URL も記載してください。
- Submit をクリックすると、課題が作成され、適切なドキュメントチームに転送されます。
多様性を受け入れるオープンソースの強化 リンクのコピーリンクがクリップボードにコピーされました!
Red Hat では、コード、ドキュメント、Web プロパティーにおける配慮に欠ける用語の置き換えに取り組んでいます。まずは、マスター (master)、スレーブ (slave)、ブラックリスト (blacklist)、ホワイトリスト (whitelist) の 4 つの用語の置き換えから始めます。この取り組みは膨大な作業を要するため、用語の置き換えは、今後の複数のリリースにわたって段階的に実施されます。詳細は、Red Hat CTO である Chris Wright のメッセージ をご覧ください。
第1章 Basic 認証と Jakarta Persistence を使用する Security のスタートガイド リンクのコピーリンクがクリップボードにコピーされました!
組み込みの 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
-
JAV_HOMEが適切に設定された状態でインストールされた JDK 17+ - Apache Maven 3.9.6
- オプションで使用する場合は Quarkus CLI
- ネイティブ実行可能ファイル (ネイティブコンテナービルドを使用する場合は Docker) をビルドする必要がある場合は、オプションで Mandrel または GraalVM がインストールされ、適切に設定されている
1.2. アプリケーションのビルド リンクのコピーリンクがクリップボードにコピーされました!
このチュートリアルでは、さまざまな認可ポリシーを示すエンドポイントを使用してアプリケーションを作成する詳細な手順を示します。
| Endpoint (エンドポイント) | 説明 |
|---|---|
|
| このエンドポイントは認証なしでアクセス可能で、匿名アクセスを使用できます。 |
|
|
ロールベースのアクセス制御 (RBAC) で保護されたこのエンドポイントには、 |
|
|
このエンドポイントも RBAC によって保護されており、 |
すべての例を確認するには、アーカイブ をダウンロードするか、Git リポジトリーのクローンを作成します。
git clone https://github.com/quarkusio/quarkus-quickstarts.git -b 3.8
git clone https://github.com/quarkusio/quarkus-quickstarts.git -b 3.8
このソリューションは security-jpa-quickstart ディレクトリー にあります。
1.3. Maven プロジェクトの作成および検証 リンクのコピーリンクがクリップボードにコピーされました!
Quarkus Security がセキュリティーソースを Jakarta Persistence エンティティーにマップできるようにするには、このチュートリアルの Maven プロジェクトに quarkus-security-jpa エクステンションが含まれていることを確認してください。
Hibernate ORM with Panache はユーザー ID を保存するために使用されますが、quarkus-security-jpa エクステンションを備えた Hibernate ORM を使用することもできます。
任意のデータベースコネクターライブラリーも追加する必要があります。このサンプルチュートリアルの手順では、アイデンティティーストアに PostgreSQL データベースを使用します。
1.3.1. Maven プロジェクトの作成 リンクのコピーリンクがクリップボードにコピーされました!
Security Jakarta Persistence エクステンションを使用して新しい Maven プロジェクトを作成したり、既存の Maven プロジェクトに拡張機能を追加したりできます。Hibernate ORM または Hibernate Reactive のいずれかを使用できます。
Jakarta Persistence エクステンションで新しい Maven プロジェクトを作成するには、以下のいずれかの手順を実行します。
- Hibernate ORM を使用して Maven プロジェクトを作成するには、次のコマンドを使用します。
Quarkus CLI を使用:
quarkus create app org.acme:security-jpa-quickstart \ --extension='security-jpa,jdbc-postgresql,resteasy-reactive,hibernate-orm-panache' \ --no-code cd security-jpa-quickstartquarkus create app org.acme:security-jpa-quickstart \ --extension='security-jpa,jdbc-postgresql,resteasy-reactive,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")。既存の 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 ソースコードに追加します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow 管理者ロールを持つユーザーのみがアクセスできる/api/admin エンドポイントを実装します。
/api/adminエンドポイントのソースコードも同様ですが、代わりに@RolesAllowedアノテーションを使用して、adminロールが付与されたユーザーのみがエンドポイントにアクセスできるようにします。以下の@RolesAllowedアノテーションを使用して Jakarta REST リソースを追加します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow userロールを持つユーザーのみがアクセスできる/api/users/meエンドポイントを実装します。SecurityContextを使用して、現在認証されているPrincipalユーザーにアクセスし、そのユーザー名を返します。これらはすべてデータベースから取得されます。Copy to Clipboard Copied! Toggle word wrap Toggle overflow
1.5. ユーザーエンティティーの定義 リンクのコピーリンクがクリップボードにコピーされました!
-
以下のコードスニペットで説明されているように、
userエンティティーにアノテーションを追加することで、セキュリティー情報をモデルに保存する方法を説明できるようになりました。
quarkus-security-jpa エクステンションは、単一のエンティティーに @UserDefinition アノテーションが付けられている場合にのみ初期化されます。
- 1
@UserDefinitionアノテーションは、通常の Hibernate ORM エンティティーまたは Panache エンティティーを含む Hibernate ORM のいずれかの単一のエンティティーに存在する必要があります。- 2
- ユーザー名に使用されるフィールドを示します。
- 3
- パスワードに使用されるフィールドを示します。デフォルトでは、bcrypt でハッシュされたパスワードを使用します。プレーンテキストまたはカスタムパスワードを使用するように設定できます。
- 4
- ターゲットプリンシパル表現属性に追加されたロールのコンマ区切りリストを示します。
- 5
- 適切な bcrypt ハッシュを使用してパスワードをハッシュ化して、ユーザーを追加できます。
Panache と PostgreSQL JDBC ドライバーの設定を忘れないでください。詳細は Panache を使用した Hibernate ORM の設定 を参照してください。
1.6. アプリケーションの設定 リンクのコピーリンクがクリップボードにコピーされました!
quarkus.http.auth.basicプロパティーをtrueに設定して、組み込みの Quarkus Basic 認証 メカニズムを有効にします。quarkus.http.auth.basic=true注記アクセスをセキュアにする必要があり、他の認証メカニズムが有効になっていない場合、Quarkus に組み込まれている Basic 認証 がフォールバック認証メカニズムになります。したがって、このチュートリアルでは、プロパティー
quarkus.http.auth.basicをtrueに設定する必要はありません。quarkus-security-jpaエクステンションがデータベースにアクセスできるように、application.propertiesファイルで少なくとも 1 つのデータソースを設定します。以下に例を示します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow -
ユーザーとロールを使用してデータベースを初期化するには、次のコードスニペットに示すように、
Startupクラスを実装します。
上記の例は、指定されたデータベースによってアプリケーションがどのように保護されて ID が提供されるかを示しています。
実稼働環境では、プレーンテキストのパスワードを保存しないでください。そのため、quarkus-security-jpa はデフォルトで bcrypt でハッシュされたパスワードを使用します。
1.7. PostgreSQL 用 Dev Services を使用したアプリケーションのテスト リンクのコピーリンクがクリップボードにコピーされました!
アプリケーションを実稼働モードで実行する前に、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 - アプリケーションを dev モードで実行するには、以下を実行します。
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 -
次のプロパティー設定は、PostgreSQL テストを本番 (
prod) モードでのみ実行できるようにする方法を示しています。このシナリオでは、Dev Services for PostgreSQLがPostgreSQLテストコンテナーを起動して設定します。
-
%prod.プロファイル接頭辞を追加すると、データソースプロパティーはDev Services for PostgreSQLには表示されなくなり、運用モードで実行されているアプリケーションによってのみ監視されます。 - 統合テストを記述するには、次のコードサンプルを使用します。
このコードサンプルからわかるように、テストコードからテストコンテナーを起動する必要はありません。
開発モードでアプリケーションを起動すると、Dev Services for PostgreSQL は PostgreSQL 開発モードコンテナーを起動して、アプリケーションの開発を開始できるようにします。アプリケーションの開発中に、継続テスト 機能を使用してテストを個別に追加および実行できます。Dev Services for PostgreSQL は、開発モードコンテナーと競合しない別の PostgreSQL テストコンテナーを提供することで、開発中のテストをサポートします。
1.7.1. curl またはブラウザーを使用したアプリケーションのテスト リンクのコピーリンクがクリップボードにコピーされました!
- 次の例を使用して、PostgreSQL サーバーを起動します。
docker run --rm=true --name security-getting-started -e POSTGRES_USER=quarkus \
-e POSTGRES_PASSWORD=quarkus -e POSTGRES_DB=elytron_security_jpa \
-p 5432:5432 postgres:14.1
docker run --rm=true --name security-getting-started -e POSTGRES_USER=quarkus \
-e POSTGRES_PASSWORD=quarkus -e POSTGRES_DB=elytron_security_jpa \
-p 5432:5432 postgres:14.1
1.7.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.package.type=native
./gradlew build -Dquarkus.package.type=nativeCopy 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.7.3. アプリケーションのセキュリティーへのアクセスおよびテスト リンクのコピーリンクがクリップボードにコピーされました!
アプリケーションの実行中に、以下の Curl コマンドのいずれかを使用してエンドポイントにアクセスできます。
保護されたエンドポイントに匿名で接続します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 保護されたエンドポイントに匿名で接続します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 承認されたユーザーとして保護されたエンドポイントに接続します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
ブラウザーを使用して同じエンドポイント URL にアクセスすることもできます。
ブラウザーを使用して保護されたリソースに匿名で接続する場合は、Basic 認証フォームが表示され、認証情報の入力を求められます。
1.7.4. Results リンクのコピーリンクがクリップボードにコピーされました!
admin:admin などの承認済みユーザーの認証情報を提供すると、Jakarta Persistence セキュリティーエクステンションによってユーザーのロールが認証され、読み込まれます。admin ユーザーには、保護されたリソースにアクセスする権限が与えられます。
リソースが @RolesAllowed ("user") で保護されている場合、次の例に示すように、admin ユーザーは、"user" ロールに割り当てられていないため、リソースにアクセスする権限がありません。
最後に、user という名前の ユーザー が承認され、セキュリティーコンテキストにはユーザー名などのプリンシパルの詳細が含まれます。
1.8. 次回予告 リンクのコピーリンクがクリップボードにコピーされました!
安全な Quarkus アプリケーションを作成し、テストする方法を学習しました。これは、Quarkus に組み込まれている Basic 認証 を Jakarta Persistence アイデンティティープロバイダーと統合することによって実現されました。
このチュートリアルを完了すると、Quarkus のより高度なセキュリティーメカニズムを使用することができます。次の情報は、Quarkus エンドポイントへの安全なシングルサインオンアクセスに OpenID Connect を使用する方法を示しています。
1.9. 参考資料 リンクのコピーリンクがクリップボードにコピーされました!
第2章 Jakarta Persistence を備えた Quarkus Security リンクのコピーリンクがクリップボードにコピーされました!
Jakarta Persistence を使用してユーザーの ID を保存するようにアプリケーションを設定できます。
Quarkus は、JDBC アイデンティティープロバイダー に似た Jakarta Persistence アイデンティティープロバイダーを提供します。Jakarta Persistence は、ユーザー名とパスワードの認証情報を必要とする Basic および フォームベース の Quarkus セキュリティーメカニズムでの使用に適しています。
Jakarta Persistence IdentityProvider は SecurityIdentity インスタンスを作成します。ユーザー認証中、このインスタンスはアクセス要求の検証と承認に使用されます。
実際の例は、Basic 認証と Jakarta Persistence を使用したセキュリティーの開始チュートリアル を参照してください。
2.1. Jakarta Persistence エンティティー仕様 リンクのコピーリンクがクリップボードにコピーされました!
Quarkus セキュリティーは、ユーザー名、パスワード、ロールを収集し、それらを Jakarta Persistence データベースエンティティーに保存するために Jakarta Persistence を統合します。
次の Jakarta Persistence エンティティー仕様は、Quarkus がデータベースからこの情報を取得できるように、ユーザーの情報を Jakarta Persistence エンティティーに保存し、正しくマッピングする方法を示しています。
-
Panache を使用した簡略化された Hibernate ORM が使用されているかどうかに関係なく、
@UserDefinitionアノテーションは Jakarta Persistence エンティティーに存在する必要があります。 -
@Usernameおよび@Passwordフィールドタイプは常にStringです。 -
@Rolesフィールドは、String、Collection<String>、またはCollection<X>のいずれかである必要があります。ここで、Xは、@RolesValueとしてアノテーションが付けられた単一のStringフィールドを持つエンティティークラスです。 -
各
Stringロール要素タイプは、コンマで区切られたロールのリストとして解析されます。
次の例は、user エンティティーにアノテーションを追加してセキュリティー情報を保存する方法を示しています。
quarkus-security-jpa エクステンションは、単一のエンティティーに @UserDefinition アノテーションが付けられている場合にのみ初期化されます。
- 1
@UserDefinitionアノテーションは、通常の Hibernate ORM エンティティーまたは Panache エンティティーを含む Hibernate ORM のいずれかの単一のエンティティーに存在する必要があります。- 2
- ユーザー名に使用されるフィールドを示します。
- 3
- パスワードに使用されるフィールドを示します。デフォルトでは、
quarkus-security-jpaは bcrypt ハッシュパスワードを使用しますが、代わりにプレーンテキストまたはカスタムパスワードを設定することもできます。 - 4
- これは、ターゲットプリンシパル表現属性に追加されたロールのコンマ区切りリストを示します。
- 5
- この方法を使用すると、適切な
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 |
|