在資料函式庫安全日益重要的今天,為 MongoDB 副本集組態 TLS/SSL 加密連線是不可或缺的步驟。本提供如何在本地環境佈署一個三節點 MongoDB 副本集,並使用自簽署憑證進行 TLS/SSL 加密設定。首先,需生成根憑證及各節點的憑證請求和私鑰,接著使用根憑證簽署節點憑證請求,最後將私鑰和憑證合併成 PEM 檔案。組態過程中,需注意每個節點的通用名稱必須與其主機名或 IP 位址一致。完成憑證組態後,即可使用 --sslMode requireSSL--sslPEMKeyFile 引數啟動 MongoDB 節點,強制所有連線使用 TLS/SSL 加密。此外,也涵蓋了雙向 SSL 設定,透過 --sslCAFile 引數指定 CA 檔案,確保客戶端也需要提供憑證進行驗證,進一步提升安全性。最後,文章也提供客戶端使用 mongo 命令列工具連線至已啟用 TLS/SSL 的副本集的範例,包含單向和雙向驗證的連線方式。

MongoDB 副本集的 TLS/SSL 組態

如何組態 MongoDB 副本集以支援 TLS/SSL?

本將在本地環境中佈署一個包含 3 個節點的副本集,並使用自簽署憑證。請勿在生產環境中使用自簽署憑證

連線客戶端到副本集

我們將使用 Mongo Shell 連線到此副本集。

注意:TLS/SSL、PKI(公鑰基礎設施)憑證和憑證授權單位的詳細描述超出了本檔案的範圍。

組態副本集以支援 TLS/SSL

建立根憑證

根憑證(又稱 CA 檔案)將用於簽署和識別您的憑證。執行以下命令以生成它:

openssl req -nodes -out ca.pem -new -x509 -keyout ca.key

請小心儲存根憑證及其私鑰,兩者都將用於簽署您的憑證。客戶端也可能使用根憑證。

生成憑證請求和私鑰

在生成憑證簽署請求(CSR)時,請在通用名稱(CN)欄位中輸入節點的確切主機名(或 IP)。其他欄位必須具有完全相同的值。您可能需要修改 /etc/hosts 檔案。

以下命令將生成 CSR 檔案和 RSA 私鑰(4096 位元):

openssl req -nodes -newkey rsa:4096 -sha256 -keyout mongodb_node_1.key -out mongodb_node_1.csr
openssl req -nodes -newkey rsa:4096 -sha256 -keyout mongodb_node_2.key -out mongodb_node_2.csr
openssl req -nodes -newkey rsa:4096 -sha256 -keyout mongodb_node_3.key -out mongodb_node_3.csr

您必須為副本集的每個節點生成一個 CSR。請記住,每個節點的通用名稱不同。不要根據相同的私鑰生成多個 CSR。

現在,您應該擁有 3 個 CSR 和 3 個私鑰:

  • mongodb_node_1.keymongodb_node_2.keymongodb_node_3.key
  • mongodb_node_1.csrmongodb_node_2.csrmongodb_node_3.csr

簽署您的憑證請求

使用之前生成的 CA 檔案(ca.pem)及其私鑰(ca.key)簽署每個憑證請求,方法是執行以下命令:

openssl x509 -req -in mongodb_node_1.csr -CA ca.pem -CAkey ca.key -set_serial 00 -out mongodb_node_1.crt
openssl x509 -req -in mongodb_node_2.csr -CA ca.pem -CAkey ca.key -set_serial 00 -out mongodb_node_2.crt
openssl x509 -req -in mongodb_node_3.csr -CA ca.pem -CAkey ca.key -set_serial 00 -out mongodb_node_3.crt

您必須簽署每個 CSR。

現在,您應該擁有 3 個 CSR、3 個私鑰和 3 個自簽署憑證。只有私鑰和憑證將被 MongoDB 使用:

  • mongodb_node_1.keymongodb_node_2.keymongodb_node_3.key
  • mongodb_node_1.csrmongodb_node_2.csrmongodb_node_3.csr
  • mongodb_node_1.crtmongodb_node_2.crtmongodb_node_3.crt

每個憑證對應一個節點。請仔細記住您為每個 CSR 指定的 CN / 主機名。

將每個節點憑證與其私鑰合併

執行以下命令,將每個節點憑證與其私鑰合併到一個檔案中(MongoDB 的要求):

cat mongodb_node_1.key mongodb_node_1.crt > mongodb_node_1.pem
cat mongodb_node_2.key mongodb_node_2.crt > mongodb_node_2.pem
cat mongodb_node_3.key mongodb_node_3.crt > mongodb_node_3.pem

現在,您應該擁有 3 個 PEM 檔案:

  • mongodb_node_1.pemmongodb_node_2.pemmongodb_node_3.pem

佈署您的副本集

假設您的 PEM 檔案與 data/data1data/data2data/data3 位於當前資料夾中。

執行以下命令以佈署您的 3 節點副本集,分別監聽埠 27017、27018 和 27019:

mongod --dbpath data/data_1 --replSet rs0 --port 27017 --sslMode requireSSL --sslPEMKeyFile mongodb_node_1.pem
mongod --dbpath data/data_2 --replSet rs0 --port 27018 --sslMode requireSSL --sslPEMKeyFile mongodb_node_2.pem
mongod --dbpath data/data_3 --replSet rs0 --port 27019 --sslMode requireSSL --sslPEMKeyFile mongodb_node_3.pem

現在,您已經在本地環境中佈署了一個包含 3 個節點的副本集,並且所有交易都被加密。如果不使用 TLS,則無法連線到此副本集。

為雙向 SSL / 雙向信任佈署您的副本集

要強制客戶端提供客戶端憑證(雙向 SSL),您必須在執行例項時新增 CA 檔案:

mongod --dbpath data/data_1 --replSet rs0 --port 27017 --sslMode requireSSL --sslPEMKeyFile mongodb_node_1.pem --sslCAFile ca.pem
mongod --dbpath data/data_2 --replSet rs0 --port 27018 --sslMode requireSSL --sslPEMKeyFile mongodb_node_2.pem --sslCAFile ca.pem

程式碼解析:

上述命令用於啟動 MongoDB 服務,並指定相關的 SSL/TLS 組態引數。

  • --dbpath:指定資料函式庫檔案的儲存路徑。
  • --replSet:指定副本集的名稱。
  • --port:指定 MongoDB 服務監聽的埠號。
  • --sslMode requireSSL:強制 MongoDB 使用 SSL/TLS 連線。
  • --sslPEMKeyFile:指定包含 SSL/TLS 憑證和私鑰的 PEM 檔案路徑。
  • --sslCAFile:指定用於驗證客戶端憑證的 CA 檔案路徑。

這些組態確保了 MongoDB 服務在啟動時能夠正確載入 SSL/TLS 相關的憑證和私鑰,從而實作加密連線和雙向 SSL/TLS 身份驗證。

MongoDB 安全性與設定

MongoDB 是一種流行的 NoSQL 資料函式庫,其安全性與設定對於確保資料安全和高效運作至關重要。本文將探討 MongoDB 的安全性設定、驗證機制以及如何正確組態 MongoDB。

使用 TLS/SSL 加密 ReplicaSet

在現代資料函式倉管理中,安全性是首要任務。MongoDB 支援使用 TLS/SSL 加密資料傳輸,以保護資料免受竊聽和篡改。要設定一個支援 TLS/SSL 的 ReplicaSet,需要以下步驟:

  1. 生成 SSL/TLS 證書: 首先,需要為每個節點生成一個證書。可以使用 OpenSSL 工具生成私鑰和證書籤署請求(CSR),然後使用自己的憑證授權單位(CA)簽署證書。

  2. 啟動 ReplicaSet 節點: 使用生成的證書啟動每個 ReplicaSet 節點,並指定 --sslMode requireSSL--sslPEMKeyFile--sslCAFile 引數。

範例:

mongod --dbpath data/data_1 --replSet rs0 --port 27017 --sslMode requireSSL --sslPEMKeyFile mongodb_node_1.pem --sslCAFile ca.pem
mongod --dbpath data/data_2 --replSet rs0 --port 27018 --sslMode requireSSL --sslPEMKeyFile mongodb_node_2.pem --sslCAFile ca.pem
mongod --dbpath data/data_3 --replSet rs0 --port 27019 --sslMode requireSSL --sslPEMKeyFile mongodb_node_3.pem --sslCAFile ca.pem

內容解密:

  • mongod 是 MongoDB 伺服器的啟動命令。
  • --dbpath 指定資料儲存路徑。
  • --replSet 指定 ReplicaSet 名稱。
  • --port 指定服務監聽的埠。
  • --sslMode requireSSL 要求所有連線必須使用 SSL/TLS。
  • --sslPEMKeyFile 指定伺服器的 PEM 證書檔案。
  • --sslCAFile 指定 CA 證書檔案,用於驗證客戶端證書。

連線至支援 TLS/SSL 的 ReplicaSet

要連線到已啟用 TLS/SSL 的 ReplicaSet,可以使用 mongo 命令列工具。若 CA 證書已註冊在系統的信任儲存中,可以直接連線,否則需要提供 CA 證書檔案。

範例:

mongo --ssl --host rs0/mongo1:27017,mongo2:27018,mongo3:27019

mongo --ssl --sslCAFile ca.pem --host rs0/mongo1:27017,mongo2:27018,mongo3:27019

內容解密:

  • --ssl 啟用 SSL/TLS 連線。
  • --host 指定 ReplicaSet 的主機和埠。
  • --sslCAFile 提供 CA 證書檔案路徑,用於驗證伺服器證書。

使用客戶端證書進行雙向認證

若 ReplicaSet 需要客戶端提供證書進行雙向認證,則需要生成客戶端證書並簽署。客戶端證書的 Common Name 欄位應包含所有 ReplicaSet 節點的主機名,以逗號分隔,或使用 SubjectAltName 擴充功能。

範例:

openssl req -nodes -newkey rsa:4096 -sha256 -keyout mongodb_client.key -out mongodb_client.csr -config <(
cat <<-EOF
[req]
default_bits = 4096
prompt = no
default_md = sha256
req_extensions = req_ext
distinguished_name = dn
[ dn ]
CN = .
[ req_ext ]
subjectAltName = @alt_names
[ alt_names ]
DNS.1 = mongo1
DNS.2 = mongo2
DNS.3 = mongo3
EOF
)
openssl x509 -req -in mongodb_client.csr -CA ca.pem -CAkey ca.key -set_serial 00 -out mongodb_client.crt
cat mongodb_client.key mongodb_client.crt > mongodb_client.pem

內容解密:

  • openssl req 生成客戶端私鑰和 CSR。
  • -config 指定 OpenSSL 組態,使用 SubjectAltName 擴充功能列出所有主機名。
  • openssl x509 -req 簽署客戶端 CSR,生成客戶端證書。
  • cat 合併客戶端私鑰和證書成一個 PEM 檔案。

連線時,需提供客戶端證書:

mongo --ssl --sslCAFile ca.pem --host rs0/mongo1:27017,mongo2:27018,mongo3:27019 --sslPEMKeyFile mongodb_client.pem

MongoDB 認證機制

MongoDB 支援多種認證機制,包括 SCRAM-SHA-1、X.509 證書認證、LDAP Proxy 認證和 Kerberos 認證等。選擇適當的認證機制可以增強資料函式庫的安全性。

設定檔與引數

MongoDB 的設定可以透過設定檔或命令列引數進行組態。常見的設定包括系統日誌、網路選項、SSL/TLS 設定等。

範例設定檔內容:

systemLog:
  verbosity: 0
  quiet: false

net:
  port: 27017
  bindIp: 0.0.0.0
  ssl:
    mode: requireSSL
    PEMKeyFile: /path/to/mongodb.pem
    CAFile: /path/to/ca.pem

內容解密:

  • systemLog.verbosity 設定日誌詳細程度。
  • net.portnet.bindIp 設定服務監聽的埠和 IP。
  • net.ssl.mode 設定 SSL/TLS 模式,requireSSL 表示要求所有連線使用 SSL/TLS。
  • net.ssl.PEMKeyFilenet.ssl.CAFile 分別指定伺服器 PEM 證書檔案和 CA 證書檔案。

MongoDB 資料備份與還原技術解析

MongoDB 作為一個流行的 NoSQL 資料函式庫,其資料備份與還原功能對於資料保護至關重要。本文將探討 MongoDB 的備份與還原技術,包括使用 mongodumpmongorestore 工具進行資料備份和還原,以及使用 mongoimport 匯入 JSON 和 CSV 格式的資料。

使用 mongodump 進行資料備份

mongodump 是 MongoDB 提供的用於備份資料的工具。它能夠將資料函式庫中的資料匯出為 BSON 格式的檔案,並且可以選擇是否壓縮。以下是一個基本的 mongodump 命令範例:

mongodump --db mydb --gzip --out "mydb.dump.$(date +%F_%R)"

內容解密:

  • --db mydb 指定要備份的資料函式庫名稱為 mydb
  • --gzip 表示將備份資料壓縮,以節省儲存空間。
  • --out "mydb.dump.$(date +%F_%R)" 指定備份輸出的目錄名稱,並包含時間戳記,以便於管理和區分不同的備份。

使用 mongorestore 進行資料還原

mongorestore 是與 mongodump 相對應的還原工具,能夠將備份的 BSON 資料還原到 MongoDB 資料函式庫中。以下是一個基本的 mongorestore 命令範例:

mongorestore --db mydb mydb.dump.2016-08-27_12:44/mydb --drop --gzip

內容解密:

  • --db mydb 指定要還原到的資料函式庫名稱為 mydb
  • mydb.dump.2016-08-27_12:44/mydb 是備份資料的路徑。
  • --drop 表示在還原之前先刪除現有的資料函式庫,以避免資料衝突。
  • --gzip 表示備份資料是經過壓縮的,需要解壓縮後再還原。

使用 mongoimport 匯入 JSON 資料

mongoimport 是用於將 JSON 或 CSV 格式的資料匯入到 MongoDB 資料函式庫中的工具。以下是一個匯入 JSON 資料的範例:

mongoimport --db test --collection "zips" --drop --type json --host "localhost:47019" --file "c:\Users\yc03ak1\Desktop\zips.json"

內容解密:

  • --db test 指定目標資料函式庫名稱為 test
  • --collection "zips" 指定目標集合名稱為 zips
  • --drop 表示在匯入之前先刪除現有的集合,以避免資料重複。
  • --type json 表示要匯入的檔案格式是 JSON。
  • --host "localhost:47019" 指定 MongoDB 的連線地址和埠號。
  • --file "c:\Users\yc03ak1\Desktop\zips.json" 指定要匯入的 JSON 檔案路徑。

使用 mongoimport 匯入 CSV 資料

匯入 CSV 資料與匯入 JSON 資料類別似,但需要額外指定欄位名稱或使用 --headerline 引數來指定 CSV 檔案的第一行作為欄位名稱。以下是一個匯入 CSV 資料的範例:

mongoimport --db test --collection "sample" --drop --type csv --headerline --host "localhost:47019" --file "c:\Users\yc03ak1\Desktop\testing.csv"

內容解密:

  • --type csv 表示要匯入的檔案格式是 CSV。
  • --headerline 表示使用 CSV 檔案的第一行作為欄位名稱。

MongoDB 版本升級

升級 MongoDB 版本是維護資料函式庫安全性和提升效能的重要步驟。以下是在 Ubuntu 16.04 上使用 apt 將 MongoDB 從 3.2 升級到 3.4 的範例步驟:

  1. 停止 MongoDB 服務sudo service mongod stop
  2. 匯入公鑰sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 0C49F3730359A14518585931BC711F9BA15703C6
  3. 新增 MongoDB 3.4 的來源列表echo "deb [ arch=amd64,arm64 ] http://repo.mongodb.org/apt/ubuntu xenial/mongodb-org/3.4 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-3.4.list
  4. 更新套件列表sudo apt-get update
  5. 升級 MongoDBsudo apt-get upgrade
  6. 啟動 MongoDB 服務sudo service mongod start

升級完成後,務必檢查 MongoDB 的版本以確認升級成功。