全部產品
Search
文件中心

Cloud Firewall:MongoDB資料庫未授權訪問漏洞防禦最佳實務

更新時間:Jun 30, 2024

MongoDB資料庫未授權訪問漏洞可以導致資料庫資料泄露或被刪除勒索。

背景資訊

為保證您的業務和應用的安全,Cloud Firewall提供以下漏洞修複指導方案。

MongoDB服務安裝完成後,會預設存在一個Admin資料庫,該Admin資料庫內容為空白,並且沒有記錄任何與許可權相關的資訊。

MongoDB預設設定為無許可權訪問限制,也就是說開啟MongoDB服務時如果不添加任何參數,預設是不需要許可權驗證的。因此,使用者無需密碼即可通過預設連接埠對資料庫操作(增、刪、改、查等高危操作),並可遠端存取資料庫。

因此,加固的核心操作是實現在admin.system.users中添加使用者,這樣MongoDB的登入認證、授權服務才會生效。

修複方案

  1. 配置Cloud Firewall存取控制策略。

    1. 限定MongoDB服務僅對內網伺服器提供服務。

      登入Cloud Firewall控制台在左側導覽列,選擇流量分析 > 公網暴露,在暴露明細 > 開放應用頁簽,查看公網中MongoDB服務所屬的IP地址。如果該服務僅對內網伺服器提供服務,建議禁止將MongoDB服務開放到互連網上。

      執行以下命令啟動IP地址綁定、限定該MongoDB服務僅對內網伺服器提供服務(本樣本中MongoDB資料庫執行個體將只監聽192.168.XX.XX內網的請求)。

      mongod --bind_ip 192.168.XX.XX
    2. 配置MongoDBCloud Firewall存取控制策略只對可信源允許存取。

    1. 配置MongoDBCloud Firewall存取控制策略只對可信源允許存取。

      登入Cloud Firewall控制台在左側導覽列,選擇存取控制 > 互連網邊界,然後單擊入向頁簽,配置存取控制策略,僅允許與MongoDB資料庫依賴的伺服器訪問該MongoDB服務。

      1. 入向頁簽,單擊地址簿管理,在自訂地址簿 > IPv4地址簿頁簽將MongoDB所有可信源加入地址簿。

      2. 入向頁簽,單擊建立策略,在建立入向策略 > 自訂建立面板對MongoDB可信源進行允許存取。 主要參數配置如下:

        • 訪問源:選擇已配置好的MongoDB所有可信源地址簿。

        • 目的:為MongoDB可信源地址。

        • 協議類型:選擇TCP協議,表示互連網訪問流量。

        • 連接埠: 設定為0/0,表示可信源的所有連接埠地址。

    2. 拒絕所有其他非可信源訪問MongoDB服務。

      在左側導覽列,選擇 存取控制 > 互連網邊界,然後單擊入向頁簽,配置存取控制策略,拒絕其他非可信源訪問MongoDB服務。

      入向頁簽,單擊建立策略,在建立入向策略 > 自訂建立面板對MongoDB非可信源進行拒絕。 主要參數配置如下:

      • 訪問源:設定為0.0.0.0/0,表示所有訪問源。

      • 目的:為MongoDB服務所屬的公網IP地址。

      • 協議類型:選擇TCP協議,表示互連網訪問流量。

      • 連接埠: 設定為0/0,表示非可信源的所有連接埠地址。

  2. 開啟基於許可權角色的登入認證功能。

    1. 執行以下命令,在未開啟認證的環境下登入到資料庫。

      ./mongo 127.0.0.1:27028 (此處修改了預設連接埠)
    2. 執行以下命令切換到admin資料庫。

      use admin
      switched to db admin
      說明

      只有切換到admin資料庫後添加的帳號才是管理員帳號。

    3. 執行以下命令建立為admin資料庫建立管理使用者。 本樣本中使用者名稱為su****,密碼supWDx****

      說明

      MongoDB從V3版本開始取消使用addUser方法、採用db.createUser命令建立使用者。

      db.addUser("su****", "supWDx****") 或
      { "n" : 0, "connectionId" : 4, "err" : null, "ok" : 1 }
      db.createUser({user:"****",pwd:"***********",roles:["root"]})
      {
      "user" : "****",
      "readOnly" : false,
      "pwd" : "**************","_id"
      ObjectId("4f2bc0d357a309043c6947a4")
      }
      #管理員帳號在system.users中。
      db.getCollectionNames()
      [ "system.indexes", "system.users", "system.version" ]

      建立的使用者帳號儲存在system.users中。

      說明

      管理員帳號不要設定為常見帳號;密碼需要滿足一定的複雜度:長度至少八位以上並包括大小寫字母、數字、特殊字元混合體,不要使用生日、姓名、身份證編號等常見密碼。

    4. 驗證之前添加的使用者是否建立成功。

      執行命令後,返回1,表示使用者已建立成功。

      db.auth("su****","supWDx****")
      1
                                      
    5. 結束Mongodb進程並重啟Mongodb服務。

      db.auth("su****","supWDx****")
      exit
      bye
    6. 執行以下命令,啟動使用者權限認證。

      開啟使用者權限認證後,未登入的用戶端沒有許可權做任何操作。

      mongod --dbpath=/path/mongodb --bind_ip=10.0.0.1 --port=27028 --fork=true logpath=/path/mongod.log --auth&
    說明
    • admin.system.users中將會儲存比在其他資料庫中設定的使用者權限更大的使用者資訊,擁有超級許可權,也就是說在admin中建立的使用者可以對MongoDB中的其他資料庫資料進行操作。

    • MongoDB系統中,資料庫是由超級使用者來建立的,一個資料庫可以包含多個使用者,一個使用者只能在一個資料庫下,不同資料庫中的使用者可以同名。

    • 特定資料庫(例如:DB1)的使用者User1不能夠訪問其他資料庫DB2,但是可以訪問本資料庫下其他使用者建立的資料。

    • 不同資料庫中同名的使用者不能夠登入其他資料庫,例如:DB1、DB2都有user1,以user1登入DB1後,不能登入到DB2進行資料庫操作。

    • 在admin資料庫建立的使用者具有超級許可權,可以對MongoDB系統內的任何資料庫的資料對象進行操作。

    • 使用db.auth()可以對資料庫中的使用者進行驗證,如果驗證成功則返回1,否則返回0。db.auth()只能針對登入使用者所屬的資料庫的使用者資訊進行驗證,不能驗證其他資料庫的使用者資訊。

檢測是否存在入侵風險

如果您是MongoDB資料庫管理員,可使用以下方式確認是否有進一步的入侵行為:

  • 查看MongoDB的日誌是否完整,並確認執行刪除資料庫的源IP地址和時間、行為。

  • 使用db.system.users.find()命令檢查MongoDB賬戶是否存在未添加密碼的賬戶。

  • 使用db.fs.files.find()命令檢查GridFS是否有其他使用者儲存了任何檔案。

  • 使用show log global命令查看記錄檔,確認是否有其他使用者訪問了MongoDB。