13 セキュリティ
この章では、JMXテクノロジのセキュリティ機能の設定方法の例を、次のセクション内で説明します。
- 簡単なセキュリティでは、パスワード認証とファイル・アクセス制御に基づいた簡単なセキュリティを実装するコネクタの例を示します。
- 主体委譲では、特定の認証された接続で操作を実行する場合に、複数の異なるIDのかわりに主体委譲モデルを使用するコネクタの例を示します。
- 詳細なセキュリティでは、個々の操作を実行する権限が制御される、より高度なセキュリティ・メカニズムを実装するコネクタの例を示します。
注意:
- アプリケーションでは、ユーザーがパスワードをコマンド行に入力するのではなく、パスワードの入力をユーザーに求めるようにする必要があります。
- 実稼動システムではセキュアな認証メカニズムを使用してください。特に、クライアント・ホストを認証するSSLクライアント証明書とユーザー管理用のパスワード認証の両方を使用します。『Java Platform, Standard Editionモニタリングおよび管理ガイド』のSSLの使用に関する項およびLDAP認証の使用に関する項を参照してください。
簡単なセキュリティ
JMXテクノロジを使用して実装できるもっとも簡単なセキュリティは、暗号化、ユーザー名とユーザー・パスワードの認証、およびファイル・アクセス制御に基づくものです。
簡単なセキュリティの例題クラスを使用したRMIコネクタの分析
-
「簡単なセキュリティ」の項に含まれているソース・コードをコピーし、次の
work_dir/jmx_examples/Security/simple
のサブディレクトリおよび対応するファイルを作成します。/server/Server.java
/config/access.properties
/config/keystore
/config/password.properties
/config/truststore
/mbeans/SimpleStandardMBean.java
/mbeans/SimpleStandard.java
/client/Client.java
/client/ClientListener.java
-
*.java
および*.properties
ファイルをIDEまたはテキスト・エディタで開きます。
次のセクションでは、これらのファイルを分析し、前述したセキュリティ操作をどのように実行するかについて説明します。
簡単なセキュリティの例題のServer.java
次のコード例に、Server.java
クラスを示します。
コード例13-1 RMIコネクタの例題(簡単なセキュリティ)クラスServer.java
public class Server {
public static void main(String[] args) {
try {
MBeanServer mbs = MBeanServerFactory.createMBeanServer();
HashMap env = new HashMap();
SslRMIClientSocketFactory csf =
new SslRMIClientSocketFactory();
SslRMIServerSocketFactory ssf =
new SslRMIServerSocketFactory();
env.put(RMIConnectorServer.
RMI_CLIENT_SOCKET_FACTORY_ATTRIBUTE,csf);
env.put(RMIConnectorServer.
RMI_SERVER_SOCKET_FACTORY_ATTRIBUTE,ssf);
env.put("jmx.remote.x.password.file",
"config" + File.separator + "password.properties");
env.put("jmx.remote.x.access.file",
"config" + File.separator + "access.properties");
JMXServiceURL url = new JMXServiceURL(
"service:jmx:rmi:///jndi/rmi://localhost:9999/server");
JMXConnectorServer cs =
JMXConnectorServerFactory.newJMXConnectorServer(url,
env,
mbs);
cs.start();
} catch (Exception e) {
e.printStackTrace();
}
}
}
このコード例に示すServer
クラスは、MBeanサーバーmbs
を作成し、環境マップenv
にセキュリティ保護されたRMIクライアント・ソケット・ファクトリcsf
、セキュリティ保護されたRMIサーバー・ソケット・ファクトリssf
、およびプロパティ・ファイルpassword.properties
とaccess.properties
を渡します。
プロパティ・ファイルpassword.properties
には、ユーザー名とパスワードが含まれ、JMXリモートAPIインタフェースJMXAuthenticator
を使用してアクセスします。プロパティjmx.remote.x.
password.file
を使用することは、パスワードベースのJMXAuthenticator
を作成し、これをjmx.remote.authenticator
プロパティを通じて環境マップに渡すのと同じ意味を持ちます。
プロパティ・ファイルaccess.properties
には、ユーザー名と一定レベルのアクセス権、readwrite
とreadonly
のいずれかが含まれます。これはアクティブなユーザーが、MBeanサーバー操作にどのレベルでアクセスできるかを表します。このファイルベースのアクセス制御は、アクセス・コントローラMBeanサーバー内に実際のMBeanサーバーをラップする、JMXテクノロジのインタフェースMBeanServerForwarder
を使用して実装されます。アクセス・コントローラMBeanサーバーは、適切なチェックを実行したあとに、実際のMBeanサーバーに要求を転送します。
Server
はRMIコネクタ用にJMXサービスURL、url
を作成します。このRMIコネクタはデフォルトのJRMPトランスポート上で動作し、ローカル・ホストのポート9999
のRMIレジストリにRMIコネクタ・スタブを登録します。
MBeanサーバーmbs
、環境マップenv、およびサービスURL url
はすべてJMXConnectorServer
に渡され、セキュアなJMXコネクタ・サーバーcs
が新規に作成されます。
簡単なセキュリティの例題のSimpleStandardMBean.java
SimpleStandardMBean
クラスは、MBeanの例題のSimpleStandardMBean.javaで使用されたのと同じ簡単なMBeanインタフェースを定義します。
簡単なセキュリティの例題のSimpleStandard.java
SimpleStandard
クラスは、MBeanの例題のSimpleStandard.javaで使用されたのと同じ簡単なMBeanを定義します。
簡単なセキュリティの例題のClientListener.java
ClientListener
クラスは、MBeanの例題のClientListener.javaで使用されたのと同じ簡単な通知リスナーを定義します。
簡単なセキュリティの例題のClient.java
次のコード例に、Client.java
クラスを示します。
コード例13-2 RMIコネクタの例題(簡単なセキュリティ)クラスClient.java
public class Client {
public static void main(String[] args) {
try {
HashMap env = new HashMap();
String[] credentials = new String[] { "username" , "password" };
env.put("jmx.remote.credentials", credentials);
JMXServiceURL url = new JMXServiceURL(
"service:jmx:rmi:///jndi/rmi://localhost:9999/server");
JMXConnector jmxc = JMXConnectorFactory.connect(url, env);
MBeanServerConnection mbsc = jmxc.getMBeanServerConnection();
String domains[] = mbsc.getDomains();
for (int i = 0; i < domains.length; i++) {
System.out.println("Domain[" + i + "] = " + domains[i]);
}
ObjectName mbeanName =
new ObjectName("MBeans:type=SimpleStandard");
mbsc.createMBean("SimpleStandard", mbeanName, null, null);
// Perform MBean operations
[...]
mbsc.removeNotificationListener(mbeanName, listener);
mbsc.unregisterMBean(mbeanName);
jmxc.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
このコード例に示すClient
クラスは、環境マップenv
にServer
が求める資格セット、つまりusername
やpassword
を渡します。これらの資格は、コネクタ・スタブのサービスURLと環境マップがJMXConnectorFactory.connect()
に渡されるときに、JMXConnector
のインスタンスjmxc
に付与されます。Client
はjmxc
を通じて、Server
側で起動されたMBeanに接続し、MBeanの操作を実行します。
接続が確立すると、環境マップenv
で付与された資格はサーバーに送信されます。サーバーは次に、JMXAuthenticator
インタフェースのauthenticate()
メソッドを呼び出し、クライアント資格をパラメータとして渡します。authenticate()
メソッドは、クライアントを認証し、アクセス制御の確認に使用されるプリンシパルのセットを含む被認証者を返します。
簡単なセキュリティを使用したRMIコネクタの例題の実行
簡単なセキュリティを使用したRMIコネクタの例題を実行するには、次のステップを実行します。
-
RMIコネクタの例題を実行します:
$ javac mbeans/SimpleStandard.java \ mbeans/SimpleStandardMBean.java \ server/Server.java \ client/Client.java \ client/ClientListener.java
- ローカル・ホストのポート9999でRMIレジストリを起動します。
$ export CLASSPATH=server ; rmiregistry 9999 &
Server
を起動します。$ java -classpath server:mbeans \ -Djavax.net.ssl.keyStore=config/keystore \ -Djavax.net.ssl.keyStorePassword=password \ Server &
MBeanサーバーとRMIコネクタの作成の確認が表示されます。
Client
を起動します。$java -classpath client:server:mbeans \ -Djavax.net.ssl.trustStore=config/truststore \ -Djavax.net.ssl.trustStorePassword=trustword \ Client
コネクタ・クライアントと各種のMBean操作の作成、および作成後の接続の終了の確認が表示されます。
この例からわかるように、すべての処理が、JMXコネクタで説明した基本的なRMIコネクタの例とまったく同じ方法で進められているように見えます。ただし、password.properties
を開きパスワードを変更する場合、Client
を起動するとjava.lang.SecurityException
が表示され、接続に失敗します。
主体委譲
実装において接続のクライアント側が、簡単なセキュリティで示したセキュリティ・メカニズムを使用して、複数のユーザーまたはアプリケーションにかわって異なる操作を実行する場合、各ユーザーが操作を実行するたびにセキュアな接続を確立する必要があります。コネクタ・クライアントが多くのユーザーと対話することが予測される場合、主体委譲を実装してシステムの負荷を減らすことができます。主体委譲は、ユーザーに対する単一のセキュアな接続を確立します。この接続は、関連する操作を何人ものユーザーにかわって実行するために使用できます。接続自体は認証されたユーザーによって設定されます。別のユーザーに代わって動作することを許可するSubjectDelegationPermission
が認証ユーザーに付与されている場合、そのユーザーにかわって、接続を使った操作を実行できます。
主体委譲の例題クラスを使用したセキュアなRMIコネクタの分析
-
「主体委譲を使用したセキュリティ」の項に含まれているソース・コードをコピーし、次の
work_dir/jmx_examples/Security/subject_delegation
のサブディレクトリおよび対応するファイルを作成します。/server/Server.java
:/config/access.properties
/config/java.policy
/config/password.properties
/mbeans/SimpleStandardMBean.java
/mbeans/SimpleStandard.java
/client/Client.java
/client/ClientListener.java
-
すべての
*.java
および*.properties
ファイルをIDEまたはテキスト・エディタで開きます。
次の各項で、これらのファイルの分析を説明します。
主体委譲の例題のServer.java
次のコード例に、Server.java
クラスを示します。
コード例13-3 セキュアなRMIコネクタ(主体委譲)例題クラスServer.java
public class Server {
public static void main(String[] args) {
try {
MBeanServer mbs = MBeanServerFactory.createMBeanServer();
HashMap env = new HashMap();
env.put("jmx.remote.x.password.file",
"config" + File.separator + "password.properties");
env.put("jmx.remote.x.access.file",
"config" + File.separator + "access.properties");
JMXServiceURL url = new JMXServiceURL(
"service:jmx:rmi:///jndi/rmi://localhost:9999/server");
JMXConnectorServer cs =
JMXConnectorServerFactory.newJMXConnectorServer(url, env, mbs);
cs.start();
} catch (Exception e) {
e.printStackTrace();
}
}
}
このコード例は、MBeanサーバーmbs
の作成から始まります。環境マップenv
には、password.properties
というパスワード・ファイルとaccess.properties
というアクセス・ファイルが格納されます。
- パスワード・ファイルには、ユーザー名とパスワードの組み合わせが収められ、接続を試みるユーザーの認証に使用される。
- アクセス・ファイルには、ユーザー名とアクセス・レベルの組み合わせが含まれ、MBeanサーバーのMBeanへのアクセスの認証に使用される。アクセス・レベルは、読書き可能か読込み専用のいずれか。
次にServer
はコネクタ・サーバーcs
を作成し、前述のRMIコネクタの例題とまったく同じ方法でコネクタ・サーバーを起動します。
主体委譲の例題のjava.policy
java.policy
ファイルはusername
にSubjectDelegationPermission
を付与し、このユーザーがClient
で作成されたJMXPrincipal
のインスタンスである、ユーザーdelegate
の代わりに操作を実行することを許可します。java.policy
ファイルが要求されるのは、Server
クラスの起動時です。
主体委譲の例題のClient.java
次のコード例に、Client.java
クラスを示します。
コード例13-4 セキュアなRMIコネクタ(主体委譲)例題クラスClient.java
public class Client {
public static void main(String[] args) {
try {
HashMap env = new HashMap();
String[] credentials = new String[] { "username" , "password" };
env.put("jmx.remote.credentials", credentials);
JMXServiceURL url = new JMXServiceURL(
"service:jmx:rmi:///jndi/rmi://localhost:9999/server");
JMXConnector jmxc = JMXConnectorFactory.connect(url, env);
Subject delegationSubject =
new Subject(true,
Collections.singleton(new JMXPrincipal("delegate")),
Collections.EMPTY_SET,
Collections.EMPTY_SET);
MBeanServerConnection mbsc =
jmxc.getMBeanServerConnection(delegationSubject);
String domains[] = mbsc.getDomains();
ObjectName mbeanName =
new ObjectName("MBeans:type=SimpleStandard");
mbsc.createMBean("SimpleStandard", mbeanName, null, null);
// Perform MBean operations
//
[...]
mbsc.removeNotificationListener(mbeanName, listener);
mbsc.unregisterMBean(mbeanName);
jmxc.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
このコード例は、ユーザー名username
とパスワードpassword
が格納された環境マップenv
の作成から始まります。これらの文字列は、Server
がコネクタ・サーバーにアクセスするユーザーを認証するために保持するpassword.properties
ファイルに保存されたユーザー名とパスワードに一致します。
JMXテクノロジのコネクタ・クライアントjmxc
は、前述のRMIコネクタの例題と同じ方法で作成され、ユーザー名とパスワードは環境マップenv
に渡されます。
次に、Client
は、JMXPrincipal
のインスタンスであるdelegate
という名前のPrincipal
を使用して、Subject
のインスタンスdelegationSubject
を作成します。
MBeanサーバー接続mbsc
は、JMXConnector
のgetMBeanServerConnection()
メソッドを呼び出し、パラメータとしてdelegationSubject
を渡して作成されます。したがって、このMBeanサーバー接続を使用すると、delegationSubject
に保存されたプリンシパル、この例ではdelegate
という名前のJMXPrincipal
に代わって、リモートMBeanサーバー上で操作を実行できます。
このコード例ではさらに、これまでの例とまったく同じ方法で、MBeanサーバーでSimpleStandard
MBeanが作成および登録され、このMBean上で操作が実行されます。
主体委譲を使用したセキュアなRMIコネクタの例題の実行
主体委譲を使用したセキュアなRMIコネクタの例題を実行するには、次のステップを実行します。
- セキュアなRMIコネクタの例題を実行します:
$ javac mbeans/SimpleStandard.java \ mbeans/SimpleStandardMBean.java \ server/Server.java \ client/Client.java \ client/ClientListener.java
- ローカル・ホストのポート9999でRMIレジストリを起動します。
$ export CLASSPATH=server ; rmiregistry 9999 &
Server
を起動します。$ java -classpath server:mbeans \ -Djava.security.policy=config/java.policy Server &
MBeanサーバーの作成、環境マップの初期化、RMIコネクタの作成、およびコネクタのMBeanサーバーへの登録の確認が表示されます。
Client
を起動します。$java -classpath client:server:mbeans Client
コネクタ・クライアントの作成、主体委譲の作成、MBeanサーバーへの接続、およびさまざまなMBean操作、その後の接続の終了の確認が表示されます。
詳細なセキュリティ
警告:
セキュリティ・マネージャおよびそれに関連するAPIは非推奨であり、今後のリリースでは削除されます。セキュリティ・マネージャの代わりとなるものはありません。詳細および代替手段については、JEP 411を参照してください。このセクションの2つの例題は、簡単なセキュリティに示す例題と非常に似ていますが、異なる点として、簡単なファイルベースのアクセス制御が、ポリシー・ベースのアクセス制御に置き換えられています。
詳細なセキュリティの例題クラスを使用したセキュアなRMIコネクタの分析
-
「詳細なセキュリティ」の項に含まれているソース・コードをコピーし、次の
work_dir/jmx_examples/Security/fine_grained
のサブディレクトリおよび対応するファイルを作成します。/server/Server.java
/config/java.policy
/config/keystore
/config/password.properties
/config/truststore
/mbeans/SimpleStandard.java
/mbeans/SimpleStandardMBean.java
/client/ClientListener.java
/client/Client.java
*.java
および*.properties
ファイルのすべてをIDEまたはテキスト・エディタで開きます。
次の各項で、これらのファイルの分析を説明します。
詳細なセキュリティの例題のServer.java
この例題のServer.java
クラスは、主体委譲の例題のServer.javaで使用されるクラスに非常に似ています。ただし、詳細なセキュリティの例題では、環境マップにマップされるaccess.properties
ファイルがありません。それ以外は、両クラスは同一です。
詳細なセキュリティの例題のjava.policy
java.policy
ファイルは、次の権限を付与します。
server
コード・ベースのすべての権限。これがあることで、コネクタ・サーバーはコネクタを作成し、リモート・ユーザーの呼出しで要求される操作を実行できるmbeans
コード・ベースに対するMBeanTrustPermission
。これによって、信頼されたMBeanをMBeanサーバーに登録できるJMXPrincipal
で表されるユーザー、username.
に対する、各種のMBean操作およびMBeanサーバー操作を実行する権限
詳細なセキュリティを使用したRMIコネクタの例題の実行
詳細なセキュリティを使用したRMIコネクタの例題を実行するには、次のステップを実行します。
- RMIコネクタの例題を実行します:
$ javac mbeans/SimpleStandard.java \ mbeans/SimpleStandardMBean.java \ server/Server.java \ client/Client.java \ client/ClientListener.java
- ローカル・ホストのポート9999でRMIレジストリを起動します。
$ export CLASSPATH=server ; rmiregistry 9999 &
Server
を起動します。$
java -classpath server:mbeans \ -Djavax.net.ssl.keyStore=config/keystore \ -Djavax.net.ssl.keyStorePassword=password \ -Djava.security.manager \ -Djava.security.policy=config/java.policy \ Server &環境マップの初期化、MBeanサーバーとRMIコネクタの作成の確認が表示されます。
Client
を起動します。$ java -classpath client:server:mbeans \ -Djavax.net.ssl.trustStore=config/truststore \ -Djavax.net.ssl.trustStorePassword=trustword \ Client
コネクタ・クライアントの作成、RMIサーバーへの接続、各種のMBean操作、および接続の終了の確認が表示されます。