8 Oracle Coherence RESTの保護
この章の内容は次のとおりです。
Oracle Coherence RESTの保護の概要
Oracle Coherence RESTでのHTTP Basic認証の使用方法
この項には次のトピックが含まれます:
HTTPアクセプタの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セキュリティ・フレームワークの認可の両方で使用できます。『Java認証・承認サービス(JAAS)リファレンス・ガイド』のLoginModuleに関する項を参照してください。
ログイン・モジュールを指定するには、COHERENCE_HOME
/lib/security/login.config
ログイン構成ファイルを変更し、使用するログイン・モジュール実装を含むCoherenceREST
エントリを追加します。たとえば:
CoherenceREST { package.MyLoginModule required debug=true; };
実行時、コマンド行から(java.security.auth.login.config
システム・プロパティを使用)、またはJavaセキュリティ・プロパティ・ファイルで、使用するlogin.config
ファイルを指定します。
便宜を図るため、標準的な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アーティファクトの生成」を参照してください。
Oracle Coherence RESTでのSSL認証の使用方法
クライアント側のSSL証明書は、クライアントを認証するHTTPアクセプタに渡されます。SSLでは、SSLベースのソケット・プロバイダがHTTPアクセプタ用に構成されている必要があります。次の手順では、SSLを構成し、プロキシでHTTPアクセプタ用のSSLソケット・プロバイダを定義する方法についてのみ説明します。クライアント側でのSSLの設定手順については、RESTのクライアント・ライブラリに関するドキュメントを参照してください。
この項には次のトピックが含まれます:
HTTPアクセプタの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アクセプタ用のSSLソケット・プロバイダの構成
認証にSSLを使用する場合は、HTTPアクセプタ用のSSLソケット・プロバイダを構成します。HTTPアクセプタ用にSSLを構成するには、SSLソケット・プロバイダ定義を明示的に追加するか、オペレーション・オーバーライド・ファイル内のSSLソケット・プロバイダ定義を参照します。
SSLソケット・プロバイダの明示的な定義
HTTPアクセプタ用にSSLソケット・プロバイダを明示的に構成するには、各<proxy-scheme>
定義の<http-acceptor>
要素内に<socket-provider>
要素を追加します。Oracle Coherenceでのアプリケーションの開発のsocket-providerを参照してください。
例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
)を指定することによって参照します。『Oracle Coherenceでのアプリケーションの開発』のsocket-providersに関する項を参照してください。
ノート:
事前定義済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>
保護されたRESTサービスへのアクセス
次の例は、証明書およびHTTP Basic認証を要求するRESTサービスにアクセスするJerseyベースのクライアントを示しています。
クライアント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.coherence.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); } }
Oracle Coherence RESTでのSSLおよびHTTP Basic認証の使用方法
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のための認可の実装
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を設定してください。