JMX認証の有効化

リモートJMX接続を有効にする手順。

Cassandraのデフォルト設定では、localhostからのみJMXにアクセスできます。リモートJMX接続を有効にするには、cassandra-env.shでLOCAL_JMX設定を変更し、認証および/またはSSLを有効にします。JMX認証を有効にしたら、nodetoolOpsCenterなどJMXを使用するツールを構成して、認証が使用できるようにします。

OpsCenterでJMX認証を使用するには、Modifying OpsCenter cluster connections(OpsCenterクラスター接続の変更)の手順に従ってください。

手順

  1. 編集するためにcassandra-env.shファイルを開き、以下の行を更新、または追加します。
    JVM_OPTS="$JVM_OPTS -Dcom.sun.management.jmxremote.authenticate=true" JVM_OPTS="$JVM_OPTS -Dcom.sun.management.jmxremote.password.file=/etc/cassandra/jmxremote.password"
    LOCAL_JMX設定がファイル内にある場合は、以下のように設定します。
    LOCAL_JMX=no
    cassandra-env.shファイルの場所は、インストールのタイプによって異なります。
    パッケージ・インストール /etc/cassandra/cassandra-env.sh
    tarボール・インストール install_location/conf/cassandra-env.sh
    cassandra-env.ps1の場所:
    Windowsインストール C:\Program Files\DataStax Community\apache-cassandra\conf\cassandra-env.ps1
  2. jmxremote.password.template/jdk_install_location/lib/management/から/etc/cassandra/にコピーし、名前をjmxremote.passwordに変更します。
    $ cp jdk_install_location/lib/management/jmxremote.password.template /etc/cassandra/jmxremote.password
    注: これはサンプル・パスです。このファイルの場所をjdk_install_location/lib/management/management.propertiesに設定します。
  3. Cassandraを実行しているユーザーは、jmxremote.passwordの所有権を変更し、パーミッションを読み取り専用に変更します。
    chown cassandra:cassandra /etc/cassandra/jmxremote.password
    $ chmod 400 /etc/cassandra/jmxremote.password
  4. 読み取りパーミッションを持つCassandraユーザーをjdk_install_location/lib/management/jmxremote.accessに追加します。
    monitorRole readonly cassandra readwrite controlRole readwrite \ create javax.management.monitor.,javax.management.timer. \ unregister
  5. Cassandraを再起動します。
  6. Cassandraユーザーおよびパスワードを使用して、nodetool statusを実行します。
    $ nodetool status -u cassandra -pw cassandra

ユーザーおよびパスワードなしでnodetool statusを実行すると、以下のようなエラーが表示されます。
Exception in thread "main" java.lang.SecurityException:Authentication failed!Credentials required at com.sun.jmx.remote.security.JMXPluggableAuthenticator.authenticationFailure(Unknown Source) at com.sun.jmx.remote.security.JMXPluggableAuthenticator.authenticate(Unknown Source) at sun.management.jmxremote.ConnectorBootstrap$AccessFileCheckerAuthenticator.authenticate(Unknown Source) at javax.management.remote.rmi.RMIServerImpl.doNewClient(Unknown Source) at javax.management.remote.rmi.RMIServerImpl.newClient(Unknown Source) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Unknown Source) at sun.rmi.server.UnicastServerRef.dispatch(Unknown Source) at sun.rmi.transport.Transport$1.run(Unknown Source) at sun.rmi.transport.Transport$1.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) at sun.rmi.transport.Transport.serviceCall(Unknown Source) at sun.rmi.transport.tcp.TCPTransport.handleMessages(Unknown Source) at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(Unknown Source) at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(Unknown Source) at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) at java.lang.Thread.run(Unknown Source) at sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(Unknown Source) at sun.rmi.transport.StreamRemoteCall.executeCall(Unknown Source) at sun.rmi.server.UnicastRef.invoke(Unknown Source) at javax.management.remote.rmi.RMIServerImpl_Stub.newClient(Unknown Source) at javax.management.remote.rmi.RMIConnector.getConnection(Unknown Source) at javax.management.remote.rmi.RMIConnector.connect(Unknown Source) at javax.management.remote.JMXConnectorFactory.connect(Unknown Source) at org.apache.cassandra.tools.NodeProbe.connect(NodeProbe.java:146) at org.apache.cassandra.tools.NodeProbe.<init>(NodeProbe.java:116) at org.apache.cassandra.tools.NodeCmd.main(NodeCmd.java:1099)