この章の内容は次のとおりです。
Oracle Coherence RESTセキュリティは、認証と認可の両方を使用してクラスタ・リソースへのアクセスを制限します。認証では、HTTP Basic、クライアント側のSSL証明書、およびHTTP Basicとクライアント側のSSL証明書の併用がサポートされています。認可は、Oracle Coherence*Extendスタイルの認可を使用して実装されます。これは、キャッシュ・サービスおよび起動サービスの操作に対してきめ細かいアクセス権を提供するインターセプタ・クラスに依存しています。Oracle Coherence RESTの認証と認可は、Oracle Coherenceの既存のセキュリティ機能の多くを再利用します。可能な場合は、既存のコンテンツへの参照が提供されます。
Oracle Coherence RESTのセキュリティは、デフォルトでは無効になっており、必要に応じて有効化されます。認証と認可は、別々に構成されます。認証は、<http-acceptor要素内の<auth-method要素を使用してキャッシュ構成ファイルで構成されます。<auth-method要素の詳細は、『Oracle Coherenceでのアプリケーションの開発』を参照してください。認可の実装の詳細は、「Extendクライアントの認可の実装」を参照してください。
HTTP Basic認証は、HTTP認可リクエスト・ヘッダーにエンコードされて送信される資格証明(ユーザー名とパスワード)を使用して認証を行います。HTTP Basic認証では、この項で説明するJava Authentication and Authorization Service (JAAS)ログイン・モジュールが必要です。
Basic認証を指定するには、http-acceptor要素内に、basicに設定された<auth-method>要素を追加します。
<proxy-scheme>
<service-name>RestHttpProxyService</service-name>
<acceptor-config>
<http-acceptor>
...
<auth-method>basic</auth-method>
</http-acceptor>
</acceptor-config>
<autostart>true</autostart>
</proxy-scheme>
HTTP Basic認証は、HTTP Basic認証ヘッダーから渡されたクライアントの資格証明を認証するJAAS javax.security.auth.spi.LoginModule実装を必要とします。その結果として生成されるSubjectは、必要に応じて、Oracle Coherence*Extendスタイルの認可とOracle Coherenceセキュリティ・フレームワークの認可の両方で使用できます。JAASおよびLoginModule実装の作成に関する説明は、JAASリファレンス・ガイドを参照してください。
http://docs.oracle.com/javase/7/docs/technotes/guides/security/jaas/JAASRefGuide.html
ログイン・モジュールを指定するには、COHERENCE_HOME/lib/security/login.configログイン構成ファイルを変更し、使用するログイン・モジュール実装を含むCoherenceRESTエントリを追加します。次に例を示します。
CoherenceREST {
package.MyLoginModule required debug=true;
};
実行時、コマンド行から(java.security.auth.login.configシステム・プロパティを使用)、またはJavaセキュリティ・プロパティ・ファイルで、使用するlogin.configファイルを指定します。詳細は、次を参照してください。
http://docs.oracle.com/javase/7/docs/technotes/guides/security/jaas/JAASLMDevGuide.html
便宜を図るため、標準的なJavaランタイム・クラスにのみ依存するJavaキーストア(JKS) LoginModuleの実装が用意されています。このクラスは、COHERENCE_HOME/lib/security/coherence-login.jarファイルにあります。実装を使用するには、このライブラリを、プロキシ・サーバーのクラスパスか、JREのlib/ext (標準拡張)ディレクトリに配置します。
login.config構成ファイルで、次のとおりJKSログイン・モジュール実装を指定します。
CoherenceREST {
com.tangosol.security.KeystoreLogin required
keyStorePath="${user.dir}${/}security${/}keystore.jks";
};
エントリには、キーストアへのパスが含まれています。keyStorePath変数をキーストアの場所に変更します。キーストアの作成手順については、「Java SSLアーティファクトの生成」を参照してください。
SSLは、デジタル証明書および暗号化キーを使用して識別と信頼の両方を確立する認証メカニズムを提供します。SSLアーティファクトの生成など、SSLの概要については、「SSLの概要」を参照してください。
クライアント側のSSL証明書は、クライアントを認証するHTTPアクセプタに渡されます。SSLでは、SSLベースのソケット・プロバイダがHTTPアクセプタ用に構成されている必要があります。次の手順では、SSLを構成し、プロキシでHTTPアクセプタ用のSSLソケット・プロバイダを定義する方法についてのみ説明します。クライアント側でのSSLの設定手順については、RESTのクライアント・ライブラリに関するドキュメントを参照してください。
SSL認証を指定するには、http-acceptor要素内に、certに設定された<auth-method>要素を追加します。
<proxy-scheme>
<service-name>RestHttpProxyService</service-name>
<acceptor-config>
<http-acceptor>
...
<auth-method>cert</auth-method>
</http-acceptor>
</acceptor-config>
<autostart>true</autostart>
</proxy-scheme>
認証にSSLを使用する場合は、HTTPアクセプタ用のSSLソケット・プロバイダを構成します。HTTPアクセプタ用にSSLを構成するには、SSLソケット・プロバイダ定義を明示的に追加するか、オペレーション・オーバーライド・ファイル内のSSLソケット・プロバイダ定義を参照します。
SSLソケット・プロバイダの明示的な定義
HTTPアクセプタ用にSSLソケット・プロバイダを明示的に構成するには、各<proxy-scheme定義の<http-acceptor要素内に<socket-provider要素を追加します。<socket-provider要素の詳細なリファレンスは、『Oracle Coherenceでのアプリケーションの開発』を参照してください。
例8-1は、<protocol>要素および<algorithm>要素にデフォルト値(それぞれ、TLSおよびSunX509)を使用するSSLソケット・プロバイダの構成を示しています。これらは完全を期して示しますが、デフォルト値使用の際には省略されることがあります。
例8-1では、アイデンティティ・キーストア(server.jks)と信頼キーストア(trust.jks)の両方を構成します。これは典型的な双方向SSL認証であり、クライアントとプロキシの双方が、デジタル証明書を交換し、互いのIDを確認する必要があります。一方向SSL認証の場合は、プロキシ・サーバーの構成にアイデンティティ・キーストアを含める必要がありますが、信頼キーストアは含める必要がありません。
例8-1 HTTP Acceptor用のSSL構成のサンプル
<proxy-scheme>
<service-name>RestHttpProxyService</service-name>
<acceptor-config>
<http-acceptor>
...
<socket-provider>
<ssl>
<protocol>TLS</protocol>
<identity-manager>
<algorithm>SunX509</algorithm>
<key-store>
<url>file:server.jks</url>
<password>password</password>
<type>JKS</type>
</key-store>
<password>password</password>
</identity-manager>
<trust-manager>
<algorithm>SunX509</algorithm>
<key-store>
<url>file:trust.jks</url>
<password>password</password>
<type>JKS</type>
</key-store>
</trust-manager>
</ssl>
</socket-provider>
...
<auth-method>cert</auth-method>
</http-acceptor>
</acceptor-config>
<autostart>true</autostart>
</proxy-scheme>
SSLソケット・プロバイダ定義の参照
次の例では、オペレーション・デプロイメント・ディスクリプタの<socket-providers要素で定義されているSSLソケット・プロバイダの構成を、構成のid属性(ssl)を指定することによって参照します。<socket-providers要素の詳細なリファレンスは、『Oracle Coherenceでのアプリケーションの開発』を参照してください。
注意:
事前定義済SSLソケット・プロバイダが、オペレーション・デプロイメント・ディスクリプタに含まれており、sslという名前です。事前定義済SSLソケット・プロバイダは、双方向SSL接続用に構成されており、信頼されているピアがすべて単一のJKSキーストア内に存在するピア信頼に基づいています。詳細は、「事前定義済SSLソケット・プロバイダの使用方法」を参照してください。別のSSLソケット・プロバイダを構成するには、オペレーション・オーバーライド・ファイルを使用して事前定義済SSLソケット・プロバイダを変更するか、必要に応じてソケット・プロバイダの構成を作成します。
<proxy-scheme>
<service-name>RestHttpProxyService</service-name>
<acceptor-config>
<http-acceptor>
...
<socket-provider>ssl</socket-provider>
...
<auth-method>cert</auth-method>
</http-acceptor>
</acceptor-config>
<autostart>true</autostart>
</proxy-scheme>
次の例は、証明書およびHTTP Basic認証を要求するRESTサービスにアクセスするJerseyベースのクライアントを示しています。Jerseyクライアントの作成に関する詳細は、http://jersey.java.net/nonav/documentation/latest/index.htmlを参照してください。
クライアントSSL構成ファイル
クライアントSSL構成ファイル(ssl.xml)では、クライアントのキーストアおよび信頼キーストアを構成します。
<ssl>
<identity-manager>
<key-store>
<url>file:keystore.jks</url>
<password>password</password>
</key-store>
<password>password</password>
</identity-manager>
<trust-manager>
<key-store>
<url>file:trust.jks</url>
<password>password</password>
</key-store>
</trust-manager>
</ssl>
Jersey SSLクライアントのサンプル
package example;
import com.oracle.common.net.SSLSocketProvider;
import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.ClientResponse;
import com.sun.jersey.api.client.WebResource;
import com.sun.jersey.api.client.config.DefaultClientConfig;
import com.sun.jersey.client.urlconnection.HTTPSProperties;
import com.sun.jersey.api.client.filter.HTTPBasicAuthFilter;
import com.tangosol.internal.net.ssl.LegacyXmlSSLSocketProviderDependencies;
import com.tangosol.run.xml.XmlDocument;
import com.tangosol.run.xml.XmlHelper;
import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.SSLSession;
import javax.ws.rs.core.MediaType;
public class SslExample
{
public static Client createHttpsClient(SSLSocketProvider provider)
{
DefaultClientConfig dcc = new DefaultClientConfig();
HTTPSProperties prop = new HTTPSProperties(new HostnameVerifier()
{
public boolean verify(String s, SSLSession sslSession)
{
return true;
}
}, provider.getDependencies().getSSLContext());
dcc.getProperties().put(HTTPSProperties.PROPERTY_HTTPS_PROPERTIES, prop);
return Client.create(dcc);
}
public static void PUT(String url, MediaType mediaType, String data)
{
process(url, "put", mediaType, data);
}
public static void GET(String url, MediaType mediaType)
{
process(url, "get", mediaType, null);
}
public static void POST(String url, MediaType mediaType, String data)
{
process(url, "post", mediaType, data);
}
public static void DELETE(String url, MediaType mediaType)
{
process(url, "delete", mediaType, null);
}
static void process(String url, String action, MediaType mediaType, String
data)
{
try
{
XmlDocument xml = XmlHelper.loadFileOrResource("/ssl.xml", null);
SSLSocketProvider provider = new SSLSocketProvider(new
LegacyXmlSSLSocketProviderDependencies(xml));
Client client = createHttpsClient(provider);
ClientResponse response = null;
WebResource webResource = client.resource(url);
// If you've specified the "cert+basic" auth-method in your Proxy
// http-acceptor configuration, initialize and add an HTTP basic
// authentication filter by
// uncommenting the following line and changing the username and password
// appropriately.
//client.addFilter(new HTTPBasicAuthFilter("username", "password"));
if (action.equalsIgnoreCase("get"))
{
response = webResource.type(mediaType).get(ClientResponse.class);
}
else if (action.equalsIgnoreCase("post"))
{
response = webResource.type(mediaType).post
(ClientResponse.class, data);
}
else if (action.equalsIgnoreCase("put"))
{
response = webResource.type(mediaType).put
(ClientResponse.class, data);
}
else if (action.equalsIgnoreCase("delete"))
{
response = webResource.type(mediaType).delete
(ClientResponse.class, data);
}
System.out.println("response status:" + response.getStatus());
if (action.equals("get"))
{
System.out.println("Result: " + response.getEntity(String.class));
}
}
catch (Exception e)
{
e.printStackTrace();
}
}
public static void main(String args[])
{
PUT("https://localhost:8080/dist-http-example/1",
MediaType.APPLICATION_JSON_TYPE, "{\"name\":\"chris\",\"age\":32}");
PUT("https://localhost:8080/dist-http-example/2",
MediaType.APPLICATION_XML_TYPE,
"<person><name>admin</name><age>30</age></person>");
DELETE("https://localhost:8080/dist-http-example/1",
MediaType.APPLICATION_XML_TYPE);
GET("https://localhost:8080/dist-http-example/2",
MediaType.APPLICATION_XML_TYPE);
}
}
HTTP Basic認証の使用は、SSL認証の使用を妨げるものではありません。つまり、HTTP Basic認証とSSLの両方を併用して、保護を強化することが可能です。SSLおよびHTTP Basic認証の両方を設定する方法の詳細は、それぞれ「Oracle Coherence RESTでのHTTP Basic認証の使用方法」および「Oracle Coherence RESTでのSSL認証の使用方法」を参照してください。
HTTP Basic認証とSSLの両方を使用するように指定するには、http-acceptor要素内に、cert+basicに設定された<auth-method>要素を追加します。
<proxy-scheme>
<service-name>RestHttpProxyService</service-name>
<acceptor-config>
<http-acceptor>
...
<socket-provider>
<ssl>
...
</ssl>
</socket-provider>
...
<auth-method>cert+basic</auth-method>
</http-acceptor>
</acceptor-config>
<autostart>true</autostart>
</proxy-scheme>
Oracle Coherence RESTは、Oracle Coherence*Extend認可フレームワークを使用して、RESTクライアントがクラスタで実行できる操作を制限します。Oracle Coherence*Extendスタイルの認可の実装手順の詳細は、「Extendクライアントの認可の実装」を参照してください。
RESTでのOracle Coherence*Extendスタイルの認可は、HTTP Basic認証、またはHTTP Basic認証とSSL認証の併用を必要とします。つまり、認可を実装する際、HTTP Basic認証とSSLを併用して、保護を強化することが可能です。HTTP Basic認証の使用方法の詳細は、「Oracle Coherence RESTでのHTTP Basic認証の使用方法」を参照してください。SSLとHTTP Basic認証の併用方法の詳細は、「Oracle Coherence RESTでのSSLおよびHTTP Basic認証の使用方法」を参照してください。
注意:
SSLとHTTP Basic認証を併用する場合、HTTP Basic認証の設定に加えて、「Oracle Coherence RESTでのSSL認証の使用方法」で示されているようにSSLを設定してください。