読者です 読者をやめる 読者になる 読者になる

aspec7's garage

エンジニア生活の中で学んだことの備忘録

MongoDB 2.4 のユーザーロールについて

MongoDBの2.4から追加されたユーザーロール機能を触ってみました。

mongodを起動するときに「--auth」つけて起動すると認証必須モードになりますが、そのログインユーザーにロール(役割)つけてユーザーごとに権限コントロールをする機能です。

とりあえず、「--auth」オプションなしで起動しているMongoDBにDB管理者アカウントと、コレクションの読み書きだけできるアカウントを作ってみます。

まずは、mongoシェルからユーザー管理用アカウントの「useradmin」を作成します。

> use admin
> db.addUser({user:"useradmin", pwd:"useradmin", roles:["userAdminAnyDatabase"]})


rolesキーには配列で値を設定します。「userAdminAnyDatabase」はsystem.usersコレクションに対して読み書きの権限を与えます。

次に、通常のコレクションへの読み書き用アカウント「test」を作ります。

> use test_db
> db.addUser({user:"test", pwd:"test", roles:["readWrite"]})


この段階で、「--auth」オプションを付けてmongodを再起動します。
ちなみにレプリカセットを構成している場合は、「--keyFile」オプションつけて認証出来るようにする必要があるので注意です。

まずは、読み書き用アカウントでログインして、ユーザー一覧を見てみます。

> use test_db
> db.auth("test", "test")
1
> show users
Mon Jul 22 21:40:07.329 JavaScript execution failed: error: { "$err" : "not authorized for query on admin.system.users", "code" : 16550 } at src/mongo/shell/query.js:L128


権限が無いと怒られました。
次に、適当なデータのあるDBに移動して、コレクションを参照してみます。

> db.sample.find()
{ "_id" : ObjectId("51e7cf03e1a94de3af2761f8"), "no" : 4, "value" : 0 }
{ "_id" : ObjectId("51e7cf03e1a94de3af2761f9"), "no" : 5, "value" : 0 }
{ "_id" : ObjectId("51e7cf03e1a94de3af2761fa"), "no" : 6, "value" : 0 }
{ "_id" : ObjectId("51e7cf03e1a94de3af2761fb"), "no" : 7, "value" : 0 }
{ "_id" : ObjectId("51e7cf03e1a94de3af2761fc"), "no" : 8, "value" : 0 }


ちゃんと検索出来ました。
書き込みも試してみます。

> db.sample.insert({no:2, value:100})
> db.sample.find({no:2})
{ "_id" : ObjectId("51ed295fd538306cd84ac806"), "no" : 2, "value" : 100 }


ちゃんと機能しています。
次に、ユーザー管理用アカウントでログインしてユーザー一覧を表示してみます。

> use admin
> db.auth('useradmin','useradmin')
1
> show users
{
"_id" : ObjectId("51ed2020d538306cd84ac802"),
"user" : "useradmin",
"pwd" : "884fda66c1cb62e62246f4f6293a813e",
"roles" : [
"userAdminAnyDatabase"
]
}


このユーザー一覧は、読み書き用アカウントでは見る事が出来ません。

> use test_db
> db.auth('test','test')
1
> show users
Mon Jul 22 22:40:36.243 JavaScript execution failed: error: {
"$err" : "not authorized for query on test_db.system.users",
"code" : 16550
} at src/mongo/shell/query.js:L128


このような感じで、ユーザーにロールを割り当てる事で、そのユーザーが操作出来る範囲をコントロール出来ます。
rolesキーは配列なので、複数ロールを割り当てる事も可能です。
ユーザーに割り当てられるロールは、下記の通りです。
「***AnyDatabase」は、全論理DBに対しての権限が付加されるようです。
「readWrite」は「read」の権限を全て持っています。
「***Admin」だけの指定では、通常のコレクションを参照出来ないので、参照出来るようにするには「read」か「readWrite」の権限も一緒に定義してあげる必要があります。

  • read
  • readWrite
  • dbAdmin
  • userAdmin
  • clusterAdmin
  • readAnyDatabase
  • readWriteAnyDatabase
  • userAdminAnyDatabase
  • dbAdminAnyDatabase


権限の詳細はマニュアルをどうぞ。

ちなみに権限を割り当てる過程で、アカウントの管理ミスによりオペレーション出来なくなった場合は、慌てなくても「--auth」と「--keyFile」オプション外して再起動すれば、認証なしで利用出来ます。