2010/11/14

CouchDBをソースコードからインストールしてみた

CouchDBを使いつつ、こんなんで大丈夫なのか、と思うところもあったので、試したことをまとめておきます。

O'ReillyのCouchDB - The Definitive Guideでは、やはりProduction環境ではいろいろ設定が必要だよ、という話しになっています。

セキュリティを低くしてとりあえず使える状態で配布しているのは普及させる戦略みたいですね。

今回使った環境は次のとおりです。 VMWare上で動かしたからといって特に違いはないはずです。

  • CouchDB 1.0.1
  • OS: Ubuntu 10.04 LTS 64bit版 on VMWare

インストール手順の落とし穴、足りないこと

ソースコードからインストールした場合の手順についてはCouchDB Wiki - Install_on_Ubuntuにあります。

囲みにある手順だけでは足りなくて、その下に書かている次のような点にも気をつける必要があります。

  • /etc/init.d/couchdbの配置(と、update-rc.dの実行)
  • /etc/logrotate.d/couchdbの配置
  • xulrunnerのバージョンアップへの対応

最初の2点はドキュメントの後半や、Example 1(Alternate)などでフォローされています。 また設定してしまえば特にフォローする必要はなさそうです。

このままだと自動で行なえないのは最後のxulrunnerのアップデートへの対応です。

また個人的に気になったのは次の点です。

  • 一般ユーザが(暗号化された)パスワードの書かれた設定ファイルにアクセスできる
  • 認証なしにDBにアクセスできる(別記事にまとめる)
  • Basic認証を送信する経路でデータが暗号化されない(別記事にまとめる)

ここでxulrunnerのバージョンアップと、ファイルのパーミッションについてまとめていきます。

xulrunnerのバージョンアップへのフォローアップ

/usr/local/lib/couchdb/bin/couchjs ファイルを適切に動かすためには libmozjs.so ライブラリファイルが必要です。

このlibmozjs.soファイルにアクセスするために、Ubuntu用のインストールガイドに従うと、xulrunner.confを作成することになります。 ガイドでは、この自ら作成したファイルがxulrunnerがアップデートされる際に自動で更新されない事を嘆いています。

この問題の本質は、ld.soがlibmozjs.soを見つけられない事にあるので、解決策は /etc/ld.so.conf.d以下を管理する方法の他に、LD_LIBRARY_PATHを適切に設定してあげる方法でも解決が可能です。

実際にUbuntu 10.04 LTSで普通に使えるcouchdbは0.10.0ですが、こちらでは起動スクリプト(/usr/bin/couchdb)の中でLD_LIBRARY_PATHを設定しています。

## grep LD_LIBRARY_PATH /usr/bin/couchdb on Ubuntu 10.04 LTS
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/lib/xulrunner-`xulrunner-1.9.2 --gre-version`/
export LD_LIBRARY_PATH

Wikiでは /etc/ld.so.conf.d/xulrunner.conf を管理するように書かれていますが、これよりはパッケージと同様にLD_LIBRARY_PATHを設定する方法が楽しそうです。

最終的に/usr/local/etc/default/couchdbファイルを少し編集することにしました。

/usr/local/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=

umask 027

XULDIR="/usr/lib/xulrunner-devel-$(xulrunner-1.9.2 --gre-version)"
if test -d "${XULDIR}" ; then
  LD_LIBRARY_PATH="$LD_LIBRARY_PATH:${XULDIR}/lib"
  export LD_LIBRARY_PATH
else
  echo "[warn] Missing ${XULDIR} causes javascript exec error."
fi

[2011/01/21追記]
XULDIRの指定方法を間違えていたので、
・"devel"付きのディレクトリにアクセスし、
・LD_LIBRARY_PATHに${XULDIR}/libを指定するよう
修正しました。

libmozjs.soのバージョンが大きく変更されれば、再度コンパイルが必要でしょうから、これで解決として良いのかなと思います。

ファイルのパーミッション

次はファイルのパーミッションについてで、解決したいのは次のような点です。

  • adminsのID, Passwordがファイルに記述されるのに、一般ユーザから見える点
  • Wikiではディレクトリ単位で一般ユーザからのアクセスを拒否している記述は一部であるが不十分

全体でやりたい事は次のとおりです。

  • CouchDBはcouchdb:couchdb権限で実行する
  • 不必要にcouchdbユーザに書き込み権限を出さない
  • 一般ユーザが制御(API)を迂回してアクセスできないように、ID, Password情報は開示しない (/_users/org.couchdb.user:user_name文書を含む)

これだと基本root所有のファイルで、守るべき範囲はDBファイルと設定ファイルという事になります。

couchdbユーザが書き込みできなければいけない範囲は /usr/local/var 以下で、設定ファイルはIDの暗号化の時だけ必要ですが、これは手動で対応することで書き込み権限を落すことにしました。

ファイルのパーミッションを整える

参考にする導入手順は、Example1かExample 1 (Alternate)だと思いますが、そこに書かれているchmod, chownコマンドは無視をして、基本的に全ファイル root:root、drwxr-xr-x, -rw-r--r--(755 or 644)の権限だと仮定します。

まずはvarディレクトリ以下

$ sudo find /usr/local/var/lib/couchdb/. -exec chown couchdb:couchdb {} \;
$ sudo find /usr/local/var/lib/couchdb/. -exec chmod g-w,o-rwx {} \;
$ sudo find /usr/local/var/log/couchdb/. -exec chown couchdb:couchdb {} \;
$ sudo find /usr/local/var/log/couchdb/. -exec chmod g-w,o-rwx {} \;
$ sudo find /usr/local/var/run/couchdb/. -exec chown couchdb:couchdb {} \;

次にetcディレクトリ以下

$ sudo find /usr/local/etc/couchdb/. -exec chown root:couchdb {} \;
$ sudo find /usr/local/etc/couchdb/. -exec chmod g-w,o-rwx {} \;

注意点は、local.iniに書く[admins]の行は、以前の投稿のように、直接"-hashed-"で始まるハッシュに変換されたパスワードを書く必要があるところでしょうか。

不便に思う人もいるかもしれませんが、これで書き込み権限は /usr/local/var 以下に限定される事になります。 管理上は不要に構成が変更される危険を回避できるのでお勧めです。

新しく作成されるDBのパーミッション

正確には/usr/local/var以下のファイルが該当します。

前述の/usr/local/etc/default/couchdbの中に入れてありますが、/usr/local/etc/default/couchdbにumask 027を追加しました。

これで新しく作成されるDBは640(-rw-r-----)のパーミッションになります。

とりあえずは、この構成で使うことにしました。

番外編: xstowを使ったCouchDBの管理

普通はconfigureを実行する時にprefixを/usr/localとして導入すると思いますが、手元のマシンでは/usr/local以下に入れたものの管理のためにxstowコマンドを使っているため、prefixは/usr/local/stow/couchdb-1.0.1としています。

本来prefixを/usr/localとしてコンパイルしつつ、実際に導入する時には /usr/local/stow/couchdb-1.0.1に入れる、という使い方をするのですが、残念ながら全てのアプリケーションのインストールスクリプトがそういう方法に対応しているわけではありません。

それにxstowはバージョン管理をするために便利なのですが、DBのようなアプリケーションを使う時には少し工夫も必要です。

アプリケーションによっては、バージョンが変化しても変化して欲しくないものがいくつかあります。

  • 設定ファイル (couchdbでは local.ini と local.d/以下)
  • DBファイル (couchdbでは/usr/local/var/lib/couchdb/以下)
  • ログファイル等... (couchdbでは/usr/local/var以下のファイル全部)

こういうファイルはあらかじめ直接ファイルとして"/usr/local/var"以下などに配置してしまい、/usr/local/stow/couchdb-1.0.1/var以下からはファイルを削除しておくことで、xstowの管理対象から外してしまいます。

stow/couchdb-1.0.1以下から削除するファイル
  • /usr/local/stow/couchdb-1.0.1/varディレクトリ全体
  • /usr/local/stow/couchdb-1.0.1/etc/couchdb/local.iniファイル
  • /usr/local/stow/couchdb-1.0.1/etc/couchdb/local.dディレクトリ
  • /usr/local/stow/couchdb-1.0.1/etc/default/couchdbファイル

新しいcouchdbを/usr/local/stow以下にインストールした際には、xstowを実行する前に、これらに該当するファイル/usr/local/stow/couchdb-new-version/からをあらかじめ削除しておく必要があります。

リンクの削除とファイルの移動

一旦xstowを使って couchdb-1.0.1 関連のファイルを削除しておきます。

$ cd /usr/local/stow
$ sudo xstow -D couchdb-1.0.1

次に/usr/local/couchdb-1.0.1以下から、永続的に使用したいファイルを/usr/local/etcなどの/usr/local直下に移動します。

まずは/usr/local/var。

$ sudo mkdir -p /usr/local/var/{lib,run,log}
$ sudo mv /usr/local/stow/couchdb-1.0.1/var/lib/couchdb /usr/local/var/lib/
$ sudo mv /usr/local/stow/couchdb-1.0.1/var/log/couchdb /usr/local/var/log/
$ sudo mv /usr/local/stow/couchdb-1.0.1/var/run/couchdb /usr/local/var/run/
$ sudo rm -r /usr/local/stow/couchdb-1.0.1/var

次は/usr/local/etc/couchdb

$ sudo mkdir -p /usr/local/etc/couchdb/local.d
$ sudo mv /usr/local/stow/couchdb-1.0.1/etc/couchdb/local.ini /usr/local/etc/couchdb/
$ sudo rmdir /usr/local/stow/couchdb-1.0.1/etc/couchdb/local.d

最後は/usr/local/default。

$ sudo mkdir -p /usr/local/etc/default/
$ sudo mv /usr/local/stow/couchdb-1.0.1/etc/default/couchdb /usr/local/etc/default/
$ sudo rmdir /usr/local/stow/couchdb-1.0.1/etc/default
xstowの際実行

作業が終ったら、xstowを使ってcouchdb-1.0.1を/usr/local直下に配置します。

$ cd /usr/local/stow
$ sudo xstow couchdb-1.0.1

あとは必要な設定はdefault.iniではなく、local.iniを使うように徹底するところと、次回インストールした最新版のcouchdb-1.1などは、/usr/local/stow に置いた後に、var, etc/couchdbなどを削除する事が必要になります。

設定ファイルから/usr/local/stowで始まるパスを削除する

今回はprefixを/usr/localにして、make installの際にprefixを/usr/local/stow/couchdb-1.0.1にする方法を取らなかったので、手動で設定ファイルから /usr/local/stow/couchdb-1.0.1 で始まる文字列を /usr/loocal に置換する必要がありました。

対象のファイルは次の通りでした。

  • /usr/local/stow/couchdb-1.0.1/bin/couchdb
  • /usr/local/stow/couchdb-1.0.1/bin/couchjs
  • /usr/local/stow/couchdb-1.0.1/etc/init.d/couchdb
  • /usr/local/stow/couchdb-1.0.1/etc/logrotate.d/couchdb

次回は認証についての方法をまとめていきます。

0 件のコメント: