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 org.eclipse.microprofile.jwt.JsonWebToken として表現できます。

OIDC 認証のための追加の Quarkus リソース

Quarkusアプリケーションの保護のために使用できるOIDC認証および認可方法の詳細については、以下の詳細なリソースを参照してください:

OIDC トピック Quarkus の情報リソース

ベアラートークン認証メカニズム

OpenID Connect (OIDC) とベアラートークン認可を使用したサービスアプリケーションの保護

認可コードフロー認証メカニズム

OpenID Connect (OIDC)認可コードフローメカニズム

ベアラートークンまたは認可コード・フロー・メカニズムをサポートする複数のテナント

OpenID Connect (OIDC) マルチテナントの使用

Keycloak を使用した認可の一元化

OpenID Connect (OIDC) と Keycloak を使用して認可を一元化

Keycloak のプログラムによる設定

Keycloak admin クライアントの使用

  • Quarkus OIDCエクステンションを実行時に有効にする必要がある場合は、ビルド時に quarkus.oidc.tenant-enabled=false 、システムプロパティを使用して実行時に再有効化します。マルチテナントOIDC展開における個々のテナント構成の管理に関する詳細は、『 Using OpenID Connect(OIDC)』マルチテナンシーガイド の「 _テナント構成の無効 _化」のセクションを参照してください。

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トークンを検証するための JsonWebKey セットのリフレッシュ

可

可

不可

トークンを Principal として表現

可

可

可

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 インスタンスを追加する必要があります。

認可

Quarkusは、ロールベースのアクセスコントロール(RBAC)もサポートしています。RBACとQuarkusのその他の認可オプションの詳細については、 セキュリティ認可 を参照してください。

Quarkus Securityのカスタマイズ

Quarkus Securityは、高度にカスタマイズ可能です。Quarkusの以下のコアセキュリティコンポーネントをカスタマイズすることができます:

  • HttpAuthenticationMechanism

  • IdentityProvider

  • SecurityidentityAugmentor

リアクティブセキュリティを含むQuarkus Securityのカスタマイズ、およびセキュリティプロバイダーの登録方法の詳細については、 セキュリティのカスタマイズ を参照してください。

認証メカニズムの組み合わせ

ユーザ認証情報が異なるソースから提供される場合、認証メカニズムを組み合わせることができます。 例えば、組み込みの Basic および quarkus-oidc Bearer 認証メカニズムを組み合わせることができます。

quarkus-oidc Bearer と smallrye-jwt の認証メカニズムは、どちらも HTTP Authorization 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>

owasp-dependency-check-plugin.version には 7.1.1 以降をセットして下さい。

次に、以下のようにプラグインを設定します:

<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セキュリティのテストの詳細については、 ユーザー情報の設定 を参照してください。