概覽
如果在部署了強(qiáng)制執(zhí)行身份驗(yàn)證的 MongoDB 數(shù)據(jù)庫(kù)中啟用訪問控制,會(huì)要求用戶認(rèn)證其身份。在連接啟用了訪問控制的 MongoDB 數(shù)據(jù)庫(kù)時(shí),用戶只能執(zhí)行他所屬角色所用于的權(quán)限的相關(guān)操作。
MongoDB 支持不同的身份驗(yàn)證機(jī)制。
以下教程在一個(gè)獨(dú)立的 mongod 實(shí)例中啟用請(qǐng)求控制,并且使用默認(rèn)的身份驗(yàn)證機(jī)制。
對(duì)于副本集和分片集群,你可以參考強(qiáng)制執(zhí)行網(wǎng)絡(luò)身份驗(yàn)證來開啟請(qǐng)求控制功能。詳情請(qǐng)參考網(wǎng)絡(luò)身份驗(yàn)證章節(jié)
用戶管理員
要開啟請(qǐng)求控制,請(qǐng)確保在 admin 數(shù)據(jù)庫(kù)中已經(jīng)擁有一個(gè) userAdmin 或者 userAdminAnyDatabase 角色的用戶。這個(gè)用戶可以管理用戶、角色,例如:創(chuàng)建用戶、給用戶授權(quán)或者撤銷角色、創(chuàng)建或者修改自定義角色等。
你可以在開啟請(qǐng)求控制之前或之后創(chuàng)建用戶。如果你在沒有創(chuàng)建任何用戶之前開啟請(qǐng)求控制,MongoDB 拋出一個(gè)本地主機(jī)異常用于給你在 admin 數(shù)據(jù)庫(kù)中創(chuàng)建一個(gè)用戶管理員。一旦你已經(jīng)創(chuàng)建,你需要擁有用戶管理員授權(quán)才能創(chuàng)建其他同樣的用戶。
步驟
下面的步驟首先在沒有開啟請(qǐng)求控制時(shí)為 MongoDB 實(shí)例添加一個(gè)用戶管理員,然后在開啟請(qǐng)求控制。
1. 開啟沒有請(qǐng)求控制的 MongoDB 服務(wù)。
下面的例子開啟一個(gè)獨(dú)立的沒有請(qǐng)求控制的 mongod 實(shí)例。
mongod --port 27017 --dbpath /data/db1
2. 連接實(shí)例
下面的例子使用 mongo 殼連接實(shí)例。
mongo --port 27017
可以適當(dāng)使用額外的命令行參數(shù)去建立連接,例如 --host。
3. 創(chuàng)建用戶管理員
在 admin 數(shù)據(jù)庫(kù)中,添加一個(gè)擁有 userAdminAnyDatabase 角色的用戶。下面的例子在 admin 數(shù)據(jù)庫(kù)中創(chuàng)建 myUserAdmin 用戶。
你創(chuàng)建用戶時(shí)所在的數(shù)據(jù)庫(kù)即作為改用戶的認(rèn)證授權(quán)數(shù)據(jù)庫(kù)(此例中是 admin 數(shù)據(jù)庫(kù))。即使該用戶授權(quán)給了這個(gè)數(shù)據(jù)庫(kù),這個(gè)用戶還可以擁有其他數(shù)據(jù)庫(kù)的角色。即用戶的授權(quán)數(shù)據(jù)庫(kù)不會(huì)限制用戶的權(quán)限。
use admin
db.createUser(
{
user: "myUserAdmin",
pwd: "abc123",
roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
}
)
斷開 mongo 殼連接。
4. 帶上請(qǐng)求控制參數(shù)重啟 MongoDB 實(shí)例
使用命令行選項(xiàng) --auth 重啟 mongod 實(shí)例,如果是使用配置文件,設(shè)置 security.authorization 選項(xiàng)。
mongod --auth --port 27017 --dbpath /data/db1
現(xiàn)在連接到這個(gè)實(shí)例的客戶端都必須是已授權(quán)的 MongoDB 用戶。客戶端也只能執(zhí)行指定所屬角色擁有權(quán)限的操作。
5. 使用用戶管理員帳戶連接和授權(quán)
如果是使用 mongo 殼,你可以:
- 通過傳入用戶憑證進(jìn)行連接授權(quán)驗(yàn)證
- 不驗(yàn)證先連接,然后使用 db.auth() 解決授權(quán)驗(yàn)證問題
在連接時(shí)驗(yàn)證授權(quán)
在 mongo 殼中傳入 -u <username>, -p <password>, --authenticationDatabase <database> 參數(shù):
mongo --port 27017 -u "myUserAdmin" -p "abc123" --authenticationDatabase "admin"
連接后驗(yàn)證授權(quán)
通過 mongo 殼連接 mongod:
mongo --port 27017
切換到授權(quán)數(shù)據(jù)庫(kù)(此例中是 admin),使用 db.auth(<username>, <pwd>) 方法執(zhí)行授權(quán):
use admin
db.auth("myUserAdmin", "abc123" )
6. 根據(jù)需要?jiǎng)?chuàng)建其他用戶
使用用戶管理員授權(quán)登入后,就可以通過 db.createUser() 來創(chuàng)建更多用戶了。你可以賦予任何內(nèi)建角色或者自定義角色給這些用戶。
myUserAdmin 只有管理用戶和角色的權(quán)限,如果該用戶嘗試執(zhí)行其他操作,例如在 test 數(shù)據(jù)庫(kù)中的 foo 集合執(zhí)行讀取操作,MongoDB 會(huì)返回一個(gè)錯(cuò)誤。
下面的操作給 test 數(shù)據(jù)庫(kù)添加一個(gè)用戶 myTester,該用戶在 test 數(shù)據(jù)庫(kù)中擁有 readWrite 角色,在 reporting 數(shù)據(jù)庫(kù)中擁有 read 角色。
你創(chuàng)建用戶時(shí)所在的數(shù)據(jù)庫(kù)即作為改用戶的認(rèn)證授權(quán)數(shù)據(jù)庫(kù)(此例中是 admin 數(shù)據(jù)庫(kù))。即使該用戶授權(quán)給了這個(gè)數(shù)據(jù)庫(kù),這個(gè)用戶還可以擁有其他數(shù)據(jù)庫(kù)的角色。即用戶的授權(quán)數(shù)據(jù)庫(kù)不會(huì)限制用戶的權(quán)限。
use test
db.createUser(
{
user: "myTester",
pwd: "xyz123",
roles: [ { role: "readWrite", db: "test" },
{ role: "read", db: "reporting" } ]
}
)
7. 使用 myTester 連接和授權(quán)
在連接時(shí)驗(yàn)證授權(quán)
在 mongo 殼中傳入 -u <username>, -p <password>, --authenticationDatabase <database> 參數(shù):
mongo --port 27017 -u "myTester" -p "xyz123" --authenticationDatabase "test"
連接后驗(yàn)證授權(quán)
通過 mongo 殼連接 mongod:
mongo --port 27017
切換到授權(quán)數(shù)據(jù)庫(kù)(此例中是 test),使用 db.auth(<username>, <pwd>) 方法執(zhí)行授權(quán):
use test
db.auth("myTester", "xyz123" )
往集合中插入數(shù)據(jù)
myTester 用戶在 test 數(shù)據(jù)庫(kù)擁有讀寫操作的權(quán)限(在 reporting 數(shù)據(jù)庫(kù)中擁有讀權(quán)限)。你可以在 test 數(shù)據(jù)庫(kù)中執(zhí)行下面的插入操作:
db.foo.insert( { x: 1, y: 1 } )