一篇帶給你 MongoDB 密碼設(shè)置
給 MongoDB 設(shè)置密碼有兩種情況:
- 給新創(chuàng)建的 MongDB 容器添加密碼。
- 給現(xiàn)有的無(wú)密碼的 MongoDB 容器進(jìn)行密碼設(shè)置。
在設(shè)置密碼之前,先說(shuō)說(shuō) MongoDB 的版本,之前一直使用 5.0.2 和 5.0.14 版本比較多,然而這兩個(gè)版本都是有安全漏洞的,所以大版本如果選擇 5 ,建議選擇 5.0.24 。
新創(chuàng)建容器設(shè)置密碼
在 CentOS 服務(wù)器中創(chuàng)建目錄 mongodb_pwd ,目錄結(jié)構(gòu)如下:
使用下面命令給 mongo-init.js 文件添加執(zhí)行權(quán)限(非常重要):
chmod +x mongo-init.js
mongo-init.js 文件內(nèi)容如下:
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 提供的一個(gè)方法,它允許你切換到另一個(gè)數(shù)據(jù)庫(kù),而不需要重新連接到MongoDB實(shí)例。這個(gè)方法返回一個(gè)新的 DB 對(duì)象,意思是數(shù)據(jù)庫(kù)不存在會(huì)新創(chuàng)建一個(gè)。
- db.createCollection('oec2003'):在用戶創(chuàng)建完成后,創(chuàng)建了一個(gè)名為 oec2003 的 collection ,默認(rèn)創(chuàng)建一個(gè) collection 是為方便測(cè)試,因?yàn)闆](méi)有任何內(nèi)容的庫(kù),使用 show dbs 或者客戶端連上是看不見(jiàn)新創(chuàng)建的數(shù)據(jù)庫(kù) oec2003_db 。
docker-compose.yml 文件內(nèi)容如下:
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 環(huán)境變量設(shè)置根賬戶的用戶名和密碼,可以理解為超級(jí)管理員賬號(hào)。
- volumes 中映射的 mongo-init.js 文件在 MongoDB 容器第一次運(yùn)行的時(shí)候會(huì)被執(zhí)行,是否被執(zhí)行可以通過(guò)執(zhí)行 docker logs -f mongodb 命令查看日志:
如果沒(méi)有出現(xiàn)上圖中的日志,需要檢查下 mongo-init.js 文件是否有執(zhí)行權(quán)限。
進(jìn)入容器,使用 mongo 進(jìn)入 MongoDB 的 shell 模式,會(huì)發(fā)現(xiàn)可以正常進(jìn)入,但如果執(zhí)行一些命令會(huì)出現(xiàn)沒(méi)有權(quán)限的提示:
docker exec -it mongodb bash
mongo
> use admin
> db.getUsers()
所以,在加了密碼的 MongoDB 中需要使用下面命令進(jìn)行登錄:
mongo -u root -p Aa123456 --authenticationDatabase "admin"
- 用戶名和密碼為 docker-compose.yml 文件中 environment 中定義的。
使用用戶名密碼登錄后,在進(jìn)行用戶的查詢:
docker exec -it mongodb bash
mongo -u root -p Aa123456 --authenticationDatabase "admin"
> use oec2003_db
> db.getUsers()
給現(xiàn)有容器進(jìn)行密碼設(shè)置
原始構(gòu)建容器的腳本可能是這樣的:
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:
網(wǎng)上看到很多設(shè)置密碼的方式,直接進(jìn)入 MongoDB 的 shell 模式,針對(duì)數(shù)據(jù)庫(kù)進(jìn)行賬號(hào)密碼的添加:
use oec2003_db
db.createUser({
user: "oec2003",
pwd: "Aa12345678",
roles: [
{
role: "readWrite",
db: "oec2003_db"
}
]
});
但只是針對(duì)庫(kù)加了用戶和密碼,會(huì)發(fā)現(xiàn),客戶端工具,不使用密碼一樣可以登錄,并且能操作庫(kù)里的內(nèi)容。
這時(shí),修改 docker-compose.yml 文件 ,添加 auth認(rèn)證:
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:
重新構(gòu)建容器,這時(shí)用客戶端訪問(wèn)數(shù)據(jù)庫(kù),或者 collection 就會(huì)出現(xiàn)如下提示:
最后
新創(chuàng)建的時(shí)候 yml 文件沒(méi)有添加 --auth ,也是需要使用用戶名密碼才能使用,但對(duì)現(xiàn)有無(wú)密碼容器進(jìn)行修改,必須添加 --auth ,還不知道原因(可能是我操作問(wèn)題 。
對(duì)現(xiàn)有無(wú)密碼容器進(jìn)行修改時(shí),不管是在 environment 中添加根密碼,還是手動(dòng)進(jìn)入 shell 中添加,只要沒(méi)有添加 --auth ,一樣可以無(wú)密碼登錄。
按照上面步驟進(jìn)行配置,是可以達(dá)到密碼保護(hù)的作用。