おれのメモ帳_φ(-ω-`*)メモメモ

Gehirn で MongoDB でユーザ認証とか

前回、他のユーザの mongod に接続できちゃったのもあるし、ユーザ認証を入れることにする。以下、作業ログ垂れ流し。

ユーザを追加する(失敗)

接続して、

$ mongo localhost:42998
MongoDB shell version: 2.2.3
connecting to: localhost:42998/test

admin データベースにユーザを追加する

> use admin
switched to db admin
> db.addUser("USER", "PASSWORD")
{
"user" : "USER",
"readOnly" : false,
"pwd" : "13b909a63833a3a8020a73815ce031f7",
"_id" : ObjectId("51260c4176c2330fa4c5d994")
}
Thu Feb 21 21:00:01 Socket recv() errno:104 Connection reset by peer 127.0.0.1:42998
Thu Feb 21 21:00:01 SocketException: remote: 127.0.0.1:42998 error: 9001 socket exception [1] server [127.0.0.1:42998] 
Thu Feb 21 21:00:01 DBClientCursor::init call() failed
Thu Feb 21 21:00:01 query failed : admin.$cmd { getlasterror: 1.0, w: "majority", wtimeout: 30000.0 } to: localhost:42998
could not find getLastError object : {
"message" : "error doing query: failed",
"fileName" : "src/mongo/shell/collection.js",
"lineNumber" : 155,
"stack" : "find(\"admin.$cmd\",[object Object],undefined,-1,0,0,0)@:0\n([object Object])@src/mongo/shell/collection.js:155\n([object Object])@src/mongo/shell/db.js:49\n(\"majority\",30000)@src/mongo/shell/db.js:623\n(\"USER\",\"PASSWORD\")@src/mongo/shell/db.js:99\n@(shell):1\n",
"name" : "Error"
}
Thu Feb 21 21:00:01 trying reconnect to localhost:42998
Thu Feb 21 21:00:01 reconnect localhost:42998 failed couldn't connect to server localhost:42998
Thu Feb 21 21:00:01 Error: 9001 socket exception [6] server [localhost:42998]  src/mongo/shell/collection.js:155

できない!なぜ!てかエラーで mongod が落ちた!
そこはかとなく昨日の path 問題と同じ香りがする。

実環境で起動しなおし

仮想 root 環境で mongod を上げたせいかもしれないので、実環境で上げなおしてみる。

$ ~/root/usr/bin/mongod -f ~/root/etc/mongodb.conf
all output going to: /var/log/mongodb/mongodb.log
can't open [/var/log/mongodb/mongodb.log] for log file: errno:2 No such file or directory
Thu Feb 21 21:54:45 [initandlisten] MongoDB starting : pid=6519 port=42998 dbpath=/home/****/root/var/lib/mongodb 64-bit host=s11
Thu Feb 21 21:54:45 [initandlisten] db version v2.2.3, pdfile version 4.5
Thu Feb 21 21:54:45 [initandlisten] git version: f570771a5d8a3846eb7586eaffcf4c2f4a96bf08
Thu Feb 21 21:54:45 [initandlisten] build info: Linux ip-10-2-29-40 2.6.21.7-2.ec2.v1.2.fc8xen #1 SMP Fri Nov 20 17:48:28 EST 2009 x86_64 BOOST_LIB_VERSION=1_49
Thu Feb 21 21:54:45 [initandlisten] options: { config: "/home/****/root/etc/mongodb.conf", dbpath: "/home/****/root/var/lib/mongodb", logappend: "true", logpath: "/var/log/mongodb/mongodb.log", port: 42998 }
Thu Feb 21 21:54:46 [initandlisten] journal dir=/home/****/root/var/lib/mongodb/journal
Thu Feb 21 21:54:46 [initandlisten] recover begin
Thu Feb 21 21:54:46 [initandlisten] info no lsn file in journal/ directory
Thu Feb 21 21:54:46 [initandlisten] recover lsn: 0
Thu Feb 21 21:54:46 [initandlisten] recover /home/****/root/var/lib/mongodb/journal/j._0
Thu Feb 21 21:54:46 [initandlisten] recover cleaning up
Thu Feb 21 21:54:46 [initandlisten] removeJournalFiles
Thu Feb 21 21:54:46 [initandlisten] recover done
Thu Feb 21 21:54:46 [initandlisten] preallocateIsFaster=true 2.26
Thu Feb 21 21:54:47 [websvr] admin web console waiting for connections on port 44984
Thu Feb 21 21:54:47 [initandlisten] waiting for connections on port 42998

上がったけどログ出力先が仮想 path のままなので標準出力に出てきてしまってる。
そういえば昨日 dbpath しか変更してなかった。

ログ出力パスを変更

パスを変更して

$ vi ~/root/etc/mongodb.conf
#logpath=/var/log/mongodb/mongodb.log
logpath=/home/*my_gehirn_username*/root/var/log/mongodb/mongodb.log

もう一度起動する

$ ~/root/usr/bin/mongod -f ~/root/etc/mongodb.conf
all output going to: /home/****/root/var/log/mongodb/mongodb.log

&つけ忘れたので、Ctrl+Zしてバックグラウンドにする。

^Z
[1]  + 31993 suspended  ~/root/usr/bin/mongod -f ~/root/etc/mongodb.conf
$ bg
[1]  + 31993 continued  ~/root/usr/bin/mongod -f ~/root/etc/mongodb.conf

今度こそユーザを追加する

接続する。

$ mongo localhost:42998
MongoDB shell version: 2.2.3
connecting to: localhost:42998/test
>

もう一度ユーザを作成してみる。

> use admin
switched to db admin
> db.addUser("USER","PASSWORD")
{
        "user" : "USER",
        "readOnly" : false,
        "pwd" : "7926766159abc3621e45745bcbd9485f",
        "_id" : ObjectId("512626fa7e1e58618ddbf680")
}
> db.system.users.find()
{ "_id" : ObjectId("512626fa7e1e58618ddbf680"), "user" : "USER", "readOnly" : false, "pwd" : "7926766159abc3621e45745bcbd9485f" }
>

できた。

ユーザ認証を有効にする

最後に conf ファイルでユーザ認証設定を有効にして mongod を起動しなおす。

$ vi ~/root/etc/mongodb.conf
#noauth = true
auth = true

認証テスト

起動しなおしたら接続する。

$ mongo localhost:42998
MongoDB shell version: 2.2.3
connecting to: localhost:42998/test
> show dbs
Thu Feb 21 23:13:59 uncaught exception: listDatabases failed:{ "errmsg" : "need to login", "ok" : 0 }
> 

need to login てエラーが出てるので認証は有効になっているぽい。

認証してみる。

> db.auth("USER","PASSWORD")
1
> show collections
system.indexes
system.users
>

できた。