MongoDBでのロールベースのアクセス制御の作成
MongoDBは、ユーザーに割り当てることができる多くの組み込みロールを含む、ロールベースのコントロールを介してユーザーアクセスを提供します。最もよく知られている2つのコントロールは、読み取りと読み取り/書き込みの役割ですが、必要なほど細かくない場合もあります。
最近、MongoDBバージョン2.6で導入されたユーザー定義の役割を調べる機会がありました。この記事では、MongoDBのユーザー定義の役割について説明し、役立つと思われるいくつかのカスタムの役割を定義します。
-
MongoDBでロールを作成
MongoDBでユーザー定義の役割を作成するのは非常に簡単です。 createRoleコマンドを使用して新しいロールを作成できます。一般的なcreateroleの構文は次のとおりです。
{ createRole: "<role name>", privileges: [{ resource: { <resource> }, actions: [ "<action>",] }, ], roles: [ { role: "<role>", db: "<database>" } | "<role>",], writeConcern: <write concern document> }
createRoleコマンドを実行する前に、ロールを作成するデータベースに切り替えてください。これらのデータベースは、のデータベースでのみ定義されます。それらが作成されました。複数のデータベースへのアクセスを許可する役割を作成する場合は、管理者データベースで作成する必要があります。
ロールの作成構文の主要なコンポーネントを見ていきましょう。
-
役割の権限
権限を追加し、アクションとリソースを定義して、ユーザー定義の役割の権限を作成します:
特権アクション
アクションは、挿入と作成の両方を実行できる挿入アクションなど、グループ化された一連の操作です。アクションは、MongoDBの役割ベースのアクセス制御が取得するのと同じくらいきめ細かいものです。特権パラメーターは、mongoアクションに役割を追加するために使用でき、特権は、それが適用されるリソースとともにアクションを構成します。以下を使用して、データベース「mydb」で検索、挿入、更新のアクションを追加します。
privileges: [ {resource: {db: "mydb", collection: "" }, actions: [ “find”,”insert”,”update” ] } ]
特権リソース
リソースドキュメントは、特権アクションが適用される範囲を指定し、次のようにさまざまな粒度で設定できます。
a。コレクション
リソースはリソースに設定できます:
{db: "<db-name>", collection: "<collection name>" }
指定されたアクションをその特定のコレクションのみに付与します。b。データベース
コレクションパラメータを空のままにして、リソースを特定のデータベースに設定できます。リソース文字列リソース:
{db: "<db-name>", collection: "<collection name>" }
スコープをデータベース全体に設定します。c。データベース全体の単一コレクション
リソースを使用して特定のコレクションにリソースを設定できます:
{db: ", collection: "<collection name>" }
すべてのデータベースのコレクションにアクセス許可を付与します。 この権限は、管理データベースで作成されたロールにのみ追加できます。d。データベース全体の複数のコレクション
dbとcollectionの両方のパラメーターを残すことで、すべてのデータベースのすべてのコレクション(システムコレクションを除く)にリソースを設定できます。空。リソース:
{db: "", collection: "" }
。 このリソースは、上記のようなものであり、adminデータベースで作成されたロールでのみ付与できます。e。クラスター全体のリソース
クラスター全体のリソースは、リソースを使用して指定できます:
{ cluster : true }
。このクラスター全体のリソースは、特定のドキュメントにアクセス許可を付与するのではなく、シャットダウンreplSetReconfigなど、システムの状態を指定するために使用されます。f。すべてのリソース
特別な状況以外でこのスコープを使用することはお勧めしません。
{anyResource: true }
スコープセットをすべてのリソースに設定するために使用できます。 -
ロール
組み込みの役割をカスタムの役割に追加することもできます。組み込みの役割がroles:[]パラメーターを使用して追加されると、組み込みの役割の権限がカスタムの役割に追加されます。
ロールパラメータの例を次に示します:
roles: [{ role: "read", db: "&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;db name&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;gt;"}]
この例では、カスタムロールは、定義されたデータベースに対するロール「読み取り」のすべての権限を継承します。ロールがデータベースdb1に継承されている場合、カスタムロールはデータベースdb1または管理データベースのいずれかに作成できます。
懸念事項を書く
書き込みの懸念は、MongoDBから要求される確認応答のレベルを定義し、データベースからの書き込み確認応答を制御するために使用できます。ロールを作成するときは、書き込みの懸念は必要ないことに注意してください。書き込みの懸念には、フィールドw、j、およびwtimeoutを含めることができます:
W-懸念事項を書く
フィールドWを使用して、書き込みが伝播されたインスタンスの数を示すことができます。
J-懸念事項を書く
フィールドJを設定して、書き込みがジャーナルに書き込まれるかどうかを決定できます。
Wtimeout-懸念事項を書く
これは、書き込みが書き込みの懸念を達成する必要がある時間を設定するために使用されます。エラーがスローされた後でも、書き込みの問題が発生する可能性があります。 Wtimeoutが設定されておらず、書き込みの懸念を達成できない場合、書き込みは無期限にブロックされます。
-
役割の割り当て
カスタムロールはデータベース固有であり、同じデータベース内のユーザーにのみ割り当てることができます。
データベース「db1」にロール「myrole」を作成したとしましょう。次のコマンドを使用して、データベースにユーザーを作成できます。
Use db1 db.createUser({"user" : "&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;user&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;gt;",pwd: "&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;password&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;gt;","roles" : [{"role" : "myrole", "db" : "db1"}]})
ユーザー管理の詳細については、MongoDBでのユーザー管理に関するDharshanによるこの投稿を参照してください。
-
カスタムユーザーロール
便利なカスタムロールをいくつか見てみましょう。
単一のDB–読み取り、挿入、更新の権限
組み込みのロールreadおよびreadWriteは、権限が多すぎる、または少なすぎるように感じる場合があります。読み取り、挿入、書き込みの権限のみを付与するカスタムロールを作成する方法を見てみましょう。
カスタムロールに組み込みのロール「read」を追加できるように、すべての読み取り権限が必要であることはすでにわかっています。ドキュメントを作成および更新するための権限も必要です。これらは、特権アクションの挿入と更新を追加することで含めることができます。ユーザーがインデックスを作成してコレクションを作成できるようにする場合は、特権アクションcreateIndexとcreateCollectionを追加できます。
スコープについて、上記の権限を設定した「db1」という名前のデータベースがあると仮定します。 createコマンドは次のようになります。
Use db1. db.createRole( { createRole: "&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;role-name&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;gt;", privileges: [ { resource: { db: "db1", collection: "" }, actions: [ "insert","update","createIndex", "createCollection" ] } ], roles: [{ role: "read", db: "db1"}] })
上記のコマンドは、
<role-name>
でロールを作成します データベースdb1内。上記の役割によって権限が付与されたユーザーには、「削除」権限アクションはありません。また、メソッドdb.collection.findAndModify()、db.collection.mapReduce()、およびdb.collection.aggregate()は、削除権限が必要なため、完全に実行できないことに注意してください。すべてのDB –読み取り、挿入、およびアクセス許可の更新
上記と同様のロールを管理データベースに作成して、すべてのDBに読み取り、作成、更新の権限を付与できます。この役割は管理者DBで作成する必要があり、後続のユーザーも管理者DBで作成する必要があります。
このロールでは、標準の読み取りロールを使用する代わりに、readAnyDatabaseロールから権限を継承できます。ロール作成は次のようになります:
Use admin. db.createRole( { createRole: "&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;role-name&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;gt;", privileges: [ { resource: { db: "", collection: "" }, actions: [ "insert","update","createIndex", "createCollection" ] } ], roles: [{ role: "readAnyDatabase", db: "admin"}] })
書き込みを懸念するライターの役割
書き込みの懸念を強制する必要があるシナリオがある場合、それをロールに追加する方法は次のとおりです。ロールに書き込みの懸念を追加すると、DBでこのロールの下で付与されたすべてのユーザーに書き込みの懸念が適用されます。過半数の書き込みを強制する書き込みの懸念がある役割を定義しましょう:
Use admin. db.createRole( { createRole: "&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;role-name&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;gt;", privileges: [ ], roles: [{ role: "readWriteAnyDatabase", db: "admin"}], writeConcern: { w: “majority”, j: false, wtimeout: 300 } })