16.3. Elytron を使用した Jakarta Authentication セキュリティーの設定

JBoss EAP 7.3 より、elytron サブシステムは、Jakarta Authentication からの Servlet プロファイル実装を行うことができます。これにより、Elytron のセキュリティー機能とのより密接な統合が可能になります。

Web アプリケーションの Jakarta Authentication の有効化

Jakarta Authentication インテグレーションが web アプリケーションに対して有効化されるようにするには、Web アプリケーションを Elytron http-authentication-factory または security-domain に割り当てる必要があります。これにより、Elytron セキュリティーハンドラーがデプロイメントにインストールされ、Elytron セキュリティーフレームワークがデプロイメントに対してアクティベートされます。

Elytron セキュリティーフレームワークがデプロイメントに対してアクティブ化されると、リクエストの処理時に、グローバルに登録された AuthConfigFactory がクエリーされます。これは、デプロイメントに使用される AuthConfigProvider が登録されているかどうかを特定します。AuthConfigProvider が見つかった場合、JASPI 認証がデプロイメントの認証設定の代わりに使用されます。AuthConfigProvider が見つからない場合、デプロイメントの認証設定が代わりに使用されます。これにより、以下の 3 つのいずれかの状況になります。

  • http-authentication-factory の認証メカニズムの使用。
  • web.xml に指定されたメカニズムの使用。
  • アプリケーションにメカニズムが定義されていない場合は、認証は実行されません。

AuthConfigFactory に行われた更新は即座に利用できます。これは、AuthConfigProvider が登録され、既存のアプリケーションと一致する場合、アプリケーションの再デプロイメントなしですぐに使用できることを意味します。

JBoss EAP にデプロイされたすべての web アプリケーションにはセキュリティードメインがあります。これは、以下の順番で解決されます。

  1. デプロイメント記述子またはデプロイメントのアノテーションから。
  2. undertow サブシステムの default-security-domain 属性で定義される値。
  3. デフォルトは other です。
注記

このセキュリティードメインは PicketBox セキュリティードメインへの参照であることが仮定されます。そのため、アクティベーションの最終ステップでは undertow サブシステムの application-security-domain リソースを使用して Elytron にマップされるようにします。

このマッピングは以下のいずれかを行います。

  • elytron セキュリティードメインを直接参照します。例を以下に示します。

    /subsystem=undertow/application-security-domain=MyAppSecurity:add(security-domain=ApplicationDomain)
  • http-authentication-factory リソースを参照して認証メカニズムのインスタンスを取得しま。例を以下に示します。

    /subsystem=undertow/application-security-domain=MyAppSecurity:add(http-authentication-factory=application-http-authentication)

Jakarta Authentication インテグレーションを有効にする最小ステップは次のとおりです。

  1. undertow サブシステムの default-security-domain 属性を未定義のままにして、デフォルトが other になるようにします。
  2. application-security-domain マッピングを other から Elytron セキュリティードメインに追加します。

これらの手順のディプロイメントに関連したセキュリティードメインは、CallbackHandler でラッピングされるセキュリティードメインです。これは、認証に使用される ServerAuthModule インスタンスに渡すようにするためです。

追加オプション

さらに 2 つの属性が application-security-domain リソースに追加され、Jakarta Authentication の動作をさらに制御できるようになりました。

表16.1 application-security-domain リソースに追加された属性

属性説明

enable-jaspi

このマッピングを使用してすべてのデプロイメントの Jakarta Authentication サポートを無効にするには、false に設定します。

integrated-jaspi

デフォルトでは、すべてのアイデンティティーがセキュリティードメインからロードされます。false に設定すると、アドホックのアイデンティティーが代わりに作成されます。

サブシステムの設定

ディプロイメントに AuthConfigProvider が返される設定を登録する方法の 1 つは、elytron サブシステムに jaspi-configuration を登録することです。

以下のコマンドは、2 つの ServerAuthModule 定義が含まれる設定を追加する方法を表しています。

/subsystem=elytron/jaspi-configuration=simple-configuration:add(layer=HttpServlet, application-context="default-host /webctx", description="Elytron Test Configuration", server-auth-modules=[{class-name=org.wildfly.security.examples.jaspi.SimpleServerAuthModule, module=org.wildfly.security.examples.jaspi, flag=OPTIONAL, options={a=b, c=d}}, {class-name=org.wildfly.security.examples.jaspi.SecondServerAuthModule, module=org.wildfly.security.examples.jaspi}])

これにより、以下の設定が永続化されます。

<jaspi>
    <jaspi-configuration name="simple-configuration" layer="HttpServlet" application-context="default-host /webctx" description="Elytron Test Configuration">
        <server-auth-modules>
            <server-auth-module class-name="org.wildfly.security.examples.jaspi.SimpleServerAuthModule" module="org.wildfly.security.examples.jaspi" flag="OPTIONAL">
                <options>
                    <property name="a" value="b"/>
                    <property name="c" value="d"/>
                </options>
            </server-auth-module>
            <server-auth-module class-name="org.wildfly.security.examples.jaspi.SecondServerAuthModule" module="org.wildfly.security.examples.jaspi"/>
        </server-auth-modules>
    </jaspi-configuration>
</jaspi>
注記

name 属性は、リソースが管理モデルで参照できる名前のみです。

layerapplication-context 属性は、この設定を AuthConfigFactory に登録するときに使用されます。これらの属性は両者とも省略でき、ワイルドカードの一致を許可します。description も任意の属性で、AuthConfigFactory に説明を追加するために使用します。

設定内で、複数の server-auth-module インスタンスを以下の属性で定義することができます。

  • class-name: ServerAuthModule の完全修飾クラス名。
  • module - ServerAuthModule をロードするモジュール。
  • flag - このモジュールが他のモジュールに関連してどのように動作するかを示す制御フラグ。
  • options: 初期化の際に ServerAuthModule に渡される設定オプション。

この方法で定義した設定は AuthConfigFactory で即座に登録されます。layerapplication-context に一致する Elytron セキュリティーフレームワークを使用する既存のデプロイメントは、この設定をすぐに使用し始めます。

プログラムによる設定

Jakarta Authentication 仕様内で定義した API により、アプリケーションはカスタム AuthConfigProvider インスタンスを動的に登録できます。ただし、この仕様は実際に使用する実装や、実装のインスタンスを作成するための標準的な方法は指定しません。このため、Elytron プロジェクトには、ディプロイメントが使用できるシンプルなユーティリティーが含まれています。

以下のコード例は、この API を使用して上記の サブシステム設定 で説明したものと似た設定を登録する方法を示しています。

String registrationId = org.wildfly.security.auth.jaspi.JaspiConfigurationBuilder.builder("HttpServlet", servletContext.getVirtualServerName() + " " + servletContext.getContextPath())
    .addAuthModuleFactory(SimpleServerAuthModule::new, Flag.OPTIONAL, Collections.singletonMap("a", "b"))
    .addAuthModuleFactory(SecondServerAuthModule::new)
.register();

たとえば、このコードはサーブレットの init() メソッド内で実行して、そのデプロイメントに固有の AuthConfigProvider を登録することができます。このコード例では、ServletContext を参照して、アプリケーションコンテンツが設定されています。

register() メソッドは、生成された登録 ID を返します。この登録 ID は、この登録を AuthConfigFactory から直接削除するためにも使用できます。

Subsystem Configuration と同様に、この呼び出しも即効性があり、Elytron セキュリティーフレームワークを使用するすべての Web アプリケーションで有効になります。

認証プロセス

undertow サブシステムの application-security-domain リソースの設定を基にして、ServerAuthModule に渡される CallbackHandler は以下のいずれかのモードで動作できます。

統合モード

統合モードで動作すると、ServerAuthModule インスタンスが実際の認証を処理します。しかし、生成されるアイデンティティは、その の SecurityDomain によって参照される SecurityRealms を使用して、参照された の SecurityDomain からロードされます。このモードでは依然として、サーブレットコンテナー内で割り当てられるロールを上書きできます。

このモードのメリットは、ServerAuthModules が、アイデンティティのロードに Elytron 設定を活用できることです。このため、データベースや LDAP などの通常の場所に保存されているアイデンティティは、ServerAuthModule がこれらの場所を認識せずに読み込みできます。さらに、ロールやパーミッションマッピングなどの他の Elytron 設定を適用することもできます。参照される SecurityDomain は、SASL 認証またはその他の JASPI 以外のアプリケーションなど、他の場所で参照することも可能です。

表16.2 統合モードでの CallbackHandlers メソッドの操作。

操作説明

PasswordValidationCallback

認証には、SecurityDomain とともにユーザー名およびパスワードが使用されます。成功した場合には、認証済みアイデンティティーが生成されます。

CallerPrincipalCallback

この Callback は、承認されたアイデンティティーまたは、リクエストが Web アプリケーションに到達した際に利用可能になるアイデンティティーを確立するために使用されます。

注記

認証されたアイデンティティが既に PasswordValidationCallback から確立されている場合は、この Callback がリクエストに応じての実行として解釈されます。この場合、認証されたアイデンティティーが、この Callback で指定したアイデンティティとして実行するように承認されるように、承認チェックが行われます。PasswordValidationCallback によって認証済みアイデンティティが確立されていない場合、ServerAuthModule が認証ステップを処理したと見なされます。

Callback が null プリンシパルおよび名前で受信されている場合は、以下のようになります。

  • 認証されたアイデンティティーが既に確立されている場合、承認はそのアイデンティティーとして実行されます。
  • アイデンティティーが確立されていない場合、匿名のアイデンティティーの承認が行われます。

匿名のアイデンティティーの承認が行われると、SecurityDomain は、LoginPermission に匿名アイデンティティーを付与するように設定されている必要があります。

GroupPrincipalCallback

このモードでは、セキュリティードメインに設定された属性のロード、ロールのデコード、およびロールのマッピングでアイデンティティーが確立されます。この Callback が受信された場合、そのアイデンティティーに割り当てらているロールを判別するために指定のグループが使用されます。リクエストはサーブレットコンテナーに表示され、これらのロールはサーブレットコンテナーでのみ表示されます。

非統合モード

非統合モードで動作している場合、ServerAuthModules は、すべての認証およびアイデンティティー管理を完全に行います。指定した Callbacks を使用してアイデンティティーを確立できます。生成されるアイデンティティーは SecurityDomain に作成されますが、参照される SecurityRealms に格納されるアイデンティティーに依存しません。

このモードの利点は、簡単な SecurityDomain 定義以外を必要とせずに、アイデンティティーを完全に処理可能な JASPI 設定をアプリケーションサーバーにデプロイすることができることです。この SecurityDomain には、起動時に使用されるアイデンティティーを実際に含める必要はありません。このモードの欠点は、ServerAuthModule がすべてのアイデンティティー処理を行うようになるため、実装がはるかに複雑になる可能性があることです。

表16.3 非統合モードでの CallbackHandlers メソッドの操作。

操作説明

PasswordValidationCallback

Callback は、このモードではサポートされていません。このモードの目的は、ServerAuthModule が、参照される SecurityDomain を独立して操作するためです。検証するパスワードを要求することは、適切ではありません。

CallerPrincipalCallback

この Callback は、生成されるアイデンティティーのプリンシパルを確立するために使用されます。ServerAuthModule はすべてのアイデンティティーチェック要件を処理しているため、セキュリティードメインにアイデンティティーが存在するかや、承認チェックが行われていないかを検証するためのチェックが行われません。

Callback が null プリンシパルや名前を受信すると、アイデンティティーは匿名アイデンティティーとして確立されます。ServerAuthModule が決定を行うため、SecurityDomain には、承認チェックは行われません。

GroupPrincipalCallback

このアイデンティティーは SecurityDomain からロードせずにこのモードで作成されるため、デフォルトではロールが割り当てられません。この Callback が受信された場合は、リクエストがサーブレットコンテナーに存在するときに、グループが取得され、生成されるアイデンティティーに割り当てられます。これらのロールはサーブレットコンテナーのみで表示されます。

validateRequest

ServerAuthContextvalidateRequest を呼び出すと、個々の ServerAuthModule インスタンスが、定義された順に呼び出されます。各モジュールには、制御フラグを指定することもできます。このフラグは、応答がどのように解釈され、処理が次のサーバー認証モジュールに続行するべきかや、すぐに返されるべきかを定義します。

制御フラグ

設定が elytron サブシステム内で指定されていても、JaspiConfigurationBuilder API を使用していても、制御フラグは各 ServerAuthModule に関連付けることができます。指定がない場合は、デフォルトが REQUIRED に設定されます。このフラグは、結果に応じて、以下の意味を持ちます。

フラグAuthStatus.SEND_CLAIMAuthStatus.SEND_FAILURE、AuthStatus.SEND_continue

Required

検証は、残りのモジュールに対して継続されます。残りのモジュールの要件が満たされると、リクエストによる承認の続行が許可されます。

検証は残りのモジュールに対して継続されますが、その結果に関係なく検証は失敗し、制御はクライアントに返されます。

Requisite

検証は、残りのモジュールに対して継続されます。残りのモジュールの要件が満たされると、リクエストによる承認の続行が許可されます。

このリクエストは即座にクライアントに返されます。

Sufficient

検証は成功して完了したと判断され、以前の Required または Requisite は、AuthStatus.SUCCESS 以外の AuthStatus を返します。このリクエストは、セキュアなリソースの承認を継続します。

検証は、残りのモジュールのリストへと続きます。このステータスは、REQUIRED または REQUISITE モジュールがない場合にのみ決定に影響します。

Optional

Required または Requisite モジュールが SUCCESS を返さない場合、検証は残りのモジュールに対して続行されます。これは、検証が成功したとみなし、要求が承認段階とセキュアなリソースに続行するには十分です。

検証は、残りのモジュールのリストへと続きます。このステータスは、REQUIRED または REQUISITE モジュールがない場合にのみ決定に影響します。

注記

すべての ServerAuthModule インスタンスについては、AuthException を出力すると、エラーがすぐにクライアントに報告され、それ以上のモジュール呼び出しは行われません。

secureResponse

secureResponse の呼び出し中には、各 ServerAuthModule が呼び出されます。ただし、この場合は逆順で、モジュールは secureResponse で措置をとるだけです。モジュールが validateResponse でアクションを実行した場合、この追跡は、このモジュールが行います。

制御フラグは、secureResponse 処理には影響しません。次のいずれかに該当する場合、処理は終了します。

  • すべての ServerAuthModule インスタンスが呼び出されている。
  • モジュールは AuthStatus.SEND_FAILURE を返している。
  • モジュールは AuthException を出力している。
SecurityIdentity の作成

認証プロセスが完了すると、CallbackHandler への Callbacks の結果として、ディプロイメントの SecurityDomainorg.wildfly.security.auth.server.SecurityIdentity が作成されます。Callbacks に応じて、これは SecurityDomain から直接ロードされたアイデンティティーになるか、そのコールバックによって記述されるアドホックアイデンティティーになります。この SecurityIdentity は、他の認証メカニズムの場合と同じように、リクエストに関連付けられます。