Cassandraのノードとクライアント間の通信を暗号化する


Cassandraにてノードとクライアント間の通信を暗号化する設定を行ったのでそのメモです。

## 環境

* Vagrant 1.7.4
* Ubuntu 14.04.3 LTS x 2
* Cassandra 2.1.12

```
# -*- mode: ruby -*-
# vi: set ft=ruby :

VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  config.vm.box = "ubuntu/trusty64"
  config.vm.define "client" do |client|
    client.vm.hostname = "client"
    client.vm.network "private_network", ip: "192.168.12.10"
    client.vm.provision "shell", inline: <<-SHELL
      echo "127.0.0.1     localhost" >  /etc/hosts
      echo "192.168.12.10 client"    >> /etc/hosts
      echo "192.168.12.11 node"     >> /etc/hosts
    SHELL
  end
  config.vm.define "node" do |node|
    node.vm.hostname = "node"
    node.vm.network "private_network", ip: "192.168.12.11"
    node.vm.provision "shell", inline: <<-SHELL
      echo "127.0.0.1     localhost" >  /etc/hosts
      echo "192.168.12.10 client"    >> /etc/hosts
      echo "192.168.12.11 node"     >> /etc/hosts
    SHELL
  end
end
```

## Cassandra のインストール(node/client両方)

[記事](http://qiita.com/noralife/items/47b5e6da6befbd8e0d10)と同様にCassandraをインストールします。node/client両方のマシンで行います。

```
$ vagrant ssh node
vagrant@node:~$ sudo add-apt-repository -y ppa:openjdk-r/ppa
vagrant@node:~$ sudo apt-get update
vagrant@node:~$ sudo apt-get install -y openjdk-8-jdk
vagrant@node:~$ echo 'JAVA_HOME="/usr/lib/jvm/java-8-openjdk-amd64"' | sudo tee -a /etc/environment
vagrant@node:~$ source /etc/environment
vagrant@node:~$ echo 'deb http://www.apache.org/dist/cassandra/debian 21x main' | sudo tee -a /etc/apt/sources.list.d/cassandra.list
vagrant@node:~$ echo 'deb-src http://www.apache.org/dist/cassandra/debian 21x main' | sudo tee -a /etc/apt/sources.list.d/cassandra.list
vagrant@node:~$ sudo apt-get update
vagrant@node:~$ gpg --keyserver pgp.mit.edu --recv-keys 749D6EEC0353B12C
vagrant@node:~$ gpg --export --armor 749D6EEC0353B12C | sudo apt-key add -
vagrant@node:~$ sudo apt-get update
vagrant@node:~$ sudo apt-get install -y cassandra
```

## 証明書と鍵の準備(nodeのみ)

暗号通信に用いる証明書や鍵を準備します。nodeサーバにログインし、下記のコマンドを実行します。

```
vagrant@node:~$ cd /etc/cassandra/
vagrant@node:/etc/cassandra$ sudo mkdir conf
vagrant@node:/etc/cassandra/conf$ sudo keytool -genkey -keyalg RSA -alias node -keystore .keystore -dname "CN=Testuser, OU=Private, O=Company, C=JP" -storepass cassandra -keypass cassandra
vagrant@node:/etc/cassandra/conf$ sudo keytool -export -alias node -file /tmp/node.cer -keystore .keystore -storepass cassandra -keypass cassandra
vagrant@node:/etc/cassandra/conf$ sudo keytool -import -v -trustcacerts -alias node -file /tmp/node.cer -keystore .truststore -storepass cassandra -keypass cassandra
vagrant@node:/etc/cassandra/conf$ sudo keytool -importkeystore -srckeystore .keystore -destkeystore client.p12 -deststoretype PKCS12
vagrant@node:/etc/cassandra/conf$ sudo openssl pkcs12 -in client.p12  -out /tmp/client.pem -nodes
vagrant@node:/etc/cassandra/conf$ scp /tmp/client.pem client:/home/vagrant/
```

## Cassandraの設定(nodeのみ)

インストール後、設定を行っていきます。

```
vagrant@node:~$ sudo chmod 750 /var/run/cassandra
vagrant@node:~$ sudo sed -i 's/CMD_PATT=.*/CMD_PATT="cassandra"/' /etc/init.d/cassandra
vagrant@node:~$ sudo sed -i 's/^#HEAP_NEWSIZE=.*/HEAP_NEWSIZE="40M"/' /etc/cassandra/cassandra-env.sh  | grep HEAP_NEWSIZE
vagrant@node:~$ sudo sed -i 's/^#MAX_HEAP_SIZE=.*/MAX_HEAP_SIZE="100M"/' /etc/cassandra/cassandra-env.sh  | grep MAX_HEAP_SIZE
vagrant@node:~$ sudo sed -i 's/127.0.0.1/192.168.12.11/' /etc/cassandra/cassandra.yaml
vagrant@node:~$ sudo sed -i 's/localhost/192.168.12.11/' /etc/cassandra/cassandra.yaml
```

`client_encryption_options` を下記のように変更します。

```
# sudo vi /etc/cassandra/cassandra.yaml
client_encryption_options:
    enabled: true
    keystore: /etc/cassandra/conf/.keystore
    keystore_password: cassandra
    require_client_auth: false
    truststore: /etc/cassandra/conf/.truststore
    truststore_password: cassandra
```

必須ではありませんが、ユーザ認証をかけるため、`authenticator`と`authorizer`を変更しました。

```
# sudo vi /etc/cassandra/cassandra.yaml
authenticator: PasswordAuthenticator
authorizer: CassandraAuthorizer
```

## 動作確認
nodeにてCassandraを起動します。

```
vagrant@node:~$ sudo service cassandra start
```

クライアントにてログインできることを確認します。

```
vagrant@client:~$ SSL_CERTFILE=client.pem cqlsh node -ucassandra -pcassandra --ssl
Connected to Test Cluster at node:9042.
[cqlsh 5.0.1 | Cassandra 2.1.13 | CQL spec 3.2.1 | Native protocol v3]
Use HELP for help.
cassandra@cqlsh>
```