この章では、アプリケーションの開発時にキーストア・サービスを利用する方法について説明します。
キーストアは、キーおよび証明書の安全な格納とアクセスに使用します。キーストア・サービスAPIは、キーストアにアクセスして操作を実行するために使用します。
キーストア・サービスの特徴
キーおよび証明書の安全な管理を可能にします。
各種バックエンド・リポジトリでのキーおよび証明書の格納、取得および管理のためのAPIを提供します。
ファイルベース、データベース・ベースおよびLDAPベースのキーストア管理をサポートします。
キーストア・サービスAPIは、次のような重要な機能(作成、更新、削除)を提供します。
キーストアの作成
キーストアの削除
ドメイン・トラスト・ストアへのハンドルの取得
キーストアへのハンドルの取得
キーストアに対する構成済のプロパティの取得
アプリケーション・ストライプ内のキーストアのリストの取得
KeyStoreに対する操作は、キーストア・サービスで使用されるファイングレイン・アクセス制御モデルを実装するKeyStoreAccessPermissionによって保護されます。
アプリケーションがキーストア・サービスと連携するように設計するうえで、次の項目に関する知識が役立ちます。
使用する適切なアプリケーション・ストライプとキーストア名の決定。
Javaセキュリティ・ポリシーのプロビジョニング。
ポリシー・パーミッションは、ファイルベース(system-jazn-data.xml)またはLDAPベースのポリシー・ストアに設定されます。データのセキュリティを損なわずにアプリケーションの使用を可能にする適切なパーミッションを設定するには、十分な配慮が必要です。
jps-config.xmlでのキーストア・サービスの定義。
jps-config.xmlでのサービス・インスタンスの定義は、構成ファイルをマニュアルで作成する場合のみ必要です。
環境の設定手順。
スタンドアロン・アプリケーションの場合と、Oracle WebLogic Server環境で動作するアプリケーションの場合は手順が異なります。
Oracle Platform Security Servicesキーストア・プロバイダは、サーバーの起動時に設定されます。プロバイダがファイルベースの場合、データはsystem-jazn-data.xmlに格納されます。
キーストア・サービスでは、次のレベルでのキーの保護をサポートしています。
アプリケーション・ストライプ・レベル
キーストア・レベル
特定の<application stripe, keystore, key>に対するきめ細やかな保護
|
注意:
|
この項では、キーストア・オブジェクトへのパーミッションの付与に関するガイドラインおよびいくつかの例を紹介します。
|
注意: この例では、アプリケーションのjarファイル名は |
キーストア・サービスでは、Javaパーミッションを使用して、キーストアまたはキー・オブジェクトにパーミッションを付与します。必要なパーミッションのみを付与して、それ以外は付与しないことを強くお薦めします。
|
警告: 不要なパーミッション、特にすべてのアプリケーション・ストライプやキーストアにアクセスできるパーミッションを付与することは危険であり、お薦めできません。 |
キーストア・サービスでは、オブジェクトは階層に格納されます。
アプリケーション・ストライプ -> キーストア -> キー/証明書
この例では、特定のアプリケーション・ストライプおよびそのストライプ内の特定のキーストア名に対するパーミッションを付与します。
<jazn-policy>
<grant>
<grantee>
<principals>...</principals>
<!-- This is the location of the jar -->
<!-- as loaded with the run-time -->
<codesource>
<url>file:${oracle.deployed.app.dir}/<MyApp>${oracle.deployed.app.ext}</url>
</codesource>
</grantee>
<permissions>
<permission>
<class>oracle.security.jps.service.keystore.
KeyStoreAccessPermission</class>
<name>stripeName=keystoreapp,keystoreName=ks1,alias=*</name>
<!-- All actions are granted -->
<actions>*</actions>
</permission>
</permissions>
</grant>
</jazn-policy>
説明:
stripeNameは、これらのパーミッション(ワイルドカード・アクションで示した読取り、書込み、更新および削除パーミッション)を付与するアプリケーション・ストライプの名前(通常はアプリケーション名)です。
keystoreNameは使用しているキーストアの名前です。
aliasはキーストア内のキー別名を示します。
|
注意: ワイルドカードは、すべての別名に対するパーミッションがアプリケーションに付与されることを意味します。 |
この例では、特定のアプリケーション・ストライプ名およびそのすべてのキーストアに対するパーミッションが付与されます。
<jazn-policy>
<grant>
<grantee>
<principals>...</principals>
<codesource>
<url>file:${oracle.deployed.app.dir}/<MyApp>${oracle.deployed.app.ext}</url>
</codesource>
</grantee>
<permissions>
<permission>
<class>oracle.security.jps.service.keystore.
KeyStoreAccessPermission</class>
<name>stripeName=keystoreapp,keystoreName=*,alias=*</name>
<!-- Certain actions are explicitly specified -->
<!-- Compare to wild-card grant in previous example -->
<actions>read,write,update,delete</actions>
</permission>
</permissions>
</grant>
</jazn-policy>
この例では、アプリケーション・ストライプ名内の特定のキー別名およびキーストアに対する読取りパーミッションが付与されます。
<jazn-policy>
<grant>
<grantee>
<principals>...</principals>
<codesource>
<url>file:${oracle.deployed.app.dir}/<MyApp>${oracle.deployed.app.ext}</url>
</codesource>
</grantee>
<permissions>
<permission>
<class>oracle.security.jps.service.keystore.
KeyStoreAccessPermission</class>
<name>stripeName=keystoreapp,keystoreName=ks1,alias=orakey</name>
<actions>read</actions>
</permission>
</permissions>
</grant>
</jazn-policy>
キーストアの場所とプロバイダ・クラスに関する情報が含まれている構成ファイル内で、キーストア・サービス・インスタンスを定義する必要があります。構成ファイルは、次の場所にあります。
$DOMAIN_HOME/config/fmwconfig
名前は次のとおりです。
jps-config.xml(Oracle WebLogic Serverの場合)
jps-config-jse.xml(Java SEの場合)
キーストア・サービスは、Oracle WebLogic Server内またはスタンドアロン環境で使用できます。
スタンドアロン環境でAPIを使用する手順は、次のとおりです。
クラスパスを設定します。jps-manifest.jarファイルがそのクラスパスに入っていることを確認します。詳細は、第1.5.3項「シナリオ3: Java SEアプリケーションの保護」の「クラスパスで指定する必要のあるJAR」を参照してください。
ポリシーを設定します。キーストア・サービスAPIにアクセスできるようにするには、参照ポリシー・ストアでアクセス・パーミッションを構成する必要があります。例は、第27.3項「Javaセキュリティ・ポリシーのパーミッションの設定」を参照してください。
アプリケーションを実行します。
コマンドライン・オプションは次のとおりです。
-Doracle.security.jps.config
構成ファイルのフルパスを指定します。
-Djava.security.policy
OPSSおよびOracle WebLogic Serverのポリシー・ファイルの場所を指定します。
-Djava.security.debug=all
デバッグに役立ちます。
Oracle WebLogic Server環境でAPIを使用する手順は、次のとおりです。
出荷時、jps-config.xmlファイルのキーストア・サービス・プロバイダ・セクションは、次のディレクトリに構成されています。
$DOMAIN_HOME/config/fmwconfig
必要に応じて、LDAPストアまたはデータベース・ストアへの再関連付けを行ってください。
ポリシーを設定します。キーストア・サービスAPIにアクセスできるようにするには、参照ポリシー・ストアでアクセス・パーミッションを構成する必要があります。例は、第27.3項「Javaセキュリティ・ポリシーのパーミッションの設定」を参照してください。
Oracle WebLogic Serverを起動します。
アプリケーションをデプロイしてテストします。
この項では、キーストア・サービスAPIの使用例を紹介します。次のトピックが含まれます:
次のJavaコードは、一般的なキーストア・サービス操作を示しています。
import oracle.security.jps.JpsContext;
import oracle.security.jps.JpsContextFactory;
import oracle.security.jps.JpsException;
import oracle.security.jps.internal.policystore.JavaPolicyProvider;
import oracle.security.jps.service.keystore.KeyStoreProperties;
import oracle.security.jps.service.keystore.KeyStoreService;
import oracle.security.jps.service.keystore.KeyStoreServiceException;
import java.security.AccessController;
import java.security.PrivilegedAction;
public class KeyStoreTest {
static {
java.security.Policy.setPolicy(new JavaPolicyProvider());
}
private static KeyStoreService ks = null;
public KeyStoreTest() {
super();
}
/*
* This method performs a non-privileged operation. Either all code
* in the call stack must have KeyStoreAccessPermission
* OR
* the caller must have the KeyStoreAccessPermission only and
* invoke this operation in doPrivileged block
*/
public static void doKeyStoreOperation() {
doOperation();
}
/*
* Since this method performs a privileged operation, only current class or
* jar containing this class needs KeyStoreAccessPermission
*/
public static void doPrivilegedKeyStoreOperation() {
AccessController.doPrivileged(new PrivilegedAction<String>() {
public String run() {
doOperation();
return "done";
}
});
}
private static void doOperation() {
try {
ks.deleteKeyStore("keystoreapp", "ks1", null);
} catch(KeyStoreServiceException e) {
e.printStackTrace();
}
/*
* Since this method performs a privileged operation, only current class or
* jar containing this class needs KeyStoreAccessPermission
*/
public static void doPrivilegedKeyStoreOperation() {
AccessController.doPrivileged(new PrivilegedAction<String>() {
public String run() {
doOperation();
return "done";
}
});
}
private static void doOperation() {
try {
ks.deleteKeyStore("keystoreapp", "ks1", null);
} catch(KeyStoreServiceException e) {
e.printStackTrace();
}
public static void main(String args[]) throws Exception {
try {
JpsContext ctx = JpsContextFactory.getContextFactory().getContext();
ks = ctx.getServiceInstance(KeyStoreService.class);
// #1 - this call is in a doPrivileged block
// #1 - this should succeed.
doPrivilegedKeyStoreOperation();
// #2 - this will also pass since granted all application
// code necessary permission
// NOTE: Since this call is not in a doPrivileged block,
// this call would have failed if KeyStoreAccessPermission
// wasn't granted to this class.
/*
doKeyStoreOperation();
*/
} catch (JpsException je) {
je.printStackTrace();
}
}
}
この例では、ストアから特定のキーストアへのアクセスに必要とされる適切なパーミッションを持つxmlベースのポリシー・ストア・ファイル(system-jazn-data.xml)を使用して説明しています。このファイルでは、アプリケーション・ストライプとキーストア名の様々な組合せに対するパーミッションを定義します。他の組合せや、ここで定義されたパーミッションを超えたストアへのアクセスは、許可されません。
|
注意: この権限付与が追加されるデフォルトのポリシー・ストアは |
ここでは、システム・プロパティprojectsrc.homeはJava SEアプリケーションを格納しているディレクトリを指し示すように設定されており、clientApp.jarはサブディレクトリdistにあるアプリケーションjarファイルです。
対応するポリシー付与は、次のようになります。
<grant>
<grantee>
<codesource>
<url>file:${projectsrc.home}/dist/clientApp.jar</url>
</codesource>
</grantee>
<permissions>
<permission>
<class>oracle.security.jps.service.keystore.KeyStoreAccessPermission
</class>
<name>stripeName=keystoreapp,keystoreName=ks1,alias=*</name>
<actions>*</actions>
</permission>
</permissions>
</grant>
サンプル構成ファイル(jps-config-jse.xml)を示します。キーストア・サービスのkeystore.file.pathプロパティは、keystores.xmlファイルを含むディレクトリを示しています。
|
注意: 完全な構成ファイルについては、製品に付属しているデフォルトのファイル( |
<jpsConfig>
...
<serviceInstances>
<serviceInstance name="keystore_file_instance"
provider="keystore_file_provider">
<property name="keystore.file.path" value="store" />
<property name="keystore.provider.type" value="file" />
</serviceInstance>
</serviceInstances>
...
</jpsConfig>
Java SE環境では、次の2つのコールは同等です。
KeyStoreService store = JpsServiceLocator.getServiceLocator().lookup(KeyStoreService.class);
および
KeyStoreService store = JpsContextFactory.getContextFactory().getContext().getServiceInstance
(KeyStoreService.class);
クラスタ環境では、キーストア・サービスAPI上でキーストア・サービスMBean APIを使用して、アプリケーションに対するキーの作成、取得、更新および削除を行います。
ただし、単にキーを読み取るだけの場合は、いずれのAPIも使用できます。