セキュリティに役立つパターンは、レコードに個別にアクセス許可を割り当てるのではなく、レコード内のデータに基づいてアクセス許可を適用することです。これは、メタデータ、個々の列(Bigtableクローン)、または要素(Aggregate NoSQLデータベース)のいずれかの値に基づいています。
良い例は、文書内に顧客名が記載されていることです。その顧客に言及しているすべての文書へのアクセスを、この顧客の情報にアクセスできる人に限定することができます。これらのドキュメントへのアクセスを制限するには、ドキュメント内のデータを処理し、そのデータの値に基づいて関連するセキュリティ権限を適用します。
<! - 1 - >No NoSQLデータベースは、すぐにこの機能を提供します。これは、アプリケーションによってデータが保存された後、他のアプリケーションやユーザーがデータを取得できるようになる前に、そのレコードに権限を割り当てる必要があるためです。したがって、このアクセス権の割り当てはトランザクションの境界内で行われなければなりません。
また、ACID準拠のトランザクション(MarkLogic、FoundationDB、Neo4jなど)をサポートするNoSQLデータベースはほとんどありません。データベースがドキュメント内のデータに基づいてパーミッションをすぐに割り当てることをサポートしていないが、ACIDトランザクションとプリコミットトリガをサポートしている場合、簡単な回避策が可能です。
<!レコード内の値の存在をチェックし、その値に基づいてパーミッションを変更するトリガを書くのは簡単です。データベースがコミット・プロセス中にそうすることをサポートし、コミット後ではない限り、単純なプリコミット・トリガーを使用してデータを安全にすることができます。一例として、MarkLogic Serverは、完全直列化可能なACIDトランザクションとプリコミットトリガをサポートしています。以下は、属性ベースのアクセス制御をサポートしたい単純なXMLドキュメントです:
<! MarkLogic Serverのトリガーは、W3C XQuery言語を使用します。
MarkLogic Serverのトリガーは、W3C XQuery言語を使用します。次のXQueryの例は、MarkLogicにインストールすると読み取りと書き込みの権限を割り当てる簡単なトリガーです。xquery version "1. 0-ml";インポートモジュールの名前空間trgr = 'http:// marklogic。 com / xdmp / at '/ MarkLogic / triggers'をトリガーします。 xqy ';変数$ trgr:uriをxs:string外部として宣言します。変数$ trgrを宣言します:node()externalとしてトリガーします。 xdmp:document-set-permissions($ trgr-uri、(xdmp:permission( "seniorsales"、 "update")、xdmp:パーミッション( "sales"、 "read")))else()
トリガーがsetpermsファイルにインストールされた後。MarkLogicサーバーモジュールデータベースでxqyを実行するには、MarkLogic - Query ConsoleのWebコーディングアプリケーションで次のコードを実行してトリガーを有効にします。デフォルトのMarkLogic Serverインストールでは、クエリコンソールはURL http:// localhost:8000 / qconsoleにあります。
<! - 1 - >
クエリコンソールを使用してトリガをインストールする方法を示すコードを次に示します。
xquery version "1. 0-ml";インポートモジュールnamespace trgr = "http:// marklogic。com / xdmp / triggers" / 'MarkLogic / triggers'。 xqy '; trgr:create-trigger( "setperms"、 "Set Sales Doc Permissions"、trgr:trigger-data-event(trgr:collection-scope( "meetingreports")、trgr:ドキュメントコンテンツ( "modify")、trgr:pre fn:true()、xdmp:default-permissions()、fn:トリガーモジュール(xdmp:データベース( "モジュール")、 "/トリガー/"、 "setperms。xqy" false())