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

中年engineerの独り言 - crumbjp

LinuxとApacheの憂鬱

MongoDB 2.4 認証周り

以前、盛大にハマったので、備忘録です。

コアサーバ

keyFileオプションの扱い(2.2から変わったかもしれない。。。)

keyFileオプションを指定すると、authオプションも指定された事になる。
つまりkeyFileオプションはレプリカセット・ノード間の認証と、クライアント認証を同時に有効にする。

localhost(127.0.0.1)ポート

admin DBに最初のユーザが追加されるまでは認証無しでadmin DBをコントロールできる。
なので、最初から認証有効(auth=true)な状態で上げてしまっても、ちゃんと構築できる!

設定例
replSet=RS
# サービスIPの他にlocalhostも空けないと構築出来ない為bind_ipは設定しない。(構築完了後はbind_ipを設定しても良い)
# bind_ip=192.168.159.142
port=27017
# keyFileを指定したので、auth = true となる。
keyFile=/usr/local/mongo/conf/replkey
dbpath=/usr/local/mongo/data00
pidfilepath=/usr/local/mongo/logs/mongod00.pid
logpath=/usr/local/mongo/logs/mongod00.log
logappend=true
quiet=true
fork=true
directoryperdb=true
maxConns=20000
slowms=1000
nohttpinterface=true
notablescan=true
nssize=4
authレプリカセット構築の流れ
// auth有効であっても新規ノード起動直後のまっさらな状態にはログインできる
$ mongo 
MongoDB shell version: 2.4.1-pre-
connecting to: test
// レプリカセット初期化も普通にできる
> myconf = { ... }
> rs.initiate(myconf)
{
 "info" : "Config now saved locally.  Should come online in about a minute.",
 "ok" : 1
}
// 暫くするとPRIMARYになる(かもしれない)
RS:SECONDARY>
 :
RS:PRIMARY>
// admin DBにcrumbユーザを追加
RS:PRIMARY> use admin
RS:PRIMARY> db.addUser('crumb','jp')
// 直後にunauthorized user に変わる
>
// もう何も受け付けない。。。
> rs.status()
{ "ok" : 0, "errmsg" : "unauthorized" }
// 再認証すればログインできる
> db.auth('crumb','jp')
1
RS:PRIMARY>
// 一旦mongoから抜けて認証付きで入りなおしてみる。
bye
$ mongo 192.168.159.142:27017/admin -u crumb -p jp
MongoDB shell version: 2.4.1-pre-
connecting to: 192.168.159.142:27017/admin
RS:PRIMARY>
// ついでに監視用の読み専ユーザも作っとくか
RS:PRIMARY> db.addUser('watch','dog',true)
まとめ
keyFile
レプリカセット・ノード間の認証を行う為のファイル(共通鍵)を指定する。
しかし暗黙的にクライアント認証も有効になる事に注意
localhost
新規構築時に必要なので空けておいた方がいい。
admin DBにユーザ作成
最初のユーザを作成する事で完全なクライアント認証が有効になる。
新規構築時には必ず一気にココまでやってセキュリティーを確保する事!

クライアント側(ツール類)

これらのツールには--authenticationDatabaseオプションが追加された。(どのDBで認証するのか?)

  • mongodump/mongorestore
  • mongoexport/mongoimport
  • mongostat
  • mongotop

特にmongostat,mongotopはレプリカセットの内容を扱うのでadmin DBを指定しなければならない。

$ mongostat -h 192.168.159.142 --port 27017  -u watch -p dog --discover  --authenticationDatabase admin
[ authentication