2010/11/15

StunnelでCouchDBへの接続をSSLにしてみた

CouchDB Wiki - How to enable SSLにもあるように、CouchDB 1.1まではSSLが使えません。

もうちょっと待てば良いんですが、Basic認証が嫌だったので、stunnelのクライアント認証を使ってCouchDBへ接続する方法を試しました。

今回は図のようにCouchDBを127.0.0.1:5984で動かしたまま、クライアント認証を有効にしたStunnelを経由して外部システムからの接続を許可しています。

Webブラウザと外部システムがCouchDBに接続する様子

stunnelの起動に必要なPEMファイルの準備

stunnelを起動する際にはServe CertificateとしてのPEMファイルを準備する必要があります。 流れとしてはCA局の準備と、そのCA局を利用したcertとkey、2つのPEMファイルを作成する事になります。

今回は以前作成したCA局とApache2のSSL化で作成したPEMファイルをそのまま使います。 これはCertificateファイルのCommon Name欄が同じためです。

もし手元に他で作成したnewcert.pemファイルがあるとしても、Common Name欄がstunnelを動かすサーバと違うのであれば作り直す必要があります。

手元にある*cert.pemファイルのCommon Name(CN)欄の確認は次のコマンドで表示される文字列から"CN="に続く文字列を確認します。

$ openssl x509 -in newcert.pem -text | grep Subject:
        Subject: C=JP, ST=Fukushima, L=AizuWakamatsu, O=Yet Another Sundial Org., OU=Web Management Team,   CN=home.example.org
/emailAddress=admin@example.org

Common Name欄とサーバ名が一致しない場合や、IPアドレスでアクセスさせる場合には、そのIPアドレスをCommon Nameとして入力した"newcert.pem"(server_cert.pemにコピー)と"newkey.pem"ファイル(server_key.pemにコピー)が必要になります。

作業手順は、「 Ubuntu 8.04 LTS上のApache2をSSL化」の「CA局の準備」と「Apacheサーバ用のSSL鍵ファイルの準備」にあります。

「Apacheサーバ用のSSL鍵ファイルの準備」ではカレントディレクトリに"demoCA"ディレクトリがある事を前提に作業を始めている点に注意してください。

stunnel用PEMファイルの準備

ここから先は、前述の手順で作成した、 server_cert.pem (元はnewcert.pem)と server_key.pem (newkey.pem)の2つがあるところから作業を開始します。

いまは2つのPEMファイルが手元にありますが、stunnelで必要なPEMファイルの内容は次のような形になります。

...
-----BEGIN CERTIFICATE-----
MIIDRzCCArCgAwIBAgIJANXx3xE0zyt2MA0GCSqGSIb3DQEBBQUAMIGWMQswCQYD
...
-----END CERTIFICATE-----
-----BEGIN RSA PRIVATE KEY-----
MIICXgIBAAKBgQDb2b/AXAR+5l03swxxE7bktYmazVeWUcPPODXwvZWxSkTGjqVh
...
-----END RSA PRIVATE KEY-----

このPEMファイルの前半には、Certificateの内容をテキストで記述した内容がくっついていても構いません。

というわけで、このstunnel用のcertファイルを次の手順で作成します。

$ cat server_cert.pem server_key.pem > stunnel.pem
$ sudo cp stunnel.pem /etc/stunnel/stunnel.pem

/etc/stunnel/stunnel.pemはUbuntuに入っているstunnelのデフォルトのPEMファイルの格納先です。

さて、これでstunnelを起動する方の準備は整いました。

クライアント認証に向けた準備

とりあえずはクライアント用のCertificateを作成していないので、ディレクトリだけ準備しておきます。

この場所は /etc/couchdb/certs にしました。

手動で/usr/local以下にインストールしたCouchDBを使う場合には、/usr/local/etc/couchdb/certs とでもして、適宜読み替えてください。

Stunnelの起動

Stunnelを起動するのは簡単です。

$ stunnel -v 3 -a /etc/couchdb/certs -d 192.168.1.2:5984 -r 127.0.0.1:5984

問題はCouchDBと連動させてこれを動かす事ですが、CouchDBのリスタートとstunnelを連携させる必要はないので、とりあえず/etc/default/couchdbに埋め込む事にしました。

Ubuntu 10.04: 変更後の/etc/default/couchdbファイルの全体

# Sourced by init script for configuration.

COUCHDB_USER=couchdb
COUCHDB_STDOUT_FILE=/dev/null
COUCHDB_STDERR_FILE=/dev/null
COUCHDB_RESPAWN_TIMEOUT=5
COUCHDB_OPTIONS=

# Set this option to 0 if you don't want CouchDB server to start
# during system boot.
ENABLE_SERVER=1

## Added by Yasuhiro ABE
umask 027
/usr/bin/stunnel -v 3 -a /etc/couchdb/certs -d 192.168.1.2:5984 -r 127.0.0.1:5984

127.0.0.1:5984で動いているのはCouchDBプロセスだという点は、今回の作業のどこにも影響しないので、同じ手順で他のサービスにもSSL接続する事ができるようになります。

接続確認をするためにRuby + net/https を使ってクライアントを作成する事にします。

0 件のコメント: