在 Windows 啟用 MongoDB Replica Set 驗證

之前曾在 為 MongoDB 加上驗證機制 介紹過如何為 MongoDB 建立驗證授權機制,為資料加上基本保護,也在 MongoDB 在 Windows 上的 HA 機制 - Replica sets 介紹 MongoDB 的 HA 機制 - Replica Set 相關安裝及設定。當然想要將 MongoDB 實際使用在 production 環境上,就必需兼顧資安及 HA 機制

加上近日 MongoDB 資安問題又再次佔據新聞版面 (詳細內容可以參考 新一波MongoDB勒贖攻擊來襲,2.6萬台伺服器受害),雖然數量下降,但攻擊強度卻有過之而無不及,所以今天就來紀錄如何啟用 Windows 中 MongoDB Replica Set 的認證與授權

Internal Authentication 使用兩種驗證機制

  1. Keyfiles

    • 使用 SCRAM-SHA-1 建立密碼檔
    • 密碼長度需要介於 6 - 1024 字元
    • 需在各個 replica set or sharded clusters 間使用相同 keyfiles
  2. x.509

    • 使用 TLS/SSL 連線
    • 不使用帳號及密碼驗證

啟用 Replica Set 驗證機制

  1. 先完成 Replica Set 相關設定

    詳細內谷可以參考 MongoDB 在 Windows 上的 HA 機制 - Replica sets

  2. 關閉 MongoDB Replica Set 各個 instance

  3. 建立 keyfile

    • 可以使用任意方式產生 6 至 1024 個字元的隨機字串當做 key
    • 官方範例中使用 openssl 來產生隨機字串(windows 環境中,安裝 git 時會附帶安裝 openssl.exe)

      "C:\Program Files\Git\mingw64\bin\openssl.exe" rand -base64 741 > c:\keyfile
      
  4. keyfile 複製至各個 MongoDB server 上,並指定給各個 MongoDB instance

    • yaml 設定檔中指定

      security:
          keyFile: c:\keyfile
      
    • 透過指令指定

      mongod --keyFile c:\keyfile
      
  5. 重新啟動 MongoDB Replica Set 各個 instance

  6. 設定第一個 user

    • 連線至 primary
    • 切換至 admin database

      use admin
      
    • 建立 user 並指定角色為 userAdminAnyDatabase

      db.createUser({user: "yowkoAdmin",pwd: "pass.123",roles: [ { role: "userAdminAnyDatabase", db: "admin" } ] })
      

      1createadmin

    • 建立第一個 user 的動作需透過指令進行,無法使用 GUI 工具

      2connectfail

    • 第一個 user 建立後即可使用 GUI 工具,指定 authentication 登入

      3connectpass

  7. 連線至 MongoDB

    • 使用指令

      • 語法

        mongo --port {port} -u "{帳號}" -p "{密碼}" --authenticationDatabase "{database}"
        
      • 範例

        mongo --port 27017 -u "yowkoAdmin" -p "pass.123" --authenticationDatabase "admin"
        
    • 使用 GUI

      • 加入連線資訊

        4addconnect1

        5addconnect2

      • 選擇連線類型 –> Replica Set 並設定目標 Server

        6addconnect3

      • 設定連線帳號密碼

        7addconnect4

建立儲存資料的 DB 及對應帳號權限

上述建立的帳號是針對 MongoDB 的管理權限,實際針對不同 DB 需要加入不同使用者及相關權限,才能實際讀寫資料,帳號設定可以參考 為 MongoDB 加上驗證機制

  1. 未建立 db 使用者沒有權限

    8unauth

  2. 建立使用者

    use test
    db.createUser(
    {
        user: "yowko",
        pwd: "pass.123",
        roles: [ { role: "readWrite", db: "test" } ]
    }
    )
    
  3. 使用正確使用者登入

    use test
    db.auth("yowko","pass.123")
    
  4. 新增成功

    db.test.insert({"aaa":123})
    

    9insertok

心得

雖說 MongoDB 的設計概念就是用於信任網路,但為什麼不能預設使用較高層級的安全性保護機制,如果真的用不到再自行移除就好,至少可以避免一些偷懶的 user 所造成的低級資安疑慮

回到 MongoDB Replica Set 的驗證設定,設定與 為 MongoDB 加上驗證機制 相去不遠,概念也相同,再搭配 MongoDB 在 Windows 上的 HA 機制 - Replica sets 設定 Replica Set ,使用上並不複雜,但在釐清設定的過程中,花了不少時間驗證正確的做法,但終於對相關設定有比較明確的認識

參考資訊

  1. 為 MongoDB 加上驗證機制
  2. MongoDB 在 Windows 上的 HA 機制 - Replica sets
  3. 新一波MongoDB勒贖攻擊來襲,2.6萬台伺服器受害
  4. Deploy Replica Set and Configure Authentication and Authorization
  5. Authentication