MongoDB 啟用身份驗(yàn)證 [譯]

概覽

如果在部署了強(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 } )
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容