CouchDB自体には通信を暗号化する機能が1.1系列からしか準備されていないので、stunnelを使っています。
普段は「CouchDB: Ruby CouchモジュールをDigest認証対応にする」ようにSSL接続に対応したクライアントを使っています。
とはいえCouchDB自体には、SSL接続に対応した機能がないので、CouchDB同士を接続する必要があるレプリケーション(Replication)を有効にするためにStunnelのクライアント機能を使ってみました。
実際にはCouchDBの間にはインターネットがありますが、おおまかなシステム構成図は次のとおりです。
Stunnelサーバ設定の確認
CouchDBの起動時にdefault/couchdbファイルに書かれているstunnelを起動するコマンドラインは次のようになっています。
/usr/bin/stunnel -v 3 -a /usr/local/etc/couchdb/sslcerts -d :::6984 -r 127.0.0.1:5984
-aオプションに指定しているディレクトリの中は次のような感じです。
$ sudo ls -l /usr/local/etc/couchdb/sslcerts lrwxrwxrwx 1 root couchdb 17 Dec 2 11:44 22f12cbd.0 -> demoCA.cacert.pem lrwxrwxrwx 1 root couchdb 23 Dec 2 11:44 6b0ab199.0 -> stunnel.client.cert.pem -rw-r----- 1 root root 3664 Dec 2 10:23 demoCA.cacert.pem -rw-r--r-- 1 root couchdb 3494 Dec 2 11:34 stunnel.client.cert.pem
Stunnelクライアントの設定
サーバ側はSSLクライアント認証が有効なので、普通に接続しようとすると失敗します。
接続用Certificateファイルの作成
いつも通りにCA.plを使って、newcert.pem,newkey.pemファイルを作成します。
CA.plへのパスはUbuntu 10.04 LTSでのものです。環境毎に格納場所が違いますので、locate CA.plで探すか、手動でopensslを実行してください。
$ /usr/lib/ssl/misc/CA.pl -newreq $ /usr/lib/ssl/misc/CA.pl -sign $ rm newreq.pem $ cp newcert.pem couchdb.client.cert.pem $ cp newkey.pem couchdb.client.key.pem $ openssl rsa < couchdb.client.key.pem > couchdb.client.nokey.pem $ cat couchdb.client.cert.pem couchdb.client.nokey.pem > couchdb.client.pem
最終的にはcouchdb.client.pemファイルを使い、stunnelをクライアント化します。
Stunnelサーバ側でのCertificateファイルの更新
最初のコマンドラインにあるようにStunnelサーバは接続に使うcertificateを/usr/local/etc/couchdb/sslcertsに保存しています。
今回作成したcouchdb.client.cert.pemファイルと"CA.pl -sign"の実行時に使ったCAのcacert.pemファイルをstunnelサーバ側に転送しておきます。
Stunnelサーバ側で次のような操作をしておきます。 cacert.pemが既に存在していて、内容が同じであれば省いてください。 内容が違う場合はファイル名を変更してコピーしておく必要があります。
$ sudo cp couchdb.client.cert.pem cacert.pem /usr/local/etc/couchdb/sslcerts $ sudo c_rehash /usr/local/etc/couchdb/sslcerts
Stunnelクライアントモードでの起動
基本的には次のようなコマンドラインでStunnelサーバに接続します。
/usr/bin/stunnel -c -p /usr/local/etc/couchdb/sslcerts/couchdb.client.pem" -d 127.0.0.1:5985 -r 192.168.x.x:6984
ここでの192.168.x.xはStunnelサーバのIPアドレスです。
Stunnelクライアント側にはcouchdb.client.pemファイルをコピーしておき、やはり次のようなコマンドを実行します。
$ sudo cp couchdb.client.pem /usr/local/etc/couchdb/sslcerts/ $ sudo /usr/bin/stunnel -c -p /usr/local/etc/couchdb/sslcerts/couchdb.client.pem" -d 127.0.0.1:5985 -r 192.168.x.x:6984 $ curl -u admin:xxxxxx http://localhost/:5985/_all_dbs
サーバ側はBasic認証が有効になっているのでadmin:xxxxxsはID(admin)とパスワード(xxxxxx)を':'(コロン)で区切って指定しています。
セキュリティ上の考察
Stunnelクライアントからはログインできるユーザは全てサーバに到達する事が可能になります。
もちろんパスワードがわからなければ接続できませんが、curlコマンドラインを起動する場合にはps auxwwwの出力にはでないですが、bash等、使っているシェルのhistoryには記録されます。
それが気になることはあまりないとは思いますが、こういうところにも気を配る必要があるかないか、環境はちゃんと理解しておくことが必要です。
さいごに
とりあえず、ここまでで無事にレプリケーションを有効にする準備ができました。
やっぱりセキュリティ周りの作りはちょっと不安なんですよね。
0 件のコメント:
コメントを投稿