Sun ONE Application Server 7 Enterprise Java Beans 開発者ガイド |
安全な Enterprise JavaBeans の開発この章では、EJB アーキテクチャにおけるセキュリティ管理の動作およびSun ONE Application Server 7 環境で安全な Enterprise JavaBeans を開発するための手引きについて説明します。
注 EJB テクノロジに精通していない場合は、Java Software チュートリアルを参照してください。
http://java.sun.com/j2ee/docs.html
EJB のセキュリティに関する詳細情報は、『Enterprise JavaBeans Specification, v2.0』の第 21 章「Security Management」にあります。
アプリケーションのセキュリティに関する一般情報は、『Sun ONE Application Server 開発者ガイド』を参照してください。
この章には次の項目があります。
- 安全な Enterprise JavaBeans について
- セキュリティロールの定義
- メソッドパーミッションの宣言
- セキュリティロール参照の宣言
- セキュリティ ID の指定
- プログラムによるセキュリティの使用法
- 保護されていない EJB 層のリソースの処理
アプリケーションのセキュリティに関する一般情報は、『Sun ONE Application Server 開発者ガイド』を参照してください。
安全な Enterprise JavaBeans について
EJB 開発者の主な役割は、アプリケーションのセキュリティ要件を宣言して、アプリケーションの配備時にそれらの要件が満たされるようにすることです。ほとんどの場合、EJB のビジネスメソッドにはセキュリティ関連のロジックを含めることはできません。
この節では次の項目について説明します。
承認と認証
承認により、保護されたリソースへのアクセスを制御します。承認は、識別と認証に基づきます。識別は、システムがエンティティを認識できるようにするプロセスです。認証は、コンピュータシステム内のユーザ、デバイス、またはその他のエンティティの識別情報を検証するプロセスであり、通常は、システム内のリソースへのアクセスを許可するための前提条件に従います。
適切な承認レベルを持つユーザのアクセスだけを許可するように Enterprise JavaBeans を設定できます。そのためには、Sun ONE Application Server のAdministration interfaceを使用して、アプリケーションの EAR および EJB JAR ファイル用の配備記述子を生成します。
セキュリティロール
セキュリティロールは、アプリケーション固有の論理的なユーザのグループ分けであり、顧客プロフィールや役職など、一般的な特性によって分類されます。アプリケーションの配備時に、プリンシパル (認証の結果としてユーザに割り当てられる ID) やグループなどのセキュリティ ID にロールがマップされます。これに基づいて、特定のセキュリティロールを持つユーザに Enterprise JavaBean へのアクセス権が割り当てられます。このリンクが、セキュリティロールが参照されるときの実際の名前になります。
グループもユーザのカテゴリを表しますが、グループの範囲はロールの範囲とは異なります。
- ロールは J2EE アプリケーション固有の抽象概念である
- グループは、現在のレルムに基づいた環境固有のユーザの集合である。グループのメンバーシップは、基になるレルムの実装によって決まる
注 メソッドの制限事項とロールマッピングを定義するときは、グループのレルムと J2EE アプリケーションロールが混同されがちです。このような混乱は、予期せぬアクセスや、動作不可能なアプリケーション設定につながりかねません。詳細は、『Sun ONE Application Server 開発者ガイド』を参照してください。
配備
セキュリティロール参照は、isCallerInRole (文字列名) を使って Enterprise JavaBean から呼び出されるロール名と、アプリケーションで定義されているセキュリティロール名のマッピングを定義します。このセキュリティロール参照により、Enterprise JavaBean は既存のセキュリティロールを参照できます。
アプリケーションを配備するときに、配備担当者は、本稼動環境に存在するセキュリティ ID にロールをマップします。Enterprise JavaBean を開発するときは、開発者はユーザのロールについて知っている必要がありますが、誰がそのユーザになるかについてはほとんど知らない場合があります。それは、J2EE のセキュリティアーキテクチャで処理されます。開発したコンポーネントが配備されたあとで、システム管理者が、デフォルトレルム (通常はファイルレルム) の J2EE ユーザ (またはグループ) にそれらのロールをマップします。
セキュリティロールの定義
J2EE アプリケーションのロールを作成するには、アプリケーションに含まれる EJB JAR ファイルまたは WAR ファイルに対するロールを宣言します。security-role 要素で定義されたセキュリティロールは、EJB JAR ファイルレベルの適用対象となり、EJB JAR ファイル内のすべての Enterprise JavaBeans に適用されます。
例
次の例は、配備記述子内のセキュリティロール定義を示しており、employee と admin の 2 つの role-name 要素を指定しています。
...
<assembly-descriptor>
<security-role>
<description>
このロールには、サービスアプリケーションに
アクセスできる社員が含まれます。
このロールは、その社員の情報への
アクセスだけが許可されています。
</desciption>
<role-name>employee</role-name>
</security-role>
<security-role>
<description>
このロールは、自分の目的に使うアプリケーションの管理業務を実行する
権限を持つ担当者に割り当てる必要があります。機密情報である人事
および給与情報に直接アクセスすることはありません。
</desciption>
<role-name>admin</role-name>
</security-role>
...
</assembly-descriptor>メソッドパーミッションの宣言
メソッドパーミッションは、どのロールがどのメソッドの起動を許可されているかを示します。アプリケーションのアセンブリ担当者は、次のように、配備記述子内で method-permission 要素を使ってメソッドパーミッションの関係を宣言します。
- 各 method-permission 要素には、1 つまたは複数のセキュリティロールのリスト、および 1 つまたは複数のメソッドのリストが含まれる
一覧表示されたセキュリティロールは一覧表示されたすべてのメソッドを起動できる。リスト内の各セキュリティロールは role-name 要素によって識別され、各メソッド (または下記の一連のメソッド) は method 要素によって識別される。description 要素を使って オプションの説明を method-permission 要素に関連付けることができる
- メソッドパーミッションの関係は、個々の method permission 要素に定義したすべてのメソッドパーミッションの結合として定義される
- セキュリティロールまたはメソッドは、複数の method-permission 要素内に存在することがある
例
次の配備記述子の例は、配備記述子内でセキュリティロールをメソッドパーミッションに割り当てる方法を示します。これらは配備時にセキュリティ要素に変換されます。
...
<method-permission>
<role-name>employee</role-name>
<method>
<ejb-name>EmployeeService</ejb-name>
<method-name>*</method-name>
</method>
</method-permission>
<method-permission>
<role-name>employee</role-name>
<method>
<ejb-name>AardvarkPayroll</ejb-name>
<method-name>findByPrimaryKey</method-name>
</method>
<method>
<ejb-name>AardvarkPayroll</ejb-name>
<method-name>getEmployeeInfo</method-name>
</method>
<method>
<ejb-name>AardvarkPayroll</ejb-name>
<method-name>updateEmployeeInfo</method-name>
</method
</method-permission>
...セキュリティロール参照の宣言
EJB 開発者は、Enterprise JavaBeans 内でプログラムによって使用されるロールについて、Enterprise JavaBean で使用するすべてのセキュリティロールの名前を配備記述子の security-role-ref 要素に宣言する必要があります。
- アプリケーションのアセンブリ担当者は、security-role-ref 要素で宣言されたすべてのセキュリティロール参照を、security-role 要素で定義されたセキュリティロールにリンクする必要がある
- アプリケーションのアセンブリ担当者は、role-link 要素を使って各セキュリティロール参照をセキュリティロールにリンクする
注 role-link 要素の値は、security-role 要素で定義されたセキュリティロール名の一つである必要があります。
例
次の配備記述子の例は、payroll という名前のセキュリティロール参照を payroll-department という名前のセキュリティロールにリンクする方法を示します。
<enterprise-beans>
...
<entity>
<ejb-name>AardvarkPayroll</ejb-name>
<ejb-class>com.aardvark.payroll.PayrollBean</ejb-class>
...
<security-role-ref>
<description>このロールは、給与支払い部門の社員に割り当てる必要があり
ます。このロールが割り当てられたメンバーは全員の給与記録にアクセスできま
す。このロールは payroll-department ロールにリンクされています。
</description>
<role-name>payroll</role-name>
<role-link>payroll-department</role-link>
</security-role-ref>
....
</entity>
...
</enterprise-beans>このロールは、給与支払い部門の社員に割り当てる必要があります。このロールが割り当てられたメンバーは全員の給与記録にアクセスできます。このロールは payroll-department ロールにリンクされています。
セキュリティロールの詳細については、『Sun ONE Application Server 開発者ガイド』を参照してください。EJB アクセス制御の設定については、『Enterprise JavaBeans Specification, v2.0』を参照してください。
セキュリティ ID の指定
オプションで、EJB のアセンブリ担当者は、EJB メソッドの実行に関して呼び出し元の ID を使用するかどうか、あるいは特定の実行 ID を使用するかどうかを指定できます。配備記述子内の security-identity 要素は、この目的に使用されます。security-identity 要素の値は、use-caller-identity または run-as です。
指定しない場合は、デフォルトの呼び出し元の ID が適用されます。
実行 ID
実行 ID は、Enterprise JavaBean が呼び出しを行うときに使用する ID を指定します。呼び出し元の ID には影響しません。呼び出し元の ID は、Enterprise JavaBean のメソッドにアクセスするためのパーミッションを検査する ID です。
EJB のアセンブリ担当者は、run-as 要素を使って、配備記述子内に Enterprise JavaBean の実行 ID を定義できます。実行 ID は、Enterprise JavaBean 全体、つまり、EJB のホームインタフェースおよびコンポーネントインタフェースのすべてのメソッド、またはメッセージ駆動型 Beans の onMessage メソッド、および呼び出される可能性がある Enterprise JavaBean のすべての内部メソッドに適用されます。
アセンブリ担当者は、通常は本稼動環境のセキュリティ環境については把握していないので、実行 ID は、配備記述子内に定義されたセキュリティロールの 1 つに対応する論理 role-name によって指定します。その後、配備担当者は実行 ID のプリンシパルとして使用するセキュリティプリンシパル (本稼動環境で定義される) を割り当てる必要があります。セキュリティプリンシパルは、role-name 要素で指定されたセキュリティロールに割り当てられたプリンシパルである必要があります。
プログラムによるセキュリティの使用法
一般に、セキュリティ管理は、EJB のビジネスメソッドに対して透過的な方法でコンテナによって実行される必要があります。
注 Enterprise JavaBean では、サーブレットと同じようにプログラムによるログインを使います。詳細については、『Sun ONE Application Server 開発者ガイド』を参照してください。
EJB 層でのプログラムによるセキュリティは、getCallerPrincipal メソッドと isCallerInRole メソッドで構成されます。getCallerPrincipal メソッドを使って EJB の呼び出し元を指定し、isCallerInRole メソッドを使って呼び出し元のロールを指定することができます。
EJBContext インタフェースの getCallerPrincipal メソッドは、Enterprise JavaBean の呼び出し元を特定する java.security.Principal オブジェクトを返します。この場合、プリンシパルはユーザと同じになります。次の例では、Enterprise JavaBean の getUser メソッドが、その呼び出し元の J2EE ユーザの名前を返します。
public String getUser()
{
return context.getCallerPrincipal().getName();
}次のように、isCallerInRole メソッドを呼び出すことによって、EJB の呼び出し元が特定のロールに属するかどうかを判別できます。
boolean result = context.isCallerInRole("Customer");
プログラムによるセキュリティの実装方法の詳細は、『Enterprise JavaBeans Specification, v2.0』の第 21 章「Security Management」を参照してください。
保護されていない EJB 層のリソースの処理
すべてのユーザには匿名のロールが割り当てられています。デフォルトでは、匿名ロールの値は ANYONE であり、server.xml ファイルで設定できます。メソッドパーミッションで、必要なロールは ANYONE (または匿名ロールに設定された値) であると指定されていると、すべてのユーザがこのメソッドにアクセスできます。
注 あるメソッドを対象とするメソッドパーミッションが存在しない場合は、すべてのユーザがそのメソッドにアクセスできます。
メソッドパーミッションが存在する場合は、常にそのパーミッションが適用されます。たとえば、メソッドパーミッションで、updateEmployeeInfo メソッドには employee ロールのみがアクセスできるように設定されている場合、employee ロールを持たなければこのメソッドにはアクセスできません。employee ロールがどのユーザまたはグループにもマップされていない場合は、誰も updateEmployeeInfo メソッドを呼び出すことはできません。