Java サービスでのサービス リモート処理通信をセキュリティで保護する
セキュリティは、通信の最も重要な側面の 1 つです。 Reliable Services アプリケーション フレームワークに最初から用意されている通信スタックとツールを利用してセキュリティを確保することができます。 この記事では、Java サービスでサービス リモート処理を使用している場合の、セキュリティの改善方法について説明します。 これは、Java で記述された Reliable Services のリモート処理の設定方法について説明した、既存の例を基に構築されます。
Java サービスでリモート処理を使用している場合、サービスのセキュリティを確保するには、次の手順を実行します。
サービスのリモート プロシージャ コールで使用できるメソッドを定義するインターフェイス (
HelloWorldStateless
) を作成します。 実際のサービスでは、microsoft.serviceFabric.services.remoting.fabricTransport.runtime
パッケージに宣言されているFabricTransportServiceRemotingListener
を使用します。 これは、リモート処理機能を提供するCommunicationListener
の実装です。public interface HelloWorldStateless extends Service { CompletableFuture<String> getHelloWorld(); } class HelloWorldStatelessImpl extends StatelessService implements HelloWorldStateless { @Override protected List<ServiceInstanceListener> createServiceInstanceListeners() { ArrayList<ServiceInstanceListener> listeners = new ArrayList<>(); listeners.add(new ServiceInstanceListener((context) -> { return new FabricTransportServiceRemotingListener(context,this); })); return listeners; } public CompletableFuture<String> getHelloWorld() { return CompletableFuture.completedFuture("Hello World!"); } }
リスナー設定とセキュリティ資格情報を追加します。
サービスの通信のセキュリティ保護に使用する証明書が、クラスター内のすべてのノードにインストールされていることを確認します。 Linux 上で実行されているサービスの場合、証明書は PEM 形式のファイルとして提供される必要があります。つまり、証明書と秘密キーを格納した
.pem
ファイルを使用するか、証明書を格納した.crt
ファイルと秘密キーを格納した.key
ファイルを使用します。 詳しくは、「Linux ノード上の X.509 証明書の場所と形式」をご覧ください。リスナー設定とセキュリティ資格情報は、次の 2 とおりの方法で指定できます。
構成パッケージを使用して指定する。
settings.xml ファイルに、名前付きの
TransportSettings
セクションを追加します。<!--Section name should always end with "TransportSettings".--> <!--Here we are using a prefix "HelloWorldStateless".--> <Section Name="HelloWorldStatelessTransportSettings"> <Parameter Name="MaxMessageSize" Value="10000000" /> <Parameter Name="SecurityCredentialsType" Value="X509_2" /> <Parameter Name="CertificatePath" Value="/path/to/cert/BD1C71E248B8C6834C151174DECDBDC02DE1D954.crt" /> <Parameter Name="CertificateProtectionLevel" Value="EncryptandSign" /> <Parameter Name="CertificateRemoteThumbprints" Value="BD1C71E248B8C6834C151174DECDBDC02DE1D954" /> </Section>
この場合、
createServiceInstanceListeners
メソッドは次のようになります。protected List<ServiceInstanceListener> createServiceInstanceListeners() { ArrayList<ServiceInstanceListener> listeners = new ArrayList<>(); listeners.add(new ServiceInstanceListener((context) -> { return new FabricTransportServiceRemotingListener(context,this, FabricTransportRemotingListenerSettings.loadFrom(HelloWorldStatelessTransportSettings)); })); return listeners; }
プレフィックスを指定せずに settings.xml ファイルに
TransportSettings
セクションを追加すると、FabricTransportListenerSettings
は、既定で、このセクションからすべての設定を読み込みます。<!--"TransportSettings" section without any prefix.--> <Section Name="TransportSettings"> ... </Section>
この場合、
CreateServiceInstanceListeners
メソッドは次のようになります。protected List<ServiceInstanceListener> createServiceInstanceListeners() { ArrayList<ServiceInstanceListener> listeners = new ArrayList<>(); listeners.add(new ServiceInstanceListener((context) -> { return new FabricTransportServiceRemotingListener(context,this); })); return listeners; }
セキュリティで保護されたサービスのメソッドをリモート処理スタックで呼び出すときは、
microsoft.serviceFabric.services.remoting.client.ServiceProxyBase
クラスを使用してサービス プロキシを作成する代わりにmicrosoft.serviceFabric.services.remoting.client.FabricServiceProxyFactory
を使用してください。クライアント コードがサービスの一部として実行されている場合は、settings.xml ファイルから
FabricTransportSettings
を読み込むことができます。 上記のように、サービス コードに似た TransportSettings セクションを作成します。 クライアント コードを次のように変更します。FabricServiceProxyFactory serviceProxyFactory = new FabricServiceProxyFactory(c -> { return new FabricTransportServiceRemotingClientFactory(FabricTransportRemotingSettings.loadFrom("TransportPrefixTransportSettings"), null, null, null, null); }, null) HelloWorldStateless client = serviceProxyFactory.createServiceProxy(HelloWorldStateless.class, new URI("fabric:/MyApplication/MyHelloWorldService")); CompletableFuture<String> message = client.getHelloWorld();