官方手冊中啓動 MongoDB 服務時沒有任何參數,一旦客戶端連接後可以對數據庫任意操作,而且可以遠程訪問數據庫,所以推薦開發階段可以不設置任何參數,但對於生產環境還 是要仔細考慮一下安全方面的因素,而提高 MongoDB 數據庫安全有幾個方面:
1、綁定 IP 內網地址訪問 MongoDB 服務
2、設置監聽端口
3、使用用戶名和口令登錄
1、綁定 IP 內網地址訪問MongoDB 服務
MongoDB 可以限制只允許某一特定 IP 來訪問,只要在啓動時加一個參數 bind_ip 即可,如 下:
服務端限制只有 192.168.1.103 這個 IP 可以訪問 MongoDB 服務 :
mongod.exe --bind_ip 192.168.1.103
客戶端訪問時需要明確指定服務端的 IP,否則會報錯:
mongo.exe 192.168.1.102
2、設置監聽端口
官方默認的監聽端口是 27017,爲了安全起見,一般都會修改這個監聽端口,避免惡意的連接嘗試,具體如下: 將服務端監聽端口修改爲 28018
mongo.exe 192.168.1.102:28018
3、使用用戶名和口令登錄
MongoDB默認的啓動是不驗證用戶名和密碼的,啓動MongoDB後,可以直接用MongoDB連接,對所有的庫具有 root 權限。所以啓動的時候指定參數,可以阻止客戶端的訪問和連接。
mongod.exe --auth --dbpath "E:Program Files\MongoDB\data"
很奇怪,爲什麼我們啓用了登錄驗證模塊,但我們登錄時沒有指定用戶,爲什麼還可以登錄 呢?在最初始的時候 MongoDB 都默認有一個 admin 數據庫(默認是空的), 而 admin.system.users 中將會保存比在其它數據庫中設置的用戶權限更大的用戶信息。 注意:當 admin.system.users 中沒有添加任何用戶時,即使 MongoDB 啓動時添加了 –auth 參數,如果在除 admin 數據庫中添加了用戶,此時不進行任何認證依然可以使用任何操作, 直到你在 admin.system.users 中添加了一個用戶。
1、建立root用戶
db.createUser({user:'root',pwd:'0316',roles:['userAdminAnyDatabase']})
user文檔字段介紹:
user字段,爲新用戶的名字;
pwd字段,用戶的密碼;
cusomData字段,爲任意內容,例如可以爲用戶全名介紹;
roles字段,指定用戶的角色,可以用一個空數組給新用戶設定空角色;
在roles字段,可以指定內置角色和用戶定義的角色。
Built-In Roles(內置角色):
1. 數據庫用戶角色:read、readWrite;
2. 數據庫管理角色:dbAdmin、dbOwner、userAdmin;
3. 集羣管理角色:clusterAdmin、clusterManager、clusterMonitor、hostManager;
4. 備份恢復角色:backup、restore;
5. 所有數據庫角色:readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase
6. 超級用戶角色:root
// 這裏還有幾個角色間接或直接提供了系統超級用戶的訪問(dbOwner 、userAdmin、userAdminAnyDatabase)
7. 內部角色:__system
PS:關於每個角色所擁有的操作權限可以點擊上面的內置角色鏈接查看詳情。
exit,退出後,再進來:
mongo.exe 不登錄
已經沒有權限操作了。
切換到超級用戶(再admin庫中創建的用戶是超級用戶可以訪問所有數據庫)
use admin
db.auth('root','0316)