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