阿里雲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
- 數據庫用戶角色(Database User Roles):read、readWrite
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. 參考
- Nosql Mongodb 基本操作說明: https://blog.csdn.net/yown/article/details/51501273
- MongoDB3.2 用戶權限:https://blog.csdn.net/jianlong727/article/details/53889990
- mongo 系統權限問題:https://blog.csdn.net/wll_1017/article/details/72461573