MongoDB部署副本集
本頁包含內容
- 概覽
- 系統需求
- 部署一個基于Key文件實現訪問控制的副本集
- x.509 內部身份驗證
概述
首發于sf.gg. 原文翻譯自MongoDB官方文檔。我一直認為,與其從網上隨便扒一些教程,不如認認真真閱讀一遍官方的文檔。
在副本集上實現訪問控制依賴于以下配置:
- 副本集成員之間使用內部身份驗證并且
- 副本集客戶端與副本集之間使用基于角色的訪問控制
在本教程中,副本集中的成員之間使用相同的內部身份驗證機制和設置。
強制身份驗證就是強制用戶訪問控制,如需使用客戶端連接到此副本集需要使用一個賬戶,更多信息,參見訪問控制
Cloud Manager 與 Ops Manager
如果你正在或者計劃使用Cloud Manager 或者 Ops Manager,考慮使用內置的功能來部署一個副本集與強制執行的訪問控制,
參閱 Cloud Manager manual 或者 Ops Manager manual中的 部署副本集 參閱 Cloud Manager manual 或者Ops Manager manual 中關于MongoDB部署中的訪問控制。
系統需求
操作系統
本教程主要使用 mongod 進程,Windows用戶應該使用 mongod.exe代替。
密鑰文件安全機制
密鑰文件是最低限度的安全機制,最適合用于測試或開發環境。對于生產環境,我們建議使用 x.509 證書。
訪問控制
本教程僅在 admin 數據庫創建最小數目的管理用戶,對于用戶身份驗證,本教程使用了默認的SCRAM-SHA-1用戶身份驗證機制。挑戰-相應安全機制最適用于開發或者測試環境,對于生產環境,我們推薦使用x.509 證書或者LDAP代理權威認證(僅MongoDB企業版提供)或者 Kerberos Authentication(僅MongoDB企業版提供) 有關創建用戶特定的身份驗證機制的詳細信息,請參閱特定的身份驗證機制頁。
參閱配置基于角色的訪問控制獲取對于創建和管理用戶的最佳實踐。
部署一個新的、基于Keyfile實現訪問控制的副本集
1. 創建一個keyfile
keyfile的內容被副本集中的成員用作共享密碼,同一個副本集中的成員使用的keyfile的內容必須相同。 你可以使用任意方法生成keyfile,keyfile內容的長度在6到1024個字符之間。
注意:在UNIX平臺上,keyfile的權限應該設置為組與其他沒有任何權限,在Windows系統上對keyfile的權限沒有檢查。
下述操作展示了如何使用 openssl獲取一個復雜的、1024位的偽隨機字符串作為keyfile的內容。然后使用chmod為keyfile更改權限為只有文件擁有者具有讀權限。
openssl rand -base64 756 > <path-to-keyfile> chmod 400 <path-to-keyfile> 復制代碼參閱 keyfile 獲取更多使用keyfile的需求和細節。
2.把keyfile復制到副本集中的每一個成員當中。
復制keyfile到副本集中的每一臺成員服務器上,使用相同的存放路徑。
重要:不要使用網絡共享地址或者可移動存儲的地址比如USB驅動器來存放這個keyfile。
確保運行中的mongod可以訪問到這個地址。
3.為副本集中的每個成員啟用訪問控制。
帶keyfile參數啟動mongod可以同時強制開啟內部身份驗證和基于角色的訪問控制。
對于副本集內的每一個mongod來講,可以選擇使用配置文件或者命令行啟動。
重要:一個副本集初始化完成后你無法再更改副本集的名字,請在這個階段選擇一個合適的副本集的名字以避免后續的麻煩。
配置文件 如果選擇使用配置文件,就需要配置 security.keyFile來指定keyfile的路徑,并設置replication.replSetName 選項來指定副本集的名字:
security:keyFile: <path-to-keyfile> replication:replSetName: <replicaSetName> 復制代碼使用配置文件啟動mongod:
mongod --config <path-to-config-file> 復制代碼關于配置文件的更多信息,參見配置文件選項
使用命令行 如果使用命令行,啟動mongod的時候加上 --keyFile 和--replSet參數:
mongod --keyFile <path-to-keyfile> --replSet <replicaSetName> 要獲取啟動參數的更多信息,參見 mongod頁面,包含了適合你部署的附加選項。
4.通過本地接口連接到副本集中的成員
通過本地接口連接到 mongoshell來配置mongod實例,你必須在運行mongod實例的機器上運行mongoshell. 本地接口僅在副本集還沒有創建用戶的時候可用,當第一個用戶被創建,則本地接口會被關閉。
5.初始化副本集
可以使用rs.initiate()方法來初始化一個副本集,也可以使用副本集配置文檔來初始化一個副本集,副本集配置文檔包含:
- _id字段,_id字段必須與mongod的 **-- --replSet **一致。
- members 字段,members字段是一個數組,記錄了副本集中的每一個成員。 查看副本集配置獲取更多關于副本集配置文檔的信息。 下面是一個使用rs.initiate()命令初始化具有三個成員的副本集實例的示例,請留意,副本集名稱需要帶引號:
re.initiate()方法會觸發一個選舉過程推舉出一個成員為primary. 進行下一步之前,連接到primary,使用rs.status()方法查找primary。
6.創建用戶管理員
重要:當你創建了第一個用戶之后, localhost exception將不再可用。第一個用戶必須有權限創建其他用戶,比如userAdminAnyDatabase,這確保了在localhost exception關閉以后你能在副本集內增加更多用戶。 至少需要一個用戶具有權限創建其他用戶,否則一旦localhostexception關閉你可能無法對用戶新增或者修改權限,并因此無法進行必要的操作。
使用 db.createUser()方法增加一個用戶。該用戶在admin數據庫上至少是userAdminAnyDatabase角色。 你必須連接到 primary 主機上創建用戶。 以下示例展示了如何在admin數據庫上創建一個角色為userAdminAnyDatabase的用戶fred.
重要:密碼應該是隨機設定的,具有一定長度和復雜度,能夠確保系統安全,防止或延緩惡意訪問。
admin = db.getSiblingDB("admin") admin.createUser( {user: "fred",pwd: "changeme1",roles: [ { role: "userAdminAnyDatabase", db: "admin" } ] } ) 復制代碼參閱 數據庫用戶角色一章獲取內置角色的完整列表和相關的數據庫管理操作。
7.管理員身份驗證
管理員身份需要到admin上驗證 在mongo shell 中使用db.auth()方法進行驗證。以下示例展示了如何驗證fred為管理員:
db.getSiblingDB("admin").auth("fred", "changeme1" )
或者連接到副本集中primary成員,重新打開一個mongo shell并使用 -u <username>, -p <password> 和--authenticationDatabase參數:
mongo -u "fred" -p "changeme1" --authenticationDatabase "admin"
8.創建集群管理員( clusterAdmin)
clusterAdmin角色被授權為可以訪問集群操作,比如創建一個副本集。 創建一個集群管理員用戶需要在admin數據庫內指定一個用戶為 clusterAdmin角色:
db.getSiblingDB("admin").createUser( {"user" : "ravi","pwd" : "changeme2",roles: [ { "role" : "clusterAdmin", "db" : "admin" } ] } ) 復制代碼9.創建額外的用戶(可選)
創建用戶來允許客戶端(使用這些用戶)連接到副本集實例,參閱數據庫用戶與角色一章,了解如何基于基本內置角色來創建具備只讀權限和讀寫權限的用戶。
你可能還需要額外的管理用戶,請參閱用戶一章獲取更多信息。
X.509內部驗證
更多關于X.509內部驗證的信息,參閱 使用X.509證書驗證成員資格。 將keyfile內部驗證升級到使用X.509內部驗證,,請參閱此處。
總結
以上是生活随笔為你收集整理的MongoDB部署副本集的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: NSDictionary
- 下一篇: python爬虫知识点总结(十三)使用代