Cassandra0.6.0-beta3のThrift認証(SimpleAuthenticator)を試してみる

「CassandraのThrift認証うごかねーよヽ(`Д´)ノ ウワァァァン」って感じのコメントが来てたので調べてみた。

とりあえずSimpleAuthenticatorを試してみる

SimpleAuthenticatorを使うようにstogate-conf.xmlを修正。

<Authenticator>org.apache.cassandra.auth.SimpleAuthenticator</Authenticator>

Cassandraを起動して、cassandra-cliから繋いでみる。conf/passwd.properties、access.propertiesを見る限り、Keyspace単位にアクセス制限をかけてるみたいですね。

bin/cassandra-cli --host localhost --port 9160 --username jsmith --password havebadpass --keyspace Keyspace1 --debug

繋いでみたらエラーが出た。

クライアントサイドに表示されるエラーは認証失敗したよエラーですね。(cliで--debugオプションなしにすると、エラー表示されない)

Starting Cassandra Client
org.apache.thrift.TApplicationException: Internal error processing login
        at org.apache.thrift.TApplicationException.read(TApplicationException.java:108)
        at org.apache.cassandra.thrift.Cassandra$Client.recv_login(Cassandra.java:290)
        at org.apache.cassandra.thrift.Cassandra$Client.login(Cassandra.java:272)
        at org.apache.cassandra.cli.CliMain.connect(CliMain.java:109)
        at org.apache.cassandra.cli.CliMain.main(CliMain.java:239)
Login failure. Did you specify 'keyspace', 'username' and 'password'?
Welcome to cassandra CLI.

サーバーサイドのエラーを見ると、java.io.FileInputStreamがぬるぽを投げてる。ファイルの読み込みに失敗してる雰囲気。

ERROR 11:37:11,536 Internal error processing login
java.lang.RuntimeException: Unexpected authentication problem
        at org.apache.cassandra.auth.SimpleAuthenticator.login(SimpleAuthenticator.java:113)
        at org.apache.cassandra.thrift.CassandraServer.login(CassandraServer.java:651)
        at org.apache.cassandra.thrift.Cassandra$Processor$login.process(Cassandra.java:1137)
        at org.apache.cassandra.thrift.Cassandra$Processor.process(Cassandra.java:1115)
        at org.apache.thrift.server.TThreadPoolServer$WorkerProcess.run(TThreadPoolServer.java:253)
        at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
        at java.lang.Thread.run(Thread.java:619)
Caused by: java.lang.NullPointerException
        at java.io.FileInputStream.<init>(FileInputStream.java:103)
        at java.io.FileInputStream.<init>(FileInputStream.java:66)
        at org.apache.cassandra.auth.SimpleAuthenticator.login(SimpleAuthenticator.java:82)
        ... 7 more

少し深追いしてみる

とりあえずエラーを吐いてる部分のソースを確認。

public class SimpleAuthenticator implements IAuthenticator
{
    public final static String PASSWD_FILENAME_PROPERTY        = "passwd.properties";
    public final static String ACCESS_FILENAME_PROPERTY        = "access.properties";
    public final static String PMODE_PROPERTY                  = "passwd.mode";
    public static final String USERNAME_KEY                    = "username";
    public static final String PASSWORD_KEY                    = "password";

    @Override
    public void login(String keyspace, AuthenticationRequest authRequest) throws AuthenticationException, AuthorizationException
    {
        /* 中略 */
        String pfilename = System.getProperty(PASSWD_FILENAME_PROPERTY);
        /* 中略 */
        try
        {
            FileInputStream in = new FileInputStream(pfilename);
            /* 中略 */
        }
        /* 中略 */
        String afilename = System.getProperty(ACCESS_FILENAME_PROPERTY);
        /* 中略 */
        try
        {
            FileInputStream in = new FileInputStream(afilename);
            /* 中略 */
        }
        /* 中略 */
    }
}

System.getProperty()でシステムプロパティの"passwd.properties"と"access.properties"からパスを取得してる。なので、Cassandra(JavaVM)の起動オプション(-D=)でパスを指定するようにしてあげればおkっぽい。

起動オプションででpasswd.propertiesとaccess.propertiesを指定する

cassandra.bat(Windows)、cassandra.in.sh(not Windows)内のJVM_OPTSに以下を追加する。

-Dpasswd.properties=/path/to/conf/passwd.properties
-Daccess.properties=/path/to/conf/access.properties

とりあえずうちの環境(Windows7)ではこんな感じにbatを修正したらちゃんと動いた。

set JAVA_OPTS=^
 -ea^
 -Xdebug^
 -Xrunjdwp:transport=dt_socket,server=y,address=8888,suspend=n^
 -Xms128m^
 -Xmx1G^
 -XX:TargetSurvivorRatio=90^
 -XX:+AggressiveOpts^
 -XX:+UseParNewGC^
 -XX:+UseConcMarkSweepGC^
 -XX:+CMSParallelRemarkEnabled^
 -XX:+HeapDumpOnOutOfMemoryError^
 -XX:SurvivorRatio=128^
 -XX:MaxTenuringThreshold=0^
 -Dcom.sun.management.jmxremote.port=8080^
 -Dcom.sun.management.jmxremote.ssl=false^
 -Dcom.sun.management.jmxremote.authenticate=false^
 -Dpasswd.properties=%CASSANDRA_HOME%\conf\passwd.properties^
 -Daccess.properties=%CASSANDRA_HOME%\conf\access.properties

結論

  1. storage-conf.xmlのをSimpleAuthenticatorに変更する
  2. cassandra.batかcassandra.in.shのJAVA_OPTSに-Dpasswd.properties、-Daccess.properties(.propertiesのパス)を追加する
  3. cassandra-cliで接続したい場合は、起動オプションで、--host、--port、--username、--password、--keyspace(、--debug)を指定する