Quarkus Security overview
Quarkus Securityでは、開発者がQuarkusアプリケーションの商用品質のセキュリティーを構築するためのアーキテクチャ、複数の認証および認可メカニズム、その他のツールを提供しているフレームワークです。
Quarkus セキュリティー入門
Quarkusアプリケーションにセキュリティを組み込む前に、概要情報を確認し、Quarkusのセキュリティアーキテクチャと、Quarkusがサポートするさまざまな認証および認可メカニズムについて学んでください。
Quarkusのセキュリティに入門するには、まず、Quarkusに組み込まれている Basic HTTP認証 とJPA IDプロバイダーを組み合わせて、ロールベースのアクセス制御(RBAC)を有効にすることをお勧めします。 QuarkusアプリケーションのBasic認証による保護 チュートリアルのステップを完了してください。QuarkusアプリケーションのBasic HTTP認証による保護が出来たら、OpenID Connect(OIDC)認証など、より高度な認証メカニズムを追加して、セキュリティをさらに高めることができます。
セキュリティ・アーキテクチャ
HttpAuthenticationMechanism インターフェースは、QuarkusでHTTPアプリケーションを保護するための主要なエントリメカニズムです。
Quarkus Securityは、 HttpAuthenticationMechanism を使用してHTTPリクエストから認証クレデンシャルを抽出し、 IdentityProvider に委任して、認証クレデンシャルを SecurityIdentity に変換します。たとえば、クレデンシャルは、 Authorization ヘッダー、クライアントの HTTPS 証明書、または Cookie から取得することができます。
IdentityProvider は、認証クレデンシャルを検証し、ユーザー名、ロール、元の認証クレデンシャル、およびその他の属性を持つ SecurityIdentity にマップします。
認証済みリソースごとに、 SecurityIdentity インスタンスを注入して、認証済みの ID 情報を取得することができます。
他の文脈では、例えばJAX-RSの SecurityContext 、JSON Web Tokens(JWT)の JsonWebToken など、同じ情報またはその一部を他の並列表現にすることが可能です。
認証メカニズム
Quarkusは複数の認証メカニズムをサポートしています。
HTTPのベーシック認証とフォーム認証
Basic HTTP認証 と Form HTTP認証 は、Quarkusでサポートされているコアな認証メカニズムです。
WebAuthn 認証
WebAuthn は、パスワードに代わる認証メカニズムです。新しいユーザーを登録したり、ログインしたりするサービスを書くときに、パスワードを要求する代わりに、パスワードを置き換えるWebAuthnを使用することができます。詳しくは、 WebAuthn認証メカニズムを使用したQuarkusアプリケーションの保護 を参照してください。
Mutual TLS (mTLS) 認証
Quarkusは相互TLS(mTLS)認証を提供するので、X.509証明書に基づいてユーザーを認証することができます。詳細については、 相互TLS認証 を参照してください。
OpenID Connect 認証
OpenID Connect(OIDC)は、OAuth 2.0プロトコルの上で動作するIDレイヤーです。OIDCは、クライアントアプリケーションが、OIDCプロバイダーによって実行された認証に基づいてユーザーの身元を確認し、そのユーザーに関する基本的な情報を取得することを可能にします。
Quarkus quarkus-oidc エクステンションは、ベアラートークンと認可コードフロー認証メカニズムをサポートする、リアクティブで相互運用可能なマルチテナント対応OIDCアダプタを提供します。
Bearer Token メカニズムは、HTTP Authorization ヘッダーからトークンを抽出します。認可コードフローメカニズムは、ユーザーを OIDC プロバイダーにリダイレクトし、ユーザーの ID を認証します。ユーザーがQuarkusにリダイレクトされた後、このメカニズムは、ID、アクセス、リフレッシュトークンに対して付与されたコードを交換することで、認証プロセスを完了します。
リフレッシュ可能な JSON Web Key (JWK) セットを使用して ID とアクセス JWT トークンを検証することも、リモートでイントロスペクトすることもできます。 ただし、不透明な(バイナリの)トークンはリモートでのみイントロスペクトできます。
|
Quarkus OIDCエクステンションを使用することで、ベアラートークンと認可コードフローの両方のメカニズムで SmallRye JWT を使用して、JWTトークンをMicroProfile JWT |
OIDC 認証のための追加の Quarkus リソース
Quarkusアプリケーションの保護のために使用できるOIDC認証および認可方法の詳細については、以下の詳細なリソースを参照してください:
| OIDC トピック | Quarkus の情報リソース |
|---|---|
ベアラートークン認証メカニズム |
|
認可コードフロー認証メカニズム |
|
ベアラートークンまたは認可コード・フロー・メカニズムをサポートする複数のテナント |
|
Keycloak を使用した認可の一元化 |
|
Keycloak のプログラムによる設定 |
|
OpenID Connect クライアントとフィルター
quarkus-oidc-client エクステンションは、以下のトークングラントをサポートする OpenID Connect および OAuth2 プロバイダからアクセストークンを取得し、リフレッシュするための OidcClient を提供します:
* client-credentials
* password
* refresh_token
quarkus-oidc-client-filter エクステンションは、 quarkus-oidc-client エクステンションを必要とし、JAX-RS OidcClientRequestFilter を提供します。これは、 OidcClient で取得したアクセストークンを HTTP Authorization ヘッダの Bearer スキーム値として設定するものです。このフィルタは、現在のQuarkusエンドポイントに注入されるMP RestClient実装に登録できますが、このサービスエンドポイントの認証要件には関係しません。たとえば、公開エンドポイントにすることも、mTLSで保護することもできます。
|
このシナリオでは、Quarkus OpenID Connect アダプターを使用して Quarkus エンドポイントを保護する必要はありません。 |
quarkus-oidc-client-filter エクステンションは、 quarkus-oidc-client エクステンションを必要とし、JAX-RS OidcClientRequestFilter を提供します。これは、OpenID Connect ベアラーまたは 認可コードフローアクセス トークンを HTTP Authorization ヘッダーの Bearer スキーム値として設定します。このフィルターは、現在の Quarkus エンドポイントに挿入された MP RestClient 実装に登録できます。これは、Quarkus OpenID Connect アダプターを使用して保護する必要があります。 このフィルターを使用して、アクセス トークンを下流のサービスに伝搬できます。
SmallRye JWT 認証
quarkus-smallrye-jwt エクステンションは、MicroProfile JSON Web Token (JWT) 1.2.1 の実装と、署名および暗号化された JWT トークンを検証する複数のオプションを提供し、それらを org.eclipse.microprofile.jwt.JsonWebToken として表します。
quarkus-smallrye-jwt は、 quarkus-oidc ベアラートークン認証メカニズムの代替となるもので、PEMキーまたはリフレッシュ可能な JWK キーセットを使用して、 JWT トークンだけを検証します。 quarkus-smallrye-jwt は、JWT生成APIも提供しており、これを使用して、 signed あるいは inner-signed 、 encrypted JWT トークンを簡単に作成できます。
詳細については、SmallRye JWTロールベースアクセスコントロールの使用 を参照してください。
OAuth2 認証
quarkus-elytron-security-oauth2 は quarkus-oidc ベアラートークン認証メカニズムに対する別の選択肢を提供するものです。 quarkus-elytron-security-oauth2 は Elytron をベースにしており、主に不透明なトークンをリモートでイントロスペクトするためのものです。
詳細は OAuth2 の使用 を参照ください。
OpenID Connect、SmallRye JWT、OAuth2 認証メカニズムからの選択
Quarkusアプリケーションを保護するためにどの認証メカニズムを使用するかを決定する際に、次の情報を使用してください:
-
quarkus-oidcは、KeycloakのようなOpenID Connectプロバイダを必要とします。このプロバイダは、ベアラートークンの検証や、認可コードフローによるエンドユーザの認証に使用できます。 どちらの場合も、quarkus-oidcは指定されたOpenID Connectプロバイダへの接続が必要です。 -
ユーザー認証に認可コードフローが必要な場合、または複数のテナントをサポートする必要がある場合は、
quarkus-oidcを使用してください。quarkus-oidcは、認可コードフローとベアラアクセストークンの両方を使用してユーザー情報を要求することもできます。 -
ベアラートークンを検証する必要がある場合は、
quarkus-oidc,quarkus-smallrye-jwt, またはquarkus-elytron-security-oauth2を使用してください。 -
ベアラートークンがJWT形式の場合、3つのエクステンションのいずれかを使用することができます。
quarkus-oidcとquarkus-smallrye-jwtは、OpenID Connect プロバイダがキーをローテーションする際に JsonWebKey (JWK) セットを更新することをサポートしています。したがって、リモートトークンイントロスペクションを避ける必要がある場合やプロバイダがサポートしていない場合は、JWTトークンの検証にquarkus-oidcまたはquarkus-smallrye-jwtを使用します。 -
JWT トークンをリモートでイントロスペクションする必要がある場合は、
quarkus-oidcまたはquarkus-elytron-security-oauth2のいずれかを使用できます。これらはリモート イントロスペクションを使用した不透明なトークンまたはバイナリトークンの検証をサポートしているためです。quarkus-smallrye-jwtは、不透明なトークンまたは JWT トークンの両方のリモートイントロスペクションをサポートしていませんが、その代わりに、通常は OpenID Connect プロバイダーから取得されるローカルで利用可能なキーに依存します。 -
quarkus-oidcとquarkus-smallrye-jwtは、エンドポイントのコードに JWT と opaque トークンを注入することをサポートしています。注入されたJWTトークンは、ユーザーに関するより多くの情報を提供します。すべてのエクステンションは、Principalとして注入されたトークンを持つことができます。 -
quarkus-smallrye-jwtはquarkus-oidcよりも多くの鍵フォーマットをサポートしています。quarkus-oidcは JWK セットの一部である JWK 形式の鍵のみを使用するのに対し、quarkus-smallrye-jwtは PEM 鍵をサポートしています。 -
quarkus-smallrye-jwtは、ローカルで署名されたトークン、内部で署名および暗号化されたトークン、暗号化されたトークンを扱います。quarkus-oidcやquarkus-elytron-security-oauth2もこのようなトークンを検証することもできますが、不透明なトークンとして扱い、リモートのイントロスペクションを通じて検証します。 -
不透明トークンや JWT トークンのリモートイントロスペクションのための軽量なライブラリーが必要な場合は、
quarkus-elytron-security-oauth2を使用してください。
|
不透明トークンかJWTトークンのどちらを使うかは、アーキテクチャ上の考慮事項によって決定されます。不透明トークンは、JWTトークンよりもはるかに短い傾向がありますが、トークンに関連する状態の大部分をプロバイダ・データベースに保持することが必要です。不透明トークンは、事実上データベース・ポインタです。JWTトークンは不透明トークンよりもかなり長いですが、プロバイダはトークン関連状態のほとんどをトークンクレームとして保存し、署名または暗号化することにより、クライアントに保存を事実上委任しています。 |
各認証メカニズムのオプションの概要は、次の表のとおりです:
| quarkus-oidc | quarkus-smallrye-jwt | quarkus-elytron-security-oauth2 | |
|---|---|---|---|
ベアラーJWTの検証が必要 |
ローカル検証もしくはイントロスペクション |
ローカル検証 |
イントロスペクション |
ベアラー不透明Tokenの検証が必要 |
イントロスペクション |
不可 |
イントロスペクション |
JWTトークンを検証するための |
可 |
可 |
不可 |
トークンを |
可 |
可 |
可 |
MP JSON Web Token(JWT)としてJWTを注入 |
可 |
不可 |
認可コードフロー |
可 |
不可 |
不可 |
マルチテナンシー |
可 |
不可 |
不可 |
User info サポート |
可 |
不可 |
不可 |
PEM キーフォーマットサポート |
不可 |
可 |
不可 |
SecretKey のサポート |
不可 |
JSON Web Key (JWK) 形式 |
不可 |
内部署名付き暗号化トークン、または暗号化トークン |
イントロスペクション |
ローカル検証 |
イントロスペクション |
カスタムトークン検証 |
不可 |
注入された JWT パーサーを使用 |
不可 |
JWTをCookieとして受入 |
アイデンティティ・プロバイダー
JPA IdentityProvider は、 SecurityIdentity インスタンスを作成します。このインスタンスは、ユーザー認証時に使用され、アクセス要求の確認と認可を行い、Quarkus アプリケーションを保護します。
IdentityProvider は、 HttpAuthenticationMechanism から提供された認証クレデンシャルを、 SecurityIdentity インスタンスに変換します。
一部のエクステンション、たとえば、 OIDC 、 OAuth2 、 SmallRye JWT は、サポートされる認証フローに固有のインライン IdentityProvider 実装を持ちます。たとえば、 quarkus-oidc は、トークンを SecurityIdentity インスタンスに変換するために、独自の IdentityProvider を使用します。
Basic または Form HTTPベース認証を使用する場合、ユーザー名とパスワードを SecurityIdentity インスタンスに変換できる IdentityProvider インスタンスを追加する必要があります。
-
BasicまたはFormHTTPベース認証の詳細については、次のリソースを参照してください:
認可
Quarkusは、ロールベースのアクセスコントロール(RBAC)もサポートしています。RBACとQuarkusのその他の認可オプションの詳細については、 セキュリティ認可 を参照してください。
Quarkus Securityのカスタマイズ
Quarkus Securityは、高度にカスタマイズ可能です。Quarkusの以下のコアセキュリティコンポーネントをカスタマイズすることができます:
-
HttpAuthenticationMechanism -
IdentityProvider -
SecurityidentityAugmentor
リアクティブセキュリティを含むQuarkus Securityのカスタマイズ、およびセキュリティプロバイダーの登録方法の詳細については、 セキュリティのカスタマイズ を参照してください。
認証メカニズムの組み合わせ
ユーザ認証情報が異なるソースから提供される場合、認証メカニズムを組み合わせることができます。
例えば、組み込みの Basic および quarkus-oidc Bearer 認証メカニズムを組み合わせることができます。
|
|
パス固有認証メカニズム
次の設定例は、あるリクエストパスに対して、選択可能な単一の認証メカニズムを強制する方法を示しています:
quarkus.http.auth.permission.basic-or-bearer.paths=/service
quarkus.http.auth.permission.basic-or-bearer.policy=authenticated
quarkus.http.auth.permission.basic.paths=/basic-only
quarkus.http.auth.permission.basic.policy=authenticated
quarkus.http.auth.permission.basic.auth-mechanism=basic
quarkus.http.auth.permission.bearer.paths=/bearer-only
quarkus.http.auth.permission.bearer.policy=authenticated
quarkus.http.auth.permission.bearer.auth-mechanism=bearer
auth-mechanism プロパティの値が、 HttpAuthenticationMechanism がサポートする認証スキーム(例えば、 basic 、 bearer 、 form )と一致しているようにして下さい。
プロアクティブ認証
デフォルトでは、Quarkusはプロアクティブ認証を行います。つまり、ターゲットページが認証を必要としているかどうかにかかわらず、クレデンシャルを持つすべての着信リクエストが認証されます。詳細については、 プロアクティブ認証 を参照してください。
SSL/TLSによるセキュアな接続
For more information about how Quarkus supports secure connections with SSL/TLS, see the xref:http-reference.adoc#ssl[HTTP reference] information.
クロスオリジンリソース共有
Quarkusアプリケーションを別のドメインで実行されている別のアプリケーションからアクセスできるようにするには、CORS(Cross-Origin Resource Sharing)を設定する必要があります。 Quarkusが提供するCORSフィルターの詳細については、 HTTPリファレンス 情報を参照してください。
Cross-site Request Forgery (CSRF) 対策
Quarkus Securityでは、 Cross-Site Request Forgery 攻撃からアプリケーションを保護するRESTEasy Reactiveフィルタを提供しています。 詳細については、 クロスサイトリクエストフォージェリ対策 を参照してください。
SameSite クッキー
Quarkusのエンドポイントが設定するCookieのいずれにも、 SameSite Cookieプロパティを追加することができます。詳細については、 SameSite cookies を参照してください。
シークレットエンジン
シークレットエンジンは、データを保存、生成、暗号化するコンポーネントです。
Quarkusは、HashiCorp Vaultを包括的にサポートしています。詳細については、 QuarkusとHashiCorp Vault のドキュメントを参照してください。
セキュア・シリアライゼーション
Quarkus SecurityアーキテクチャにRESTEasy ReactiveとJacksonが含まれている場合、Quarkusでは、設定されたセキュリティに基づいて、JSONシリアライズに含まれるフィールドを制限できます。詳細については、 RESTEasy Reactiveを使用したRESTサービスの作成 を参照してください。
自動生成されたリソースをREST Data with Panacheで保護
REST Data with Panache エクステンションを使用してリソースを自動生成している場合でも、パッケージ javax.annotation.security 内の Security アノテーションを使用することができます。詳しくは、 自動生成されたリソースの保護 を参照してください。
National Vulnerability Database
Quarkusのタグのほとんどは、米国の National Vulnerability Database (NVD)にCommon Platform Enumeration(CPE)名フォーマットで登録されています。登録されたQuarkusのCPE名を表示するには、 この検索クエリ を使用します。
NVEデータベースがQuarkusタグに対してCVEフラグを立てた場合、CVEの詳細を提供するリンクが所定のCPE名エントリに追加されます。
NVD CPEチームは定期的にリストを更新していますが、誤検出が発生した場合は、 quarkusio リポジトリにissueを作成して詳細を報告してください。
Maven OWASP Dependency checkプラグイン を使用することで、NVDフィードを使用してアプリケーションビルド時に脆弱性を検出することができます。
Quarkus MavenプロジェクトにOWASP Dependency checkプラグインを追加するには、 pom.xml ファイルに次のXML設定を追加します:
<plugin>
<groupId>org.owasp</groupId>
<artifactId>dependency-check-maven</artifactId>
<version>${owasp-dependency-check-plugin.version}</version>
</plugin>
|
|
次に、以下のようにプラグインを設定します:
<plugin>
<groupId>org.owasp</groupId>
<artifactId>dependency-check-maven</artifactId>
<version>${owasp-dependency-check-plugin.version}</version>
<configuration>
<!-- Fail only when detecting High Vulnerability issues -->
<failBuildOnCVSS>7</failBuildOnCVSS>
<suppressionFiles>
<suppressionFile>${project.basedir}/dependency-cpe-suppression.xml</suppressionFile>
</suppressionFiles>
</configuration>
</plugin>
比較的深刻でない問題を検出するには、次のコードサンプルで示すように、 failBuildOnCVSS の値を調整して誤検出を抑制してください:
<?xml version="1.0" encoding="UTF-8"?>
<suppressions xmlns="https://jeremylong.github.io/DependencyCheck/dependency-suppression.1.2.xsd">
<!--
This is a CPE suppression file for the maven dependency check plugin.
Each CPE that is found by error (false positive) needs to be suppressed for a specific jar using its' GAV.
See https://jeremylong.github.io/DependencyCheck/general/suppression.html
-->
<suppress>
<notes>
<![CDATA[
Suppress the false positive CPE for netty-tcnative-classes to netty
]]>
</notes>
<gav regex="true">^io\.netty:netty-tcnative-classes.*:.*$</gav>
<cpe>cpe:/a:netty:netty</cpe>
</suppress>
<suppress>
<notes>
<![CDATA[
Suppress the false positive CPE for Quarkus Mutiny to mutiny:mutiny
]]>
</notes>
<gav regex="true">^io\.quarkus:quarkus-mutiny.*:.*$</gav>
<cpe>cpe:/a:mutiny:mutiny</cpe>
</suppress>
<suppress>
<notes>
<![CDATA[
Suppress the false positive CPE for Smallrye Mutiny to mutiny:mutiny
]]>
</notes>
<gav regex="true">^io\.smallrye.reactive:mutiny.*:.*$</gav>
<cpe>cpe:/a:mutiny:mutiny</cpe>
</suppress>
<suppress>
<notes>
<![CDATA[
Suppress the false positive CPE for Smallrye Mutiny to mutiny:mutiny
]]>
</notes>
<gav regex="true">^io\.smallrye.reactive:smallrye-mutiny.*:.*$</gav>
<cpe>cpe:/a:mutiny:mutiny</cpe>
</suppress>
<suppress>
<notes>
<![CDATA[
Suppress the false positive CPE for Smallrye Mutiny to mutiny:mutiny
]]>
</notes>
<gav regex="true">^io\.smallrye.reactive:vertx-mutiny.*:.*$</gav>
<cpe>cpe:/a:mutiny:mutiny</cpe>
</suppress>
<suppress>
<notes>
<![CDATA[
Suppress the false positive CPE for graal-sdk to GraalVM (the JVM distribution)
]]>
</notes>
<gav regex="true">^org\.graalvm\.sdk:g like this
</suppress>
</suppressions>
抑制リストを定期的に見直し、更新して、結果が最新であるようにして下さい。次の例に示すように、expiry属性を追加することで、個々の抑制に時間制限を適用することも可能です:
<suppress until="2022-01-01Z">…</suppress> 必要であれば有効期限を調整することもできます。
Quarkus Securityのテスト
Quarkusのセキュリティをテストする場合は、 IdentityProvider が、ユーザー名、パスワード、ロールが application.properties に設定されていることを確認してください。
Quarkusセキュリティのテストの詳細については、 ユーザー情報の設定 を参照してください。