MongoDBのセキュリティ設定

今回は,MongoDBのセキュリティー設定についてまとめる。
現時点で,MongoDBには,極くベーシックなセキュリティー機能が実装されているのみである。
おおまかに言うと,データベースごとにユーザーとそのパスワードを設定し,ユーザーIDなし,あるいは他のユーザーからのアクセスを制限することができる。以下にその手順を紹介する。なお,詳しくは,MongoDBのWebサイトを参照していただきたい。特に以下のページは必読。
http://www.mongodb.org/display/DOCS/Security+and+Authentication
http://www.mongodb.org/display/DOCS/File+Based+Configuration
1.認証機能の有効化(ただし,今はやらない)

まず,MongoDBは,インストール直後のデフォルトモードとして,認証機能が外されている。これをオンにしない限り,アクセス制限などをいくら設定しても,セキュリティー機能は一切働かない。

認証機能を有効にするには,mongodを起動するコマンドに「–auth」という引数を与えるか,mongodの構成ファイル,/etc/mongod.confにある,authという値をtrueにすればいい。

注:上記MongoDBのWebサイトの二つ目のページには,このファイルが/etc/mongodb.confと記されているが,これは/etc/mongod.confの誤りである。実際には,どちらでも構わないのだが,mongodサービスのスタートアッププロシジャである,/etc/init.d/mongodは,mongodコマンドに,「-f /etc/mongod.conf」という引数を与えているし,インストールしたときに作られるオプションファイルの雛形も/etc/mongod.confである。

以下,構成ファイルを変更する手段を採る。

/etc/mongod.confをviなどで開き,authという文字列を検索すると,コメントアウトされた,「#noauth = true」と「#auth = true」の2行が見つかるはずだ。デフォルトはnoauth=trueなので,このように両方コメントアウトされていても認証機能は動いていない状態にあるわけだ。認証機能を開始するにはauthのみコメントを外せばいいだろう。

ただ,この操作をすると,いきなり認証が厳しくなり,以下の作業がやりにくくなる可能性があるので,ここでは一旦このファイルをいじらずに,まずは以下のユーザー設定をやってしまうことをお勧めする。

2. 管理者の設定

adminというデータベースに作られたユーザーが,そのMongoDB全体の管理者として機能する。
登録するには,dbオブジェクトのaddUser関数を使う。たとえば,rootというユーザーを登録するとすると,

$ mongo
> use admin
switched to db admin
> db.addUser(“root”, “[root’s password]”)

今現在は認証機能が無効なので,たとえログインしてなくても,すべてのデータベースにアクセスできてしまうので,以降の操作に何ら支障はない。
もし,この時点ですでに認証機能が有効だとすると,以降の操作は認証を得たユーザーでないと続行できない。これについては,6.を参照のこと。

さて,そうはいっても,認証機能が無効で,何の変化もない。本当にユーザーは登録されたのかが心配になる。そこで,ユーザー登録を確認してみよう。それには,当該データベースの,system.usersというコレクションを見ればよい。

> use admin (上記の続きなら不要)
> db.system.users.find()
{ “_id” : ObjectID(“[Object ID]”), “user” : “root”, “readOnly” : false, “pwd” :”[encrypted password]” }

3. 各データベースのユーザー設定

このあと,パスワード保護したいデータベースを一つずつ訪れて,ユーザーを作成する。
認証機能が有効の場合は,adminユーザーとしてログインしてあることが前提となる。

> use db1
> db.addUser(“[UserID for db1]”, “[password]”)

確認方法は同じく db.system.users.find() でできる。

できたら,一旦ログアウトし,再びmongoコマンドインターフェースを起動する。
再びデータベースを訪れ,それぞれauthで認証ができるか確認しよう。
ここまでまだ認証機能が無効なので,何かあってもロックアウトしないで済む。

もちろん,ユーザーはそのデータベースに対し,必要なだけ追加できる。また,読込み専用ユーザーも作ることができる。その場合,addUserに第三引数として”true”を入れる。第三引数は”readOnly”であり,デフォルトが”false”なのである。

> db.addUser(“[UserID for db1]”, “[password]”, true)

4. 認証機能を有効にする

あとは,一旦mongodのサービスを停め,構成ファイルを編集して,auth=trueを付け,再びmongodを起動すればよい。

5. データベース追加後の処理

これ以降,データベースを追加し,それをパスワード保護する場合は,以下の手順を踏む。

a) adminデータベースにログイン
b) use (新データベースは,この時点でまだ存在しなくてもできるはず)
c) db.addUserでユーザーを追加する。
d) 新データベースにその他の処理が必要なら,db.authで認証を取り作業を続ける。

6. 認証機能有効時のログイン処理

認証機能が有効になると,目的データベースにログインしない限り,そのデータベースの処理はできない。また,MongoDB全体の処理,たとえば「show dbs」コマンドのような基本的な操作であっても,全体にかかわる場合は,adminデータベースにログインしていないと処理ができない。

そこで,ログインしていない状態(単に「mongo」でmongoコマンドインタフェースに入った場合など)から,あるデータベースにログインするにはどうするか。あるいは,一つのデータベースにログインしている状態から,別のデータベースにログインする場合はどうするかについてまとめておく。方法はいろいろある。

方法1: mongoコマンド中から認証を受ける。

すでにmongoコマンドインタフェースに入っている場合,そのデータベース中でauthというコマンドを発行すればよい。db1というデータベースにログインする場合,

> use db1
> db.auth(“[UserID]”, “[Password]”)
1

1が出力されれば,認証成功。0は失敗である。

方法2: ログインし直す(その1)

一番手っ取り早いのは,もしすでにmongoコマンドインタフェースに入っているなら,一旦そこから出て,ログインし直すことである。「その1」はログイン時に直接目的のデータベースに入ってしまう方法で,この場合はデータベース名も指定しないとならない。

> exit
bye

$ mongo db1 -u [UserID] -p [Password]
MongoDBshell version 1.8.2
connecting to: db1
>

方法3: ログインし直す(その2)

これは,上記二つの方法を組み合わせたもの。データベース指定をしなければ,ユーザーIDとパスワードは不要なので,これでとりあえずmongoコマンドインタフェースに入り,目的データベースに入ってから,方法1に従って認証を得る。

> exit
bye

$ mongo
MongoDBshell version 1.8.2
connecting to: test
> use db1
switched to db db1
> db.auth(“[UserID]”, “[Password]”)
1

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です