MongoDB部署副本集

本頁包含內容mongodb

  • 概覽
  • 系統需求
  • 部署一個基於Key文件實現訪問控制的副本集
  • x.509 內部身份驗證

概述

首發於sf.gg. 原文翻譯自MongoDB官方文檔。我一直認爲,與其從網上隨便扒一些教程,不如認認真真閱讀一遍官方的文檔。shell

在副本集上實現訪問控制依賴於如下配置:數據庫

在本教程中,副本集中的成員之間使用相同的內部身份驗證機制和設置。數組

強制身份驗證就是強制用戶訪問控制,如需使用客戶端鏈接到此副本集須要使用一個帳戶,更多信息,參見訪問控制安全

Cloud Manager 與 Ops Manager

若是你正在或者計劃使用Cloud Manager 或者 Ops Manager,考慮使用內置的功能來部署一個副本集與強制執行的訪問控制,bash

參閱 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企業版提供) 有關建立用戶特定的身份驗證機制的詳細信息,請參閱特定的身份驗證機制頁。ui

參閱配置基於角色的訪問控制獲取對於建立和管理用戶的最佳實踐。

部署一個新的、基於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()命令初始化具備三個成員的副本集實例的示例,請留意,副本集名稱須要帶引號:
rs.initiate(
  {
    _id : <replicaSetName>,
    members: [
      { _id : 0, host : "mongo1.example.net:27017" },
      { _id : 1, host : "mongo2.example.net:27017" },
      { _id : 2, host : "mongo3.example.net:27017" }
    ]
  }
 )
複製代碼

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內部驗證,,請參閱此處

相關文章
相關標籤/搜索