MongoDB身份驗證

MongoDB身份驗證

對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,可以:

  • 通過傳遞用戶憑據或
  • 連接第一個withouth身份驗證,然後發出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 } )

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章