第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>
この名前が示すように、ApplicationRealm
は messaging-activemq
、undertow
、ejb3
サブシステムなどの JBoss EAP のすべてのアプリケーション中心のサブシステムに対するデフォルトのセキュリティーレルムです。ApplicationRealm
は、ローカルファイルシステムを使用して、ユーザー名とハッシュ化されたパスワードを保存します。便宜上、JBoss EAP には ApplicationRealm
にユーザーを追加するために使用できるスクリプトが含まれています。詳細は、JBoss EAPHow 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 EAPHow 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 EAPLogin Module Reference を参照してください。
ロールベースのアクセスはアドレスレベルで設定されます。アドレスのロールベースのセキュリティー を参照してください。
7.1.2. Elytron サブシステムの使用
elytron
サブシステムを使用して messaging-activemq
サブシステムをセキュアにすることもできます。elytron
サブシステムの使用および Elytron セキュリティードメインの作成に関する詳細は、How to Configure Identity Managementガイドの Elytron Subsystem セクションを参照してください。
Elytron セキュリティードメインを使用するには、以下を指定します。
レガシーセキュリティードメインの定義を解除します。
/subsystem=messaging-activemq/server=default:undefine-attribute(name=security-domain)
Elytron セキュリティードメインを設定します。
/subsystem=messaging-activemq/server=default:write-attribute(name=elytron-domain, value=myElytronSecurityDomain) reload
7.1.2.1. 管理コンソールを使用した Elytron セキュリティードメインの設定
管理コンソールを使用して Elytron セキュリティードメインを設定するには、以下の操作を行います。
- 管理コンソールにアクセスします。詳細は、JBoss EAP 設定ガイドの 管理コンソール を参照してください。
- Configuration → Subsystems → Messaging (ActiveMQ) → Server → default と選択し、View をクリックします。
- Security タブに移動し、Edit をクリックします。
- Elytron Domainの値を追加または編集します。
- 保存をクリックして変更を保存します。
- 変更を反映するためにサーバーをリロードします。
security-domain
または elytron-domain
のいずれかを定義できますが、両方を同時に定義することはできません。いずれも定義されていない場合、JBoss EAP は other
のデフォルト値 security-domain
を使用します。これは other
のレガシーセキュリティードメインに対応します。
7.1.3. トランスポートのセキュリティー保護
JBoss EAP メッセージングにバンドルされたデフォルトの http-connector
は、デフォルトではセキュリティー保護されていません。JBoss EAPHow 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-connector
のssl-enabled
パラメーターはtrue
に設定する必要があります。 -
HTTP コネクターが別のサーバーへの接続に使用される場合は、
trust-store
やkey-store
などの関連するパラメーターを設定する必要があります。http-connector
のセキュリティーを保護するには、remote-connector
と同様のパラメーター設定を行う必要があります。設定の詳細は リモートコネクターのセキュリティー保護 で説明されています。
メッセージングトランスポートのアクセプターとコネクターの設定の詳細は、メッセージングトランスポートの設定 を参照してください。
7.1.4. リモートコネクターのセキュリティー保護
TCP 通信にデフォルトの http-connector
を使用せず、代わりに独自の remote-connector
と remote-acceptor
を作成した場合、以下の表のプロパティーを使用して SSL/TLS を設定できます。以下のプロパティーは、アクセプターまたはコネクターの子 <param>
要素の一部として設定に表示されます。
通常、サーバーは SSL/TLS 秘密鍵を所有し、その公開鍵をクライアントと共有します。この場合、サーバーは remote-acceptor
で key-store-path
パラメーターおよび key-store-password
パラメーターを定義します。各クライアントは異なる場所にトラストストアを持ち、異なるパスワードで暗号化できます。そのため、remote-connector
で trust-store-path
プロパティーと trust-store-password
プロパティーを指定することは推奨されません。代わりに、システムプロパティー javax.net.ssl.trustStore
と javax.net.ssl.trustStorePassword
を使用してクライアント側のこれらのパラメーターを設定します。remote-connector
の設定が必要なパラメーターは ssl-enabled=true
と useDefaultSslContext=true
です。ただし、サーバーが remote-connector
を使用して別のサーバーに接続する場合は、remote-connector
の trust-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, useDefaultSslContext=true})
管理 CLI を使用して、次のように既存の remote-acceptor
または remote-connector
にパラメーターを追加することもできます。
/subsystem=messaging-activemq/server=default/remote-connector=myOtherSslConnector:map-put(name=params,key=ssl-enabled,value=true)
remote-acceptor
と remote-connector
では両方とも、通信に使用されるポートを宣言する際に socket-binding
を参照することに注意してください。ソケットバインディングおよびアクセプターとコネクターとの関係についての詳細は、メッセージングサブシステム設定の概要 を参照してください。
表7.1 NettyConnectorFactory
の SSL/TLS 関連の設定プロパティー
プロパティー | 説明 |
---|---|
enabled-cipher-suites | アクセプターまたはコネクターの設定に使用できます。これは、SSL/TLS 通信に使用される暗号化スイートのコンマで区切ったリストです。デフォルト値は null です (JVM のデフォルト値を使用)。 |
enabled-protocols | アクセプターまたはコネクターの設定に使用できます。これは、SSL/TLS 通信に使用されるプロトコルのコンマ区切りのリストです。デフォルト値は null です (JVM のデフォルト値を使用)。 |
key-store-password |
アクセプターで使用されると、サーバー側のキーストアのパスワードになります。 |
key-store-path |
アクセプターで使用される場合、これはサーバーの証明書を保持するサーバーの SSL/TLS キーストアへのパスとなります。自己署名証明書または認証局が署名した証明書のいずれかに使用します。 |
key-store-provider | キーを保存するファイルの形式 (PKCS11 や PKCS12 など) を定義します。許可される値は JDK に固有のものです。 |
needs-client-auth |
このプロパティーはアクセプター専用です。このプロパティーは、このアクセプターに接続するクライアントに双方向 SSL/TLS が必要であることを伝えます。有効な値は |
ssl-enabled |
SSL/TLS を有効にするには |
trust-store-password |
アクセプターで使用されると、サーバー側のトラストストアのパスワードになります。双方向 SSL/TLS を使用している場合、これはアクセプターにのみ関係してきます。 |
trust-store-path |
アクセプターで使用される場合、これはサーバーが信頼するすべてのクライアントのキーを保持するサーバー側の SSL/TLS キーストアへのパスとなります。双方向 SSL/TLS を使用している場合、これはアクセプターにのみ関係してきます。 |
trust-store-provider | キーを保存するファイルの形式 (PKCS11 や PKCS12 など) を定義します。許可される値は JDK に固有のものです。 |