對(duì)MongoDB部署啟用訪問(wèn)控制會(huì)強(qiáng)制執(zhí)行用戶身份驗(yàn)證,要求在登錄MongoDB系統(tǒng)用戶識(shí)別自己。 當(dāng)訪問(wèn)啟用了訪問(wèn)控制的MongoDB部署時(shí),用戶只能執(zhí)行由其角色確定的操作。
對(duì)于認(rèn)證,MongoDB支持各種認(rèn)證機(jī)制。
以下教程啟用獨(dú)立 mongod 實(shí)例的訪問(wèn)控制,并使用默認(rèn)身份驗(yàn)證機(jī)制。
啟用訪問(wèn)控制后,請(qǐng)確保在 admin 數(shù)據(jù)庫(kù)中擁有 userAdmin 或 userAdminAnyDatabase 角色的用戶。該用戶可以管理用戶和角色,例如:創(chuàng)建用戶,授予或撤銷用戶角色,以及創(chuàng)建或修改定義角色。
可以在啟用訪問(wèn)控制之前或之后創(chuàng)建用戶。如果在創(chuàng)建任何用戶之前啟用訪問(wèn)控制,MongoDB將提供本地主機(jī)異常,允許在管理數(shù)據(jù)庫(kù)中創(chuàng)建用戶管理員。創(chuàng)建后,必須作為用戶管理員進(jìn)行身份驗(yàn)證,以根據(jù)需要?jiǎng)?chuàng)建其他用戶。
以下過(guò)程首先將用戶管理員添加到運(yùn)行無(wú)訪問(wèn)控制的 MongoDB 實(shí)例,然后啟用訪問(wèn)控制。
第一步:?jiǎn)?dòng)MongoDB無(wú)需訪問(wèn)控制
例如,以下啟動(dòng)不具有訪問(wèn)控制的獨(dú)立 mongod 實(shí)例。
mongod --port 27017 --dbpath /data/db1
第二步:連接到實(shí)例
例如,使用mongo shell連接到實(shí)例。
mongo --port 27017
根據(jù)需要指定其他命令行選項(xiàng)以將mongo shell連接到部署,例如--host。
第三步:創(chuàng)建用戶管理員
在管理數(shù)據(jù)庫(kù)中,添加具有 userAdminAnyDatabase 角色的用戶。 例如,以下在 admin 數(shù)據(jù)庫(kù)中創(chuàng)建用戶 myUserAdmin:
注意:創(chuàng)建用戶的數(shù)據(jù)庫(kù)(在此示例中為
admin)是用戶的身份驗(yàn)證數(shù)據(jù)庫(kù)。用戶將對(duì)該數(shù)據(jù)庫(kù)進(jìn)行身份驗(yàn)證,但用戶可以在其他數(shù)據(jù)庫(kù)中擔(dān)任角色; 即用戶的認(rèn)證數(shù)據(jù)庫(kù)不限制用戶的權(quán)限。
use admin
db.createUser(
{
user: "myUserAdmin",
pwd: "abc123",
roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
}
)
執(zhí)行上面命令后,斷開(kāi)mongo shell。
第四步:重新啟動(dòng)具有訪問(wèn)控制的MongoDB實(shí)例
使用--auth命令行選項(xiàng)重新啟動(dòng) mongod 實(shí)例,或者如果使用配置文件,則執(zhí)行security.authorization設(shè)置。
mongod --auth --port 27017 --dbpath /data/db1
連接到此實(shí)例的客戶端現(xiàn)在必須以 MongoDB 用戶身份進(jìn)行身份驗(yàn)證??蛻糁荒軋?zhí)行由其分配的角色確定的操作。
第五步:以用戶管理員身份進(jìn)行連接和驗(yàn)證
使用 mongo shell,可以:
db.auth()方法進(jìn)行身份驗(yàn)證。在連接期間進(jìn)行身份驗(yàn)證
使用-u <username>,-p <password>和--authenticationDatabase <database>命令行選項(xiàng)啟動(dòng)一個(gè)mongo shell:
$ mongo --port 27017 -u "myUserAdmin" -p "abc123" --authenticationDatabase "admin"
連接后驗(yàn)證
將 mongo shell 連接到 mongodb,也就是先連接,后驗(yàn)證用戶身份 :
mongo --port 27017
切換到身份驗(yàn)證數(shù)據(jù)庫(kù)(在這種情況下為admin),并使用db.auth(<username>,<pwd>)方法進(jìn)行身份驗(yàn)證:
use admin
db.auth("myUserAdmin", "abc123" )
第六步:根據(jù)需要?jiǎng)?chuàng)建其他用戶
當(dāng)管理員用戶進(jìn)行身份驗(yàn)證通過(guò)之后,可使用db.createUser()創(chuàng)建其他用戶??梢詾橛脩舴峙淙魏蝺?nèi)置角色或用戶定義的角色。
myUserAdmin用戶只具有管理用戶和角色的權(quán)限。如果使用myUserAdmin嘗試執(zhí)行任何其他操作,例如從test數(shù)據(jù)庫(kù)中的foo集合讀取數(shù)據(jù),MongoDB將返回錯(cuò)誤。
以下操作將用戶 myTester 添加到在test數(shù)據(jù)庫(kù)中并給予test數(shù)據(jù)庫(kù)的readWrite角色以及在reporting數(shù)據(jù)庫(kù)中讀取角色。
注意:創(chuàng)建用戶的數(shù)據(jù)庫(kù)(在本示例中為
test)是該用戶的身份驗(yàn)證數(shù)據(jù)庫(kù)。雖然用戶將對(duì)該數(shù)據(jù)庫(kù)進(jìn)行身份驗(yàn)證,但用戶可以在其他數(shù)據(jù)庫(kù)中擔(dān)任角色; 即用戶的認(rèn)證數(shù)據(jù)庫(kù)不會(huì)限制用戶的權(quán)限。
use test
db.createUser(
{
user: "myTester",
pwd: "xyz123",
roles: [ { role: "readWrite", db: "test" },
{ role: "read", db: "reporting" } ]
}
)
第七步:連接并驗(yàn)證為myTester
在連接期間進(jìn)行身份驗(yàn)證
使用-u <username>,-p <password>和--authenticationDatabase <database>命令行選項(xiàng)啟動(dòng)一個(gè)mongo shell:
$ mongo --port 27017 -u "myTester" -p "xyz123" --authenticationDatabase "test"
連接后驗(yàn)證
將mongo shell連接到 mongodb:
$ mongo --port 27017
切換到身份驗(yàn)證數(shù)據(jù)庫(kù)(在這里為test),并使用db.auth(<username>,<pwd>)方法進(jìn)行身份驗(yàn)證:
> use test
> db.auth("myTester", "xyz123" )
使用用戶 myTester 插入一個(gè)集合
使用用戶 myTester,此用戶有權(quán)在test數(shù)據(jù)庫(kù)中執(zhí)行讀寫操作(以及在reporting數(shù)據(jù)庫(kù)中執(zhí)行讀操作)。 例如,在test數(shù)據(jù)庫(kù)中執(zhí)行以下插入操作:
> db.foo.insert( { x: 1, y: 1 } )
最后,使用用戶 myTester,在reporting數(shù)據(jù)庫(kù)中執(zhí)行插入操作看看返回結(jié)果:
> use reporting
db.auth("myTester", "xyz123" )
db.product.insert( { x: 1, y: 1 } )