MongoDB的2進位安裝極其簡單,按照官方文檔的操作來,預設是沒有使用者認證的…運行效率雖然很高,未免
不太安全。
下面介紹如何使用auth方式來進行使用者認證(keyFile方式我還沒看..)
1) 不使用 –auth參數,啟動 mongodb
2) 建立 User Administrator.
mongodb裡面沒有root這種超級許可權無敵的使用者,但是有User Administrator,它可以管理其它使用者~~,但
是就沒有其它的特殊許可權了。
如果一個使用者有了userAdminAnyDatabase 許可權,它就成為了 User Administrator。
| 代碼如下 |
複製代碼 |
USE admin; 或者 : db = db.getSiblingDB('admin')
|
添加使用者
| 代碼如下 |
複製代碼 |
db.addUser( { USER: "root", pwd: "123456", roles: [ "userAdminAnyDatabase" ] } ) 查看admin庫裡面的全部使用者: USE admin; db.system.users.find(); { "_id" : ObjectId("xxxxxx"), "pwd" : "xxxxxxxxxxxxxxxxxxxxxxxxxxx", "roles" : [ "userAdminAnyDatabase" ], "user" : "root" } |
這樣就在admin庫中添加了一個名為root,密碼為123456的User Administrator。
3) 使用 –auth參數啟動mongodb
4) 使用User Administrator登入並完成認證。
| 代碼如下 |
複製代碼 |
[root@yw-0-0 logs]# mongo xxx.xxx.xx.xxx MongoDB shell version: 2.2.3 connecting TO: xxx.xxx.xx.xxx/test > USE admin; switched TO db admin #認證, 1表示成功 > db.auth("root", "123456"); 1 #查看admin庫中全部使用者: > db.system.users.find(); { "_id" : ObjectId("xxxxxx"), "pwd" : "xxxxxxxxxxxxxxxxxxxxxxxxxxx", "roles" : [ "userAdminAnyDatabase" ], "user" : "root" } > #查看全部的表,會提示無許可權,因為我們建立的root使用者就只有使用者管理的許可權: > SHOW TABLES; Tue Sep 24 10:37:00 EXEC error: src/mongo/shell/query.js:128 error: { "$err" : "not authorized for query on cleanmaster.system.namespaces", "code" : 16550 } throw "error: " + tojson( ret ); |
5) 建立其它使用者
使用者都是跟著庫走的,使用者資訊也會儲存到庫的system.users表裡面。
When adding a user to multiple databases, you must define the user for each database.
> USE cm;
#建立使用者cm,密碼123456, 許可權為readWrite和dbAdmin
> db.addUser( { USER: "cm",pwd: "123456",roles: [ "readWrite", "dbAdmin" ]} )
Tue Sep 24 10:53:51 EXEC error: src/mongo/shell/db.js:64 password can't be empty
throw "password can't be empty";
這個問題困擾了我好久啊...
後來發現用戶端是2.2.3,服務端是2.4.6........
換成最新的用戶端就ok了:
| 代碼如下 |
複製代碼 |
> db.addUser( { user: "cm",pwd: "123456",roles: [ "readWrite", "dbAdmin" ]} ) { "USER" : "cm", "pwd" : "687312e8f13ef54ec5d213f4eadf1d98", "roles" : [ "readWrite", "dbAdmin" ], "_id" : ObjectId("5241005872de6152c88ca17d") } > db.system.users.find(); { "_id" : ObjectId("5241005872de6152c88ca17d"), "USER" : "cm", "pwd" : "687312e8f13ef54ec5d213f4eadf1d98", "roles" : [ "readWrite", "dbAdmin" ] } > use cm #使用新使用者認證: > db.auth("cm","123456"); 1 > show tables; system.indexes system.users |
6) 修改密碼
| 代碼如下 |
複製代碼 |
db = db.getSiblingDB('cm') #修改新密碼為 1-6 db.changeUserPassword("cm", "1-6") |
7) 後記
之所以寫這篇文章,是因為百度出來的資料都不靠譜啊!