2017-05-13 8 views
2

私は現在、CouchDB 2ノードのクラスタをデプロイするために使用できるドッカー作成設定に取り組んでいます。私は最終的にノードを動作させ、データをノード間で同期させましたが、間違っていなければ、CouchDBはユーザーセッションを同期しないように見えます。CouchDB 2はユーザーセッションをノード間で同期しますか?

私のセットアップは、3つのノードがあり、haproxy.cfgとほぼ同じhaproxyセットアップを使用しています。私の設定通りに、haproxyは、ポート5984上の着信トラフィックを、すべての3つのノード上のポート5984にルーティングします。

passwordの管理 rootのユーザー名とパスワードを想定します。

私が最初にログインします。

curl -vX POST http://localhost:5984/_session -H 'Content-Type: application/x-www-form-urlencoded' -d 'name=root&password=password' 

注意返さAuthSessionがAUTHSESSIONとして以下で使用されます。

はその後、私は次のように発行します。

curl -X PUT http://localhost:5984/mydb --cookie AuthSession=AUTHSESSION -H "X-CouchDB-WWW-Authenticate: Cookie" -H "Content-Type: application/x-www-form-urlencoded" 

これは通常で失敗し、私は同じPUTを発行し続けることができると私は最終的にそのhaproxyを想定して、それが最終的に成功します「あなたは、サーバーの管理者ではありません。」私が認証されている単一のノードに要求をルーティングします。ハプロキシはラウンドロビンを使用しているので、ターゲットノードにヒットする確率は1/3です。

私はCouchDBの2ノード間でユーザーセッションの同期扱うことができると思うだろう。私はここでばかげた仮定をしていますか?

、あなたは[couch_httpd_auth]セクションにある秘密を設定する必要があり、私のドッキングウィンドウ・コンセットアップ@lossleaderあたりとして

のための具体的な解決策と

更新(私の設定を複製するrun cluster via docker-composeを参照してください)ノード間で同じになるようにします。さらに、[管理者]セクションで同じ管理者のユーザー名とパスワードを設定する必要があります。私がここで欠けていた細部は、すべてのノードが.iniファイル内の全く同じパスワードハッシュを持っていなければならないということです。同じクリアテキストパスワードを使用するだけでは十分ではありません。そうでなければ、各ノードは独自のソルトを生成し、異なるハッシュを生成します。

は私の完全なセットアップのためrun cluster via docker-composeを参照してください。

+0

各ノードで同じ秘密を設定しましたか? http://docs.couchdb.org/en/2.0.0/config/auth.html#couch_httpd_auth/secret – lossleader

+0

@lossleaderはlocal.iniに設定しようとしましたが、残念なことに違いはありません。 – redgeoff

+0

シークレットが同じならば、ノードがおそらく管理者ユーザーを個別にsalt/encryptすることが許可されているという違いがあると思います。ノードの管理行を実行後に設定にコピーします。 – lossleader

答えて

4

短い答え:はい。

長い答え:他の人がコメントしたように

、CouchDBのは、その作られたセッションを知らないので、それはセッションそのものを同期するメカニズムがありません事実ですが、あなたが同期する必要がある2つの非セッションものがありますクラスタの1つのノードで作成されたセッションCookieが他のノードで有効になる前に

[couch_httpd_auth] secret = foo

これは、セッションクッキーを署名するために使用される秘密の値です。セッションクッキーが要求されたときに存在しない場合、それはランダム値に設定されます。クラスタの各ノードは当然、異なる値を生成します。

起動する前に、この値を大きなランダム値に設定しますが、クラスタのすべてのノードで同じ値に設定してください。

[admins] foo = -pbkdf2-2cbae77dc3d2dadb43ad477d312931c617e2a726,cd135ad4d6eb4d2f916cba75935c3ce7,10

このセクションでは、各管理者ユーザの塩漬けパスワードハッシュが含まれています。この塩はセッションクッキーの署名に含まれています。パスワードを変更すると、塩が再ランダム化されるので、塩を含む効果は、パスワード変更前のセッションCookieを無効にすることです。

また、このセクションがすべてのノードで同じになるようにする必要があります。管理者パスワードをハッシュすると、各ノードはランダムな塩を生成します。

ノードのプロビジョニング自動化の一部としてこのセクションを外部的に生成する方が良いです。

私はあなたが始めることを願っています。将来のリリースでこの状況を改善したいと思っています。これは明らかにcouchdbのクラスタ化前のバージョンを反映しています。

3

CouchDBのセッショントークンは、ユーザーのパスワード塩、サーバーの秘密、そして時間のちょうどHMACハッシュです。単一ノードシステム上であっても、セッションはCouchDBにまったく格納されません。したがって、同期するものはありません。

CouchDBの外部では、プログラマチックにセッションを生成できます。

関連する問題