MongoDB資料庫未授權訪問漏洞可以導致資料庫資料泄露或被刪除勒索。
背景資訊
為保證您的業務和應用的安全,Cloud Firewall提供以下漏洞修複指導方案。
MongoDB服務安裝完成後,會預設存在一個Admin資料庫,該Admin資料庫內容為空白,並且沒有記錄任何與許可權相關的資訊。
MongoDB預設設定為無許可權訪問限制,也就是說開啟MongoDB服務時如果不添加任何參數,預設是不需要許可權驗證的。因此,使用者無需密碼即可通過預設連接埠對資料庫操作(增、刪、改、查等高危操作),並可遠端存取資料庫。
因此,加固的核心操作是實現在admin.system.users中添加使用者,這樣MongoDB的登入認證、授權服務才會生效。
修複方案
配置Cloud Firewall存取控制策略。
限定MongoDB服務僅對內網伺服器提供服務。
登入Cloud Firewall控制台。在左側導覽列,選擇 ,在 頁簽,查看公網中MongoDB服務所屬的IP地址。如果該服務僅對內網伺服器提供服務,建議禁止將MongoDB服務開放到互連網上。
配置MongoDBCloud Firewall存取控制策略只對可信源允許存取。
配置MongoDBCloud Firewall存取控制策略只對可信源允許存取。
登入Cloud Firewall控制台。在左側導覽列,選擇 ,然後單擊入向頁簽,配置存取控制策略,僅允許與MongoDB資料庫依賴的伺服器訪問該MongoDB服務。
在入向頁簽,單擊地址簿管理,在
頁簽將MongoDB所有可信源加入地址簿。在入向頁簽,單擊建立策略,在
面板對MongoDB可信源進行允許存取。 主要參數配置如下:訪問源:選擇已配置好的MongoDB所有可信源地址簿。
目的:為MongoDB可信源地址。
協議類型:選擇TCP協議,表示互連網訪問流量。
連接埠: 設定為0/0,表示可信源的所有連接埠地址。
拒絕所有其他非可信源訪問MongoDB服務。
在左側導覽列,選擇
,然後單擊入向頁簽,配置存取控制策略,拒絕其他非可信源訪問MongoDB服務。在入向頁簽,單擊建立策略,在
面板對MongoDB非可信源進行拒絕。 主要參數配置如下:訪問源:設定為0.0.0.0/0,表示所有訪問源。
目的:為MongoDB服務所屬的公網IP地址。
協議類型:選擇TCP協議,表示互連網訪問流量。
連接埠: 設定為0/0,表示非可信源的所有連接埠地址。
開啟基於許可權角色的登入認證功能。
執行以下命令,在未開啟認證的環境下登入到資料庫。
./mongo 127.0.0.1:27028 (此處修改了預設連接埠)
執行以下命令切換到admin資料庫。
use admin switched to db admin
說明只有切換到admin資料庫後添加的帳號才是管理員帳號。
執行以下命令建立為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中。
說明管理員帳號不要設定為常見帳號;密碼需要滿足一定的複雜度:長度至少八位以上並包括大小寫字母、數字、特殊字元混合體,不要使用生日、姓名、身份證編號等常見密碼。
驗證之前添加的使用者是否建立成功。
執行命令後,返回1,表示使用者已建立成功。
db.auth("su****","supWDx****") 1
結束Mongodb進程並重啟Mongodb服務。
db.auth("su****","supWDx****") exit bye
執行以下命令,啟動使用者權限認證。
開啟使用者權限認證後,未登入的用戶端沒有許可權做任何操作。
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。