Docker部署的MongoDB的用戶鑒權問題
寫這篇博客的起因是在阿里雲上用Docker部署了一個MongoDB數據庫,用來存畢設網站用到的數據庫。因為數據量比較小,並且沒有隱私數據,所以並沒有設置密碼。沒想到被黑了,有人把所有的數據Copy走后把所有庫都刪除了,並且留下了一封勒索0.0015BTC的文檔。
為了防止此類事件再次發生,我們要對MongoDB進行加鎖,換端口等一系列措施。這里記錄了我是怎么做的。
MongoDB鏡像
采用最新的MongoDB:latest鏡像。
換端口
不把MongoDB服務映射到默認的27017端口上,因為這樣很容易被黑客掃描的時候檢測出來。直接在部署Docker的時候把容器內部27017映射到其他關口上。
最后在防火牆平台上開放這條映射規則,關閉原來的27017端口映射規則。
啟動Docker
建立Docker時用如下命令:
sudo docker run -it mongoDB:latest --name="MongoDB" mongod --auth
最后加--auth這個參數。這樣登錄時需要用戶名和密碼。
設置admin庫
在docker中運行mongo,接入數據庫,然后use admin,進入admin庫,為admin庫增加一個admin用戶:
db.createUser({user: 'admin', pwd: 'password', roles: ['userAdminAnyDatabase']})
然后可以使用數據庫的圖形界面,用admin賬號登錄數據庫,然后創建角色並賦予權限。
角色與權限
可以為每一個數據庫都設置角色和權限。
-
Read:允許用戶讀取指定數據庫(不可進行任何更改,只能查看)
-
readWrite:允許用戶讀寫指定數據庫(任何操作,包括刪有權限db中的col權限)
-
dbAdmin:允許用戶在指定數據庫中執行管理函數,如索引創建、刪除,查看統計或訪問system.profile
-
userAdmin:允許用戶向system.users集合寫入,可以找指定數據庫里創建、刪除和管理用戶
-
clusterAdmin:只在admin數據庫中可用,賦予用戶所有分片和復制集相關函數的管理權限。
-
readAnyDatabase:只在admin數據庫中可用,賦予用戶所有數據庫的讀權限
-
readWriteAnyDatabase:只在admin數據庫中可用,賦予用戶所有數據庫的讀寫權限
-
userAdminAnyDatabase:只在admin數據庫中可用,賦予用戶所有數據庫的userAdmin權限
-
dbAdminAnyDatabase:只在admin數據庫中可用,賦予用戶所有數據庫的dbAdmin權限。
-
root:只在admin數據庫中可用。超級賬號,超級權限