第15章 JACC (Java Authorization Contract for Containers)
15.1. JACC (Java Authorization Contract for Containers) リンクのコピーリンクがクリップボードにコピーされました!
JACC (Java Authorization Contract for Containers) はコンテナーと承認サービスプロバイダー間のコントラクトを定義する規格であり、これによりコンテナーによって使用されるプロバイダーの実装が可能になります。JACC は、Java コミュニティープロセスの JSR-115 で定義されています。この仕様の詳細については、「Java™ Authorization Contract for Containers」を参照してください。
JBoss EAP は、security サブシステムのセキュリティー機能内に JACC のサポートを実装します。
15.2. JACC (Java Authorization Contract for Containers) のセキュリティーの設定 リンクのコピーリンクがクリップボードにコピーされました!
JACC (Java Authorization Contract for Containers) を設定するには、適切なモジュールでセキュリティードメインを設定し、必須のパラメーターが含まれるよう jboss-web.xml を編集する必要があります。
セキュリティードメインへの JACC サポートの追加
セキュリティードメインに JACC サポートを追加するには、required フラグセットで JACC 承認ポリシーをセキュリティードメインの承認スタックへ追加します。以下は JACC サポートを持つセキュリティードメインの例です。ただし、セキュリティードメインは直接 XML を変更せずに、管理コンソールまたは管理 CLI で設定することが推奨されます。
例: JACC サポートのあるセキュリティードメイン
JACC を使用するよう Web アプリケーションを設定
jboss-web.xml は デプロイメントの WEB-INF/ ディレクトリーに存在し、Web コンテナーに対する追加の JBoss 固有の設定を格納し、上書きします。JACC が有効になっているセキュリティードメインを使用するには、<security-domain> 要素が含まれるようにし、 さらに <use-jboss-authorization> 要素を true に設定する必要があります。以下の XML は、上記の JACC セキュリティードメインを使用するよう設定されています。
例: JACC セキュリティードメインの使用
<jboss-web>
<security-domain>jacc</security-domain>
<use-jboss-authorization>true</use-jboss-authorization>
</jboss-web>
<jboss-web>
<security-domain>jacc</security-domain>
<use-jboss-authorization>true</use-jboss-authorization>
</jboss-web>
JACC を使用するよう EJB アプリケーションを設定
セキュリティードメインと JACC を使用するよう EJB を設定する方法は Web アプリケーションの場合とは異なります。EJB の場合、ejb-jar.xml 記述子にてメソッドまたはメソッドのグループ上でメソッドパーミッションを宣言できます。<ejb-jar> 要素内では、すべての子 <method-permission> 要素に JACC ロールに関する情報が含まれます。詳細については、設定例を参照してください。EJBMethodPermission クラスは Java EE 7 API の一部であり、http://docs.oracle.com/javaee/7/api/javax/security/jacc/EJBMethodPermission.html で説明されています。
例: EJB の JACC メソッドパーミッション
Web アプリケーションと同様にセキュリティードメインを使用して EJB の認証および承認メカニズムを指定することも可能です。セキュリティードメインは <security> 子要素の jboss-ejb3.xml 記述子に宣言されます。セキュリティードメインの他に、EJB が実行されるプリンシパルを変更する <run-as-principal> を指定することもできます。
例: EJB のセキュリティードメイン宣言
elytron サブシステムを使用した JACC の有効化
レガシーセキュリティーサブシステムでの JACC の無効化
アプリケーションサーバーはデフォルトでレガシー security サブシステムを使用して、JACC ポリシープロバイダーおよびファクトリーを設定します。デフォルト設定は PicketBox から実装へマップします。
Elytron またはアプリケーションサーバーにインストールするその他のポリシーを使用して JACC 設定を管理するには、最初にレガシー security サブシステムで JACC を無効にする必要があります。これには、以下の管理 CLI コマンドを使用できます。
/subsystem=security:write-attribute(name=initialize-jacc, value=false)
/subsystem=security:write-attribute(name=initialize-jacc, value=false)
この作業を怠ると、次のエラーメッセージがサーバーログに出力されます: MSC000004: Failure during stop of service org.wildfly.security.policy: java.lang.StackOverflowError
JACC ポリシープロバイダーの定義
elytron サブシステムは、JACC 仕様を基にして組み込みのポリシープロバイダーを提供します。ポリシープロバイダーを作成するには、以下の管理 CLI コマンドを実行します。
/subsystem=elytron/policy=jacc:add(jacc-policy={})
reload
/subsystem=elytron/policy=jacc:add(jacc-policy={})
reload
Web デプロイメントに対する JACC の有効化
JACC ポリシープロバイダーを定義したら、以下のコマンドを実行して、web デプロイメントに対して JACC を有効にできます。
/subsystem=undertow/application-security-domain=other:add(http-authentication-factory=application-http-authentication,enable-jacc=true)
/subsystem=undertow/application-security-domain=other:add(http-authentication-factory=application-http-authentication,enable-jacc=true)
上記のコマンドは、jboss-web.xml ファイルに指定がない場合に、アプリケーションのデフォルトのセキュリティードメインを定義します。すでに application-security-domain が定義されている場合、以下のコマンドを実行すると JACC を有効にすることができます。
/subsystem=undertow/application-security-domain=my-security-domain:write-attribute(name=enable-jacc,value=true)
/subsystem=undertow/application-security-domain=my-security-domain:write-attribute(name=enable-jacc,value=true)
EJB デプロイメントに対する JACC の有効化
JACC ポリシープロバイダーを定義したら、以下のコマンドを実行して、EJB デプロイメントに対して JACC を有効にできます。
/subsystem=ejb3/application-security-domain=other:add(security-domain=ApplicationDomain,enable-jacc=true)
/subsystem=ejb3/application-security-domain=other:add(security-domain=ApplicationDomain,enable-jacc=true)
上記のコマンドは、EJB のデフォルトのセキュリティードメインを定義します。すでに application-security-domain が定義されている場合、以下のコマンドを実行すると JACC を有効にすることができます。
/subsystem=ejb3/application-security-domain=my-security-domain:write-attribute(name=enable-jacc,value=true)
/subsystem=ejb3/application-security-domain=my-security-domain:write-attribute(name=enable-jacc,value=true)
カスタム Elytron ポリシープロバイダーの作成
パーミッションをチェックするために一部の外部承認サービスと統合したい場合など、カスタム java.security.Policy が必要なときにカスタムのポリシープロバイダーが使用されます。カスタムポリシープロバイダーを作成するには、java.security.Policy を実装し、実装でカスタムモジュールを作成およびプラグし、elytron サブシステムのモジュールから実装を使用します。
/subsystem=elytron/policy=policy-provider-a:add(custom-policy={class-name=MyPolicyProviderA, module=x.y.z})
/subsystem=elytron/policy=policy-provider-a:add(custom-policy={class-name=MyPolicyProviderA, module=x.y.z})
詳細は「ポリシープロバイダープロパティー」を参照してください。
ほとんどの場合で、JACC ポリシープロバイダーを Java EE 対応のアプリケーションサーバーの一部として想定どおりに使用できます。