2011-01-19 15 views

答えて

22

はい、CouchDBは許可されていない読み取りを防止できます。残念ながら、それはやや単純です。

秘密のオークションアプリケーションを想像してみてください。あなたは$ 20を入札し、$ 10を入札します。それぞれの入札はソファーの文書に記載されています。カウチは私たち自身の入札書類を読むことができますが、他にはありません。 しかし、には、平均を示すmap-reduceビューがあります。私はビューを読み込み、平均値が$ 15だから、あなたの入札額が$ 20だと判断し、私はセキュリティポリシーを壊しました。 出力を表示すると、ドキュメントの情報の一部またはすべてが漏れる可能性があります。ドキュメントレベルでセキュリティを施行することは現実的ではありません。そのため、読み取りアクセスはデータベースレベルで行われます。

私は知っている、それは吸う。しかし、これが唯一正しいスケーラブルな答えです。

これは、多くのデータベース—を1人(またはそれ以上!)で作成するという理由からです。データベースへの読み取り権限は、データベース_securityオブジェクトのreadersの値に設定されています。 (それはまた、DBへの書き込みも誰指定するので、CouchDBのトランクに、フィールドreaders was renamed to membersに注意してください。)

技術は、このように動作します:

  1. は、各ユーザー用のデータベースを作成します。ユーザーが読むことができるすべての文書を保持します。ユーザー(またはユーザーの役割)を_securityオブジェクトに追加します。
  2. masterデータベースで、読み取りポリシーを実装するフィルタ関数を作成します。 (validate_doc_updateとコードを共有できます)
  3. ?filter=my_filter_functionを使用して、マスターデータベースからユーザーのデータベースにレプリケートします。
  4. ユーザーがデータベースを読み込む(またはデータベースから複製する)ことを許可します。

もちろん、これはすべて純粋なCouchアプリケーションであり、ユーザーはCouchに直接アクセスします。中間レイヤー(MVCコントローラーまたは逆HTTPプロキシーのみ)を使用している場合は、ユーザーとソファの間にポリシーを適用することができます。しかし、は注意してください。たとえば、_show関数または_rewriteルールを使用すると、ポリシーにもかかわらずユーザーはビューまたはドキュメントを読み込むことができます。

幸運を祈る!

+0

ありがとうございます!あなたは_showと_rewriteが私をかむことができる方法を詳しく説明できますか?また、 "unfriend someone - > upload photo"のような競争条件を避け、未公開の人が決してその写真を見ることができないことを100%保証するにはどうすればいいですか? – nornagon

+0

URLに基​​づいて、ユーザーごとにドキュメントごとにアクセスを許可/拒否するリバースプロキシがあるとします。後で、_list関数を使用して新しいフィーチャーを追加し、すべての_list照会がプロキシーによって許可されます。ユーザーは_listを使用して、彼がしてはならない文書を見る方法を理解するかもしれません。同様に、_rewriteルールは、通常の '/ db/doc_id'パスのないドキュメントを見る方法を提供します。だから、あなたのプロキシに穴がないことを非常に*確実にしなければなりません。 – JasonSmith

+2

あなたの2番目の質問は**読み取りアクセスを**取り消すこと** readアクセスを許可すること以上のことです。新鮮な質問をすることを提案します(「CouchDBセキュリティモデルの読み込みアクセスを取り消す方法」)。私ができるなら、私は答えに一発撃ちます! – JasonSmith

関連する問題