MongoDB部署副本集

古大官人發表於2018-08-03

本頁包含內容

  • 概覽
  • 系統需求
  • 部署一個基於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()命令初始化具有三個成員的副本集例項的示例,請留意,副本集名稱需要帶引號:
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內部驗證,,請參閱此處

相關文章