對MongoDB部署啟用存取控制會強制執行使用者身份驗證,要求在登入MongoDB系統使用者識別自己。 當存取啟用了存取控制的MongoDB部署時,使用者只能執行由其角色確定的操作。
對於認證,MongoDB支援各種認證機制。
以下教學啟用獨立 mongod 範例的存取控制,並使用預設身份驗證機制。
啟用存取控制後,請確保在 admin
資料庫中擁有 userAdmin
或 userAdminAnyDatabase
角色的使用者。該使用者可以管理使用者和角色,例如:建立使用者,授予或復原使用者角色,以及建立或修改定義角色。
可以在啟用存取控制之前或之後建立使用者。如果在建立任何使用者之前啟用存取控制,MongoDB將提供本地主機異常,允許在管理資料庫中建立使用者管理員。建立後,必須作為使用者管理員進行身份驗證,以根據需要建立其他使用者。
以下過程首先將使用者管理員新增到執行無存取控制的 MongoDB 範例,然後啟用存取控制。
第一步:啟動MongoDB無需存取控制
例如,以下啟動不具有存取控制的獨立 mongod 範例。
mongod --port 27017 --dbpath /data/db1
第二步:連線到範例
例如,使用mongo shell
連線到範例。
mongo --port 27017
根據需要指定其他命令列選項以將mongo shell
連線到部署,例如--host
。
第三步:建立使用者管理員
在管理資料庫中,新增具有 userAdminAnyDatabase
角色的使用者。 例如,以下在 admin
資料庫中建立使用者 myUserAdmin
:
注意:建立使用者的資料庫(在此範例中為
admin
)是使用者的身份驗證資料庫。使用者將對該資料庫進行身份驗證,但使用者可以在其他資料庫中擔任角色; 即使用者的認證資料庫不限制使用者的許可權。
use admin
db.createUser(
{
user: "myUserAdmin",
pwd: "abc123",
roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
}
)
執行上面命令後,斷開mongo shell。
第四步:重新啟動具有存取控制的MongoDB範例
使用--auth
命令列選項重新啟動 mongod
範例,或者如果使用組態檔案,則執行security.authorization
設定。
mongod --auth --port 27017 --dbpath /data/db1
連線到此範例的用戶端現在必須以 MongoDB
使用者身份進行身份驗證。客戶只能執行由其分配的角色確定的操作。
第五步:以使用者管理員身份進行連線和驗證
使用 mongo shell,可以:
db.auth()
方法進行身份驗證。在連線期間進行身份驗證
使用-u <username>
,-p <password>
和--authenticationDatabase <database>
命令列選項啟動一個mongo shell
:
$ mongo --port 27017 -u "myUserAdmin" -p "abc123" --authenticationDatabase "admin"
連線後驗證
將 mongo shell 連線到 mongodb
,也就是先連線,後驗證使用者身份 :
mongo --port 27017
切換到身份驗證資料庫(在這種情況下為admin
),並使用db.auth(<username>,<pwd>)
方法進行身份驗證:
use admin
db.auth("myUserAdmin", "abc123" )
第六步:根據需要建立其他使用者
當管理員使用者進行身份驗證通過之後,可使用db.createUser()
建立其他使用者。可以為使用者分配任何內建角色或使用者定義的角色。
myUserAdmin
使用者只具有管理使用者和角色的許可權。如果使用myUserAdmin
嘗試執行任何其他操作,例如從test
資料庫中的foo
集合讀取資料,MongoDB將返回錯誤。
以下操作將使用者 myTester
新增到在test
資料庫中並給予test
資料庫的readWrite
角色以及在reporting
資料庫中讀取角色。
注意:建立使用者的資料庫(在本範例中為
test
)是該使用者的身份驗證資料庫。雖然使用者將對該資料庫進行身份驗證,但使用者可以在其他資料庫中擔任角色; 即使用者的認證資料庫不會限制使用者的許可權。
use test
db.createUser(
{
user: "myTester",
pwd: "xyz123",
roles: [ { role: "readWrite", db: "test" },
{ role: "read", db: "reporting" } ]
}
)
第七步:連線並驗證為myTester
在連線期間進行身份驗證
使用-u <username>
,-p <password>
和--authenticationDatabase <database>
命令列選項啟動一個mongo shell:
$ mongo --port 27017 -u "myTester" -p "xyz123" --authenticationDatabase "test"
連線後驗證
將mongo shell連線到 mongodb:
$ mongo --port 27017
切換到身份驗證資料庫(在這裡為test
),並使用db.auth(<username>,<pwd>)
方法進行身份驗證:
> use test
> db.auth("myTester", "xyz123" )
使用使用者 myTester
插入一個集合
使用使用者 myTester
,此使用者有權在test
資料庫中執行讀寫操作(以及在reporting
資料庫中執行讀操作)。 例如,在test
資料庫中執行以下插入操作:
> db.foo.insert( { x: 1, y: 1 } )
最後,使用使用者 myTester
,在reporting
資料庫中執行插入操作看看返回結果:
> use reporting
db.auth("myTester", "xyz123" )
db.product.insert( { x: 1, y: 1 } )