一篇帶給你 MongoDB 密碼設置
給 MongoDB 設置密碼有兩種情況:
- 給新創建的 MongDB 容器添加密碼。
- 給現有的無密碼的 MongoDB 容器進行密碼設置。
在設置密碼之前,先說說 MongoDB 的版本,之前一直使用 5.0.2 和 5.0.14 版本比較多,然而這兩個版本都是有安全漏洞的,所以大版本如果選擇 5 ,建議選擇 5.0.24 。
新創建容器設置密碼
在 CentOS 服務器中創建目錄 mongodb_pwd ,目錄結構如下:
使用下面命令給 mongo-init.js 文件添加執行權限(非常重要):
chmod +x mongo-init.js
mongo-init.js 文件內容如下:
print('create user start #################################################################');
db = db.getSiblingDB("oec2003_db");
db.createUser({
user: "oec2003",
pwd: "Aa12345678",
roles: [
{
role: "readWrite",
db: "oec2003_db"
}
]
});
db.createCollection('oec2003');
print('create user end #################################################################');
- 加上 print 是為了更好地查看容器日志。
- getSiblingDB() 是 MongoDB shell 提供的一個方法,它允許你切換到另一個數據庫,而不需要重新連接到MongoDB實例。這個方法返回一個新的 DB 對象,意思是數據庫不存在會新創建一個。
- db.createCollection('oec2003'):在用戶創建完成后,創建了一個名為 oec2003 的 collection ,默認創建一個 collection 是為方便測試,因為沒有任何內容的庫,使用 show dbs 或者客戶端連上是看不見新創建的數據庫 oec2003_db 。
docker-compose.yml 文件內容如下:
version: '3.8'
services:
mongodb:
image: mongo:5.0.24
container_name: mongodb
restart: unless-stopped
ports:
- "37017:27017"
environment:
MONGO_INITDB_ROOT_USERNAME: root
MONGO_INITDB_ROOT_PASSWORD: Aa123456
volumes:
- mongo-data:/data/db
- ./config/mongo-init.js:/docker-entrypoint-initdb.d/mongo-init.js:ro
volumes:
mongo-data:
- environment 環境變量設置根賬戶的用戶名和密碼,可以理解為超級管理員賬號。
- volumes 中映射的 mongo-init.js 文件在 MongoDB 容器第一次運行的時候會被執行,是否被執行可以通過執行 docker logs -f mongodb 命令查看日志:
如果沒有出現上圖中的日志,需要檢查下 mongo-init.js 文件是否有執行權限。
進入容器,使用 mongo 進入 MongoDB 的 shell 模式,會發現可以正常進入,但如果執行一些命令會出現沒有權限的提示:
docker exec -it mongodb bash
mongo
> use admin
> db.getUsers()
所以,在加了密碼的 MongoDB 中需要使用下面命令進行登錄:
mongo -u root -p Aa123456 --authenticationDatabase "admin"
- 用戶名和密碼為 docker-compose.yml 文件中 environment 中定義的。
使用用戶名密碼登錄后,在進行用戶的查詢:
docker exec -it mongodb bash
mongo -u root -p Aa123456 --authenticationDatabase "admin"
> use oec2003_db
> db.getUsers()
給現有容器進行密碼設置
原始構建容器的腳本可能是這樣的:
version: '3.8'
services:
mongodb:
image: mongo:5.0.24
container_name: mongodb
restart: unless-stopped
ports:
- "47017:27017"
volumes:
- mongo-data:/data/db
volumes:
mongo-data:
網上看到很多設置密碼的方式,直接進入 MongoDB 的 shell 模式,針對數據庫進行賬號密碼的添加:
use oec2003_db
db.createUser({
user: "oec2003",
pwd: "Aa12345678",
roles: [
{
role: "readWrite",
db: "oec2003_db"
}
]
});
但只是針對庫加了用戶和密碼,會發現,客戶端工具,不使用密碼一樣可以登錄,并且能操作庫里的內容。
這時,修改 docker-compose.yml 文件 ,添加 auth認證:
version: '3.8'
services:
mongodb:
image: mongo:5.0.24
container_name: mongodb
restart: unless-stopped
ports:
- "47017:27017"
volumes:
- mongo-data:/data/db
command: --auth
volumes:
mongo-data:
重新構建容器,這時用客戶端訪問數據庫,或者 collection 就會出現如下提示:
最后
新創建的時候 yml 文件沒有添加 --auth ,也是需要使用用戶名密碼才能使用,但對現有無密碼容器進行修改,必須添加 --auth ,還不知道原因(可能是我操作問題 。
對現有無密碼容器進行修改時,不管是在 environment 中添加根密碼,還是手動進入 shell 中添加,只要沒有添加 --auth ,一樣可以無密碼登錄。
按照上面步驟進行配置,是可以達到密碼保護的作用。