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)を指定する