第7章 セキュリティーの設定

7.1. リモート接続のセキュリティー保護

7.1.1. レガシーセキュリティーサブシステムの使用

JBoss EAP でレガシー security サブシステムを使用して、messaging-activemq サブシステムをセキュアにできます。レガシー security サブシステムはレガシーセキュリティーレルムおよびドメインを使用します。セキュリティーレルムおよびセキュリティードメインに関する詳細は、JBoss EAP『セキュリティーアーキテクチャー』ガイドを参照してください。messaging-activemq サブシステムは、ApplicationRealm という名前のセキュリティーレルムと other という名前のセキュリティードメインを使用するよう事前設定されています。

注記

レガシー security サブシステムのアプローチは、JBoss EAP 7.0 のデフォルト設定です。

ApplicationRealm は、設定ファイルの最上部付近で定義されます。

<management>
  <security-realms>
      ...
       <security-realm name="ApplicationRealm">
          <authentication>
              <local default-user="$local" allowed-users="*" skip-group-loading="true"/>
              <properties
                path="application-users.properties"
                relative-to="jboss.server.config.dir" />
          </authentication>
          <authorization>
              <properties
                path="application-roles.properties"
                relative-to="jboss.server.config.dir" />
          </authorization>
       </security-realm>
  </security-realms>
  ...
</management>

この名前が示すように、ApplicationRealmmessaging-activemqundertowejb3 サブシステムなどの JBoss EAP のすべてのアプリケーション中心のサブシステムに対するデフォルトのセキュリティーレルムです。ApplicationRealm は、ローカルファイルシステムを使用して、ユーザー名とハッシュ化されたパスワードを保存します。便宜上、JBoss EAP には ApplicationRealm にユーザーを追加するために使用できるスクリプトが含まれています。詳細は、JBoss EAP『How To Configure Server Security』の「Default User Configuration」を参照してください。

other セキュリティードメインは、messaging-activemq などのアプリケーション関連のサブシステムに対するデフォルトのセキュリティードメインです。これは設定で明示的に宣言されるものではありませんが、以下の管理 CLI コマンドを使用すると、messaging-activemq サブシステムで使用されるセキュリティードメインを確認することができます。

/subsystem=messaging-activemq/server=default:read-attribute(name=security-domain)
{
    "outcome" => "success",
    "result" => "other"
}

また、使用するセキュリティードメインを更新することもできます。

/subsystem=messaging-activemq/server=default:write-attribute(name=security-domain, value=mySecurityDomain)

JBoss EAP『How To Configure Server Security』ガイドには、新しいセキュリティーレルムおよびドメインの作成方法についての詳細が記載されています。ここでは、other ドメインが設定内にどのように表示されるかに注目すべきです。

<subsystem xmlns="urn:jboss:domain:security:2.0">
     <security-domains>
         <security-domain name="other" cache-type="default">
             <authentication>
                 <login-module code="Remoting" flag="optional">
                     <module-option name="password-stacking" value="useFirstPass"/>
                 </login-module>
                 <login-module code="RealmDirect" flag="required">
                     <module-option name="password-stacking" value="useFirstPass"/>
                 </login-module>
             </authentication>
         </security-domain>
         ...
     <security-domains>
 </subsystem>

「other」ドメインでは、認証手段として 2 つの login-module を使用しています。最初のモジュール Remoting がリモート EJB 呼び出しを認証し、RealmDirect モジュールが、指定されたレルムに定義されている保存情報を使用してユーザーを認証します。この例では、レルムが宣言されていないため、デフォルトのレルム ApplicationRealm が使用されます。各モジュールの password-stacking オプションは useFirstPass に設定されており、認証されたユーザーのプリンシパル名とパスワードを格納するよう login-module に伝えます。ログインモジュールおよびそれらのオプションに関する詳細は、JBoss EAP『Login Module Reference』を参照してください。

ロールベースのアクセスはアドレスレベルで設定されます。アドレスの「ロールベースのセキュリティー」を参照してください。

7.1.2. Elytron サブシステムの使用

elytron サブシステムを使用して messaging-activemq サブシステムをセキュアにすることもできます。elytron サブシステムの使用および Elytron セキュリティードメインの作成に関する詳細は、『How to Configure Identity Management』ガイドの「Elytron Subsystem」セクションを参照してください。

Elytron セキュリティードメインを使用するには、以下を指定します。

  1. レガシーセキュリティードメインの定義を解除します。

    /subsystem=messaging-activemq/server=default:undefine-attribute(name=security-domain)
  2. Elytron セキュリティードメインを設定します。

    /subsystem=messaging-activemq/server=default:write-attribute(name=elytron-domain, value=myElytronSecurityDomain)
    
    reload

7.1.2.1. 管理コンソールを使用した Elytron セキュリティードメインの設定

管理コンソールを使用して Elytron セキュリティードメインを設定するには、以下の操作を行います。

  1. 管理コンソールにアクセスします。詳細は、JBoss EAP『設定ガイド』の「管理コンソール」を参照してください。
  2. ConfigurationSubsystemsMessaging (ActiveMQ)Serverdefault と選択し、View をクリックします。
  3. Security タブに移動し、Edit をクリックします。
  4. Elytron Domainの値を追加または編集します。
  5. 保存をクリックして変更を保存します。
  6. 変更を反映するためにサーバーをリロードします。
注記

security-domain または elytron-domain のいずれかを定義できますが、両方を同時に定義することはできません。いずれも定義されていない場合、JBoss EAP は other のデフォルト値 security-domain を使用します。これは other のレガシーセキュリティードメインに対応します。

7.1.3. トランスポートのセキュリティー保護

JBoss EAP メッセージングにバンドルされたデフォルトの http-connector は、デフォルトではセキュリティー保護されていません。JBoss EAP『How to Configure Server Security』の「configure one-way and two-way SSL/TLS for applications」の手順に従って、メッセージトランスポートのセキュリティーを保護し、SSL/TLS の Web トラフィックを有効にできます。

注記

メッセージトランスポートのセキュリティーを保護する上記の方法は、http-acceptor のセキュリティー保護にも使用できます。

上記のようにトランスポートを設定する場合は、以下の手順を追加する必要があります。

  • デフォルトでは、HTTP アクセプターはすべて、デフォルトの http-listener を使用し、その HTTP ポートでリッスンするように設定されています。HTTP アクセプターは https-listener を使用して HTTPS ポートでリッスンするように設定する必要があります。
  • すべての HTTP コネクターの socket-binding 要素は、http ではなく https を使用するように更新する必要があります。
  • SSL/TLS 経由で通信する http-connectorssl-enabled パラメーターは true に設定する必要があります。
  • HTTP コネクターが別のサーバーへの接続に使用される場合は、trust-storekey-store などの関連するパラメーターを設定する必要があります。http-connector のセキュリティーを保護するには、remote-connector と同様のパラメーター設定を行う必要があります。設定の詳細は「リモートコネクターのセキュリティー保護」で説明されています。

メッセージングトランスポートのアクセプターとコネクターの設定の詳細は、「メッセージングトランスポートの設定」を参照してください。

7.1.4. リモートコネクターのセキュリティー保護

TCP 通信にデフォルトの http-connector を使用せず、代わりに独自の remote-connectorremote-acceptor を作成した場合、以下の表のプロパティーを使用して SSL/TLS を設定できます。以下のプロパティーは、アクセプターまたはコネクターの子 <param> 要素の一部として設定に表示されます。

通常、サーバーは SSL/TLS 秘密鍵を所有し、その公開鍵をクライアントと共有します。この場合、サーバーは remote-acceptorkey-store-path パラメーターおよび key-store-password パラメーターを定義します。各クライアントは異なる場所にトラストストアを持ち、異なるパスワードで暗号化できます。そのため、remote-connectortrust-store-path プロパティーと trust-store-password プロパティーを指定することは推奨されません。代わりに、システムプロパティー javax.net.ssl.trustStorejavax.net.ssl.trustStorePassword を使用してクライアント側のこれらのパラメーターを設定します。remote-connector で設定する必要があるパラメーターは ssl-enabled=true だけです。ただし、サーバーが remote-connector を使用して別のサーバーに接続する場合は、remote-connectortrust-store-path パラメーターと trust-store-password パラメーターを設定するのが適切です。

上記のユースケースでは、以下の管理 CLI コマンドを使用して remote-acceptor を作成します。

/subsystem=messaging-activemq/server=default/remote-acceptor=mySslAcceptor:add(socket-binding=netty,params={ssl-enabled=true, key-store-path=PATH/TO/server.jks, key-store-password=${VAULT::server-key::key-store-password::sharedKey}})

上記のユースケースから remote-connector を作成するには、以下の管理 CLI コマンドを使用します。

/subsystem=messaging-activemq/server=default/remote-connector=mySslConnector:add(socket-binding=netty,params={ssl-enabled=true})

管理 CLI を使用して、次のように既存の remote-acceptor または remote-connector にパラメーターを追加することもできます。

/subsystem=messaging-activemq/server=default/remote-connector=myOtherSslConnector:map-put(name=params,key=ssl-enabled,value=true)

remote-acceptorremote-connector では両方とも、通信に使用されるポートを宣言する際に socket-binding を参照することに注意してください。ソケットバインディングおよびアクセプターとコネクターとの関係についての詳細は、「メッセージングサブシステム設定の概要」を参照してください。

表7.1 NettyConnectorFactory の SSL/TLS 関連の設定プロパティー

プロパティー説明

enabled-cipher-suites

アクセプターまたはコネクターの設定に使用できます。これは、SSL/TLS 通信に使用される暗号化スイートのコンマで区切ったリストです。デフォルト値は null です (JVM のデフォルト値を使用)。

enabled-protocols

アクセプターまたはコネクターの設定に使用できます。これは、SSL/TLS 通信に使用されるプロトコルのコンマ区切りのリストです。デフォルト値は null です (JVM のデフォルト値を使用)。

key-store-password

アクセプターで使用されると、サーバー側のキーストアのパスワードになります。

コネクターで使用されると、クライアント側のキーストアのパスワードになります。双方向 SSL/TLS を使用している場合、これはコネクターにのみ関係してきます。この値はサーバー上で設定可能ですが、ダウンロードしてクライアントで使用します。

クライアントでサーバーの設定と異なるパスワードを使用する必要がある場合は、標準の javax.net.ssl.keyStorePassword システムプロパティーのいずれかを使用してサーバー側の設定をオーバーライドできます。クライアント上の別のコンポーネントで標準のシステムプロパティーをすでに使用している場合は、org.apache.activemq.ssl.keyStorePassword プロパティーを使用します。

key-store-path

アクセプターで使用される場合、これはサーバーの証明書を保持するサーバーの SSL/TLS キーストアへのパスとなります。自己署名証明書または認証局が署名した証明書のいずれかに使用します。

コネクターで使用される場合、これはクライアント証明書を保持するクライアント側の SSL/TLS キーストアへのパスとなります。双方向 SSL/TLS を使用している場合、これはコネクターにのみ関係してきます。

この値はサーバー上で設定されますが、ダウンロードしてクライアントで使用します。クライアントでサーバーの設定と異なるパスを使用する必要がある場合は、標準の javax.net.ssl.keyStore システムプロパティーを使用してサーバー側の設定をオーバーライドできます。クライアント上の別のコンポーネントで標準のプロパティーをすでに使用している場合は、org.apache.activemq.ssl.keyStore システムプロパティーを使用します。

key-store-provider

キーを保存するファイルの形式 (PKCS11 や PKCS12 など) を定義します。許可される値は JDK に固有のものです。

needs-client-auth

このプロパティーはアクセプター専用です。このプロパティーは、このアクセプターに接続するクライアントに双方向 SSL/TLS が必要であることを伝えます。有効な値は true または false です。デフォルトは false です。

ssl-enabled

SSL/TLS を有効にするには true にする必要があります。デフォルトは false です。

trust-store-password

アクセプターで使用されると、サーバー側のトラストストアのパスワードになります。双方向 SSL/TLS を使用している場合、これはアクセプターにのみ関係してきます。

コネクターで使用されると、クライアント側のトラストストアのパスワードになります。この値はサーバー上で設定可能ですが、ダウンロードしてクライアントで使用します。

クライアントでサーバーの設定と異なるパスワードを使用する必要がある場合は、標準の javax.net.ssl.newKieSessionPassword システムプロパティーのいずれかを使用してサーバー側の 設定をオーバーライドできます。クライアント上の別のコンポーネントで標準のプロパティーをすでに使用している場合は、org.apache.activemq.ssl.trustStorePassword システムプロパティーを使用します。

trust-store-path

アクセプターで使用される場合、これはサーバーが信頼するすべてのクライアントのキーを保持するサーバー側の SSL/TLS キーストアへのパスとなります。双方向 SSL/TLS を使用している場合、これはアクセプターにのみ関係してきます。

コネクターで使用される場合、これはクライアント側の SSL/TLS キーストアへのパスとなります。これは、クライアントが信頼するすべてのサーバーの公開鍵を保持します。この値はサーバー上で設定可能ですが、ダウンロードしてクライアントで使用します。

クライアントでサーバーの設定と異なるパスを使用する必要がある場合は、標準の javax.net.ssl.newKieSession システムプロパティーのいずれかを使用してサーバー側の 設定をオーバーライドできます。クライアント上の別のコンポーネントがすでに標準のシステムプロパティーを使用している場合は、org.apache.activemq.ssl.trustStore システムプロパティーを使用します。

trust-store-provider

キーを保存するファイルの形式 (PKCS11 や PKCS12 など) を定義します。許可される値は JDK に固有のものです。