阿里雲ECS服務器環境搭建(5) —— ubuntu 16.04 下爲mongodb各個數據庫設置用戶名和密碼

阿里雲ECS服務器環境搭建(5) —— ubuntu 16.04 下爲mongodb各個數據庫設置用戶名和密碼

1. 環境

  • 阿里雲 ECS服務器 (4核 8G 4M)
  • Ubuntu16.04-64-bit 圖形界面
  • MongoDB v3.6.5

2. 前提須知

  • 開啓mongodb服務的命令:service mongod start
  • 關閉mongodb服務的命令:service mongod stop
  • mongodb的配置文件位置在: /etc/mongod.conf
  • MongoDB在默認情況下是沒有認證權限的,因爲/etc/mongod.conf 中,默認auth = false
  • mongodb的用戶名和密碼是基於特定數據庫的,而不是基於整個系統的。一般來說所有的數據庫db都需要設置用戶名和密碼,獨立認證的。
  • 要想使設置的用戶名和密碼有效,需要修改MongoDB的配置文件,將 /etc/mongod.conf 文件中的 auth=true 前面的註釋去掉。

3. mongodb用戶設置規則

3.1. 語法規則

db.createUser(  
{ user: "<name>",  
  pwd: "<cleartext password>",  
  customData: { <any information> },  
  roles: [  
    { role: "<role>", db: "<database>" } | "<role>",  
    ...  
  ]}  
)  

# 栗子
use admin  
db.createUser({user:'useradmin',pwd:'123456',customData:{"desc":"This user is for administrators"},  
roles:[{role:'userAdminAnyDatabase',db:'admin'}]})  
  • 參數說明:
    • user:用戶名
    • pwd:密碼
    • customData:用於描述賬戶信息
    • roles:指定用戶的角色,可以用一個空數組給新用戶設定空角色;在roles字段,可以指定內置角色和用戶定義的角色。role裏的角色可以選擇如下,參考3.2

3.2. mongodb角色roles詳解

  • mongodb內置角色:
    • 數據庫用戶角色(Database User Roles):read、readWrite
      Read:允許用戶讀取指定數據庫
      readWrite:允許用戶讀寫指定數據庫
    • 數據庫管理角色(Database Administration Roles):dbAdmin、dbOwner、userAdmin
      dbAdmin:允許用戶在指定數據庫中執行管理函數,如索引創建、刪除,查看統計或訪問system.profile
      dbOwner:允許用戶在當前數據庫中執行任意操作。
      userAdmin:允許用戶在當前DB中管理User,向system.users集合寫入,可以在指定數據庫裏創建、刪除和管理用戶
    • 集羣管理角色(Cluster Administration Roles):clusterAdmin、clusterManager、clusterMonitor、hostManager
      clusterAdmin:只在admin數據庫中可用,授予管理集羣的最高權限,用戶所有分片和複製集相關函數的管理權限。
      clusterManager:授予管理和監控集羣的權限,A user with this role can access the config and local databases, which are used in sharding and replication, respectively.
      clusterMonitor:授予監控集羣的權限,對監控工具具有readonly的權限
      hostManager:管理Server
    • 備份恢復角色(Backup and Restoration Roles):backup、restore
      backup, retore:在進行備份、恢復時可以單獨指定的角色,在db.createUser()方法中roles裏面的db必須寫成是admin庫,要不然會報錯。
    • 跨數據庫角色(All-Database Roles):readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase
      readAnyDatabase:只在admin數據庫中可用,授予用戶在所有數據庫上讀取數據的權限。
      readWriteAnyDatabase:只在admin數據庫中可用,授予用戶在所有數據庫上讀寫數據的權限。
      userAdminAnyDatabase:只在admin數據庫中可用,授予用戶在所有數據庫的userAdmin權限。
      dbAdminAnyDatabase:只在admin數據庫中可用,授予用戶在所有數據庫的dbAdmin權限。
    • 超級用戶角色:root
      root:只在admin數據庫中可用。超級賬號,超級權限。可以訪問所有的數據庫~
      # 這裏還有幾個角色間接或直接提供了系統超級用戶的訪問(dbOwner 、userAdmin、userAdminAnyDatabase
    • 內部角色:__system

4. 設置超級管理員用戶 root

  • 第一步:先關閉配置文件中的認證設置,來設置好用戶名和密碼,以免無法進入mongodb shell
gedit /etc/mongod.conf

這裏寫圖片描述

  • 第二步:進入mongodb shell,設置admin數據庫下的超級管理員用戶,可以通過認證這個帳號訪問到所有其他的數據庫。
# 開啓mongodb 服務
service mongodb start

# 進入mongo shell
mongo

# 在數據庫admin下,創建超級管理員用戶
use admin
db.createUser({user:"testde", pwd:"test333", roles:["root"]})
# 或者:db.createUser({user:'testde',pwd:'test333', roles:[{role:'root', db:'admin'}]})

# 退出 mongo shell
exit

這裏寫圖片描述

  • 此時,可以看到admin數據庫中,已經有這個用戶的所有信息了。
    這裏寫圖片描述

  • 第三步:修改mongodb配置文件,開啓認證。然後啓動mongodb服務。

gedit /etc/mongod.conf
service mongodb start

這裏寫圖片描述

  • 使用 NoSQLBooster進行連接(阿里雲ECS服務器上):
    這裏寫圖片描述

  • 在python中,可以通過如下方式進行訪問:

import pymongo

# 阿里雲服務器ECS mongodb地址
mongoUrl = "110.29.198.117:27017"
# 數據庫
DATABASE = "testPro"
# 表名
COLLECTION = "testTable"

# 查詢表 testPro.testTable 中的數據信息
if __name__ == "__main__":
    # 這個是ECS服務器上的mongodb,需要開啓認證~
    # 建立和數據庫系統的連接,創建Connection時,指定host及port參數
    mongodbClient = pymongo.MongoClient(mongoUrl)

    # admin 數據庫有帳號,連接 - 認證-切換到其他數據庫
    # 第一種方式,使用admin超級用戶的權限
    # 使用 數據庫admin中的超級用戶進行認證...
    db_auth = mongodbClient.admin
    db_auth.authenticate('testde', '123456')

    # 認證完成之後,直接用這個認證狀態訪問其他普通數據庫
    # 連接數據庫
    db = mongodbClient[DATABASE]
    db_coll = db[COLLECTION]

    srcResult = db_coll.find({}).limit(10)
    for record in srcResult:
        print(f"record = {record}")
  • 但是有一點需要特別注意,從windows端連接到阿里雲ECS服務端時,加入admin超級用戶認證之後,NoSQLBooster中並不會顯示其他的數據庫數據,只是簡單的連接上了,但是並不能顯示所有的數據庫。—— 解決的辦法是,在連接的時候,選擇clone,如下所示,可以對比兩種方式的直接效果:
    這裏寫圖片描述

5. 對普通數據庫設置權限

  • 基本的流程可以參考上面第4節。核心步驟如下:
# 進入 mongo shell
mongo

# 使用超級用戶認證,認證之後,才能操作數據庫
use admin
db.auth("ancode", "123456")

# 切換到 testPro 這種普通的數據庫
use testPro

# 爲數據庫 testPro創建用戶名和密碼
# 角色爲 readWrite 和 dbOwner, 雙重角色
db.createUser({user:"zhangsan",pwd:"123",roles:[{"readWrite",db:"testPro"},
{role:"dbOwner",db:"testPro"}]})

# 退出 mongo shell
exit

# 重啓mongo服務
service mongodb stop
service mongodb start

這裏寫圖片描述

  • 測試結果(windows端使用NoSQLBooster遠程連接):
    這裏寫圖片描述

  • 測試結果(python代碼測試):

import pymongo

# 阿里雲服務器ECS mongodb地址
mongoUrl = "110.29.198.117:27017"

# 數據庫
DATABASE = "testPro"
# 表名
COLLECTION = "testTable"

# 查詢表 testPro.testTable 中的數據信息
if __name__ == "__main__":
    # 這個是ECS服務器上的mongodb,需要開啓認證~
    # 建立和數據庫系統的連接,創建Connection時,指定host及port參數
    mongodbClient = pymongo.MongoClient(mongoUrl)

    # 第二種方式,直接使用對應數據庫的賬戶和密碼,操作對應的數據庫
    # 直接在目標數據庫上進行用戶認證
    db_auth = mongodbClient.testPro
    db_auth.authenticate('zhangsan', '123')

    # 連接數據庫
    db = mongodbClient[DATABASE]
    db_coll = db[COLLECTION]

    srcResult = db_coll.find({}).limit(10)
    for record in srcResult:
        print(f"record = {record}")

# 輸出結果:
record = {'_id': '樣本1', 'count': '10000'}

6. 特別說明:錯誤處理

  • 如下圖所示,當我們在普通的數據庫testPro上,創建一個角色爲 role:”root” 的用戶時,是會創建失敗的! 提示的error是: E QUERY [thread1] Error: couldn’t add user: No role named root@testPro ,但是在第4節的時候,我們確實可以按這種方式在admin數據庫中創建啊,這是怎麼回事呢?
  • 原因在於: root角色只在admin數據庫中可用,普通數據庫中,無法創建這樣的角色! 所以,明確每種角色的功能和使用範圍特別重要,正確的方式參考第5節
    這裏寫圖片描述

7. 參考

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