1. 背景
业务方的服务器经安全检查,发现以docker容器启动的mongo未增加鉴权的漏洞,随优化之
2. 配置
mongo以docker compose方式启动,镜像的版本号为4.2.6,docker-compose.yml配置文件内容如下:
version: '2' services: mongodb: image: mongo:latest container_name: test_mongodb volumes: - "/data/mongodb/data/configdb/:/data/configdb" - "/data/mongodb/data/db/:/data/db" restart: always ports: - "27128:27017"
3. 增加鉴权
3.1 docker-compose.yml文件新增如下红色部分,即默认以鉴权方式启动mongo
version: '2'
services:
mongodb:
image: mongo:latest
container_name: test_mongodb
volumes:
- "/data/mongodb/data/configdb/:/data/configdb"
- "/data/mongodb/data/db/:/data/db"
restart: always
ports:
- "27128:27017"
environment:
- MONGO_INITDB_ROOT_USERNAME=admin
- MONGO_INITDB_ROOT_PASSWORD=123456
3.2 以docker compose方式启动mongo容器
$ docker-compose up
3.3 新建shell窗口,进入容器
# 进入容器 $ docker exec -it mongo_container_id bash # 进入mongo服务 $ mongo
3.4 新建mongo用户并分配权限
> use admin > db.createUser({"user":"mongo_user", "pwd":"123456", roles: [{"role":"root", db:"admin"}]})
3.5 增加用户后,即可在命令行或客户端中进行鉴权
# 返回1表示鉴权成功 > db.auth("mongo_user", "123456") 1
4. 业务异常解决
当基于spring boot服务端的业务启动并连接mongo时,报如下异常
Caused by: com.mongodb.MongoQueryException: Query failed with error 13 and error message 'not authorized on db to execute command {find: "system.indexes" ....}'
该异常表示创建的用户没有系统索引的操作权限,此时更新用户权限即可,具体命令如下:
> use admin > db.auth("mongo_user", "123456") > db.grantRolesToUser( "mongo_user", [ { role: "__system", db: "admin"}, {"role": "root", "db":"admin"} ] ) # 再次查看该用户权限信息 > db.system.users.find({"user":"mongo_user"}).pretty()