MongoDB 3.0系で作成したユーザがRobomongoからアクセス出来ない場合の対処

robot photo
Photo by bcogwene

環境

  • Ubuntu 14.04(MongoDBが載っているサーバ)
  • MongoDB 3.0.4
  • Robomongo 0.8.5
  • クライアント(Windows / Mac)

症状

MongoDB3.0以降で作成したユーザを用いて,Robomongoからログインしようとすると認証エラーになる

原因

MongoDB 3.0以降は,ユーザ認証メカニズムにSCRAM-SHA-1方式を用いるようになり,新規に作成したユーザはSCRAM-SHA-1方式で認証情報を持つようになる.一方,RobomongoはまだSCRAM-SHA-1方式に対応しておらず,MONGODB-CR方式で認証をおこなおうとするが,MongoDBから拒絶されるために認証されない.

参照:Users can’t authenticate with authenticationMechanisms=MONGODB-CR

解決策

  • Robomongoを0.9.0になるまで使わない.0.9.0に向けて対応を進めているそうです → Can’t Connect to Mongo 3.0 DB server
  • MongoDB側の認証機構をMONGODB-CR方式に戻す

MongoDB側の認証機構をMONGODB-CR方式に戻す方法

MongoDBのauthSchemaを5(MongoDB3.0のデフォルト)から3にします.まず,現在のバージョンを確認します.

> use admin
> db.system.version.find()
{ "_id" : "authSchema", "currentVersion" : 5 }

現在ユーザ認証をONにしている場合は一旦OFFにします.

$ sudo vi /etc/mongod.conf
# Turn on/off security.  Off is currently the default
noauth = true
#auth = true

authSchemaを3に変更します.

> use admin
> var schema = db.system.version.findOne({"_id" : "authSchema"})
> schema.currentVersion = 3
> db.system.version.save(schema)

ユーザ認証をONにしてMongoDBを再起動します.

$ sudo vi /etc/mongod.conf
# Turn on/off security.  Off is currently the default
#noauth = true
auth = true
$ sudo service mongod restart

これでMONGODB-CR方式での認証に戻りました.ただし,MONGODB-CR方式の認証情報を持っていないユーザ(例えばMongoDB3.0になってから作成したユーザ)はパスワードの再設定が必要です.

SCRAM-SHA-1方式の認証情報を持つユーザを探す:
> db.system.users.find({ "credentials.SCRAM-SHA-1" : { $exists: true}}, { user: 1, db: 1})
MONGODB-CR方式の認証情報を持つユーザを探す:
> db.system.users.find({ "credentials.MONGODB-CR" : { $exists: true}}, { user: 1, db: 1})
パスワードを変更する:
db.changeUserPassword("User name", "New Password")

以上です.