MongoDB裸奔有感

522 阅读7分钟

设置MongoDB账户密码

背景

MongoDB裸奔确实很爽,尤其是在服务器上用来学习再适合不过了,但是网络有风险,裸奔需谨慎。这不之前在学习MongoDB的时候裸奔,开放了27017端口号,结果被黑了,所有的测试数据都被加密了,库都没了,只留下了一条留言,感觉这条留言好像在嘲讽我,没有设置账户和密码,附上截图:

image-20220430155816898.png

image-20220430155833735.png

让我花费点大洋购买0.021比特币,家人们,瞬间笑不活了,就这一百多万条测试数据就收0.021,那以后是不是找到了发家致富的道路,哈哈哈哈哈,玩笑归玩笑,兄弟们,切勿当真。问题来了,现在已经知道了因为裸奔导致库被黑,那么貌似现在只需要设置账户名密码就OK

PS❤️:如果你的数据非常重要,而且没有备份的话,讲道理兄弟,你可能需要花费点大洋买比币了🙈(因为我之前允许所有来源0.0.0.0,或许可以尝试允许定向IP访问)

正文开始

1、准备工作

因为之前是裸奔,所以先暂时把防火墙中的27017端口先关闭,防止在重新配置过程中再次被黑掉

2、删除之前的数据库

因为我的MongoDB数据库是使用Docker进行安装的,所以先删除之前的MongoDB容器,所有数据都被黑了,也没有保留的必要了,害怕被插入后台运行脚本,所以干脆删除了吧!!!

# 查看所有运行的容器
> docker ps
# 停止运行中的MongoDB容器
> docker stop CONTAINER ID(容器编号)
# 删除刚刚停止的MongoDB容器
> docker rm 容器id

3、运行MongoDB容器

因为我的docker中的MongoDB中的版本是5.0.7,所以兄弟们在运行MongoDB容器的时候要注意版本号,或者是重新拉取一个和我一样的版本也可以,貌似目前我的版本是最新的(2022-04-30)

# 拉取MongoDB5.0.7版本的数据库
> docker pull mongo:5.0.7
# 查看拉取的镜像
> docker images
# 运行docker容器
> docker run -d --name mongo(给容器起个名称) -p 27017:27017 mongo:5.0.7 --auth

4、设置账户名密码

4.1、进入MongoDB数据库

直接进入docker容器

# 查看当前运行的docker镜像
> docker ps
# 进入MongoDB容器
> docker exec -it mongo(容器名称) bash
# 进入MongoDB数据库
> mongo

或者进入linux解压完之后的mongoDB文件夹中的bin文件夹,运行脚本

> ./mongo

4.2、MongoDB默认角色

角色描述角色标识
数据库用户角色read、readWrite
数据库管理角色dbAdmin、dbOwner、userAdmin
集群管理角色clusterAdmin、clusterManager、clusterMonitor、hostManager
备份恢复角色backup、restore
所有数据库角色readAnyDatabase、readWriterAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase
超级用户角色root

权限相关说明❤️

  • read:允许用户读取指定数据库
  • readWrite:允许用户读写指定数据库
  • dbAdmin:允许用户在指定数据库中执行管理函数,所索引的创建、删除等
  • userAdmin:允许用户向system.users集合中写入数据,可以找指定数据库李创建、删除、管理用户
  • clusterAdmin:只在Admin数据库中可用,用来赋予用户所有分片和赋值集群相关函数的管理权限
  • readAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读权限
  • readWriterAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读写权限
  • userAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的userAdmin权限
  • dbAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的dbAdmin权限
  • root:只在admin数据库中可用。全部权限

因为MongoDB和关系型数据库类似都有库的相关概念,所以先创建一个总的管理员账户

# 查看所有的库
> shwo dbs
# 选择admin库
> use admin
# 新增账户
>db.createUser({
  user: '账户', # 用户名
  pwd: '密码',  # 密码
  roles:[{
    role: 'root', # 超级用户角色
    db: 'admin'  # 该角色所对应的数据库
  }]
})
# 完成之后,可以查一下是否设置成功
> show users

4.3、创建数据库以及每个数据库对应的角色

切换刚刚创建的管理员用户,创建一个新的数据库(demo)以及对应管理的角色(zhangsan)

# 使用admin数据库  一定要使用admin数据库,否则会登录不上
> use admin
# 使用db.auth("username","password")来登录管理员账户,如果登录成功则显示1
> db.auth("管理员账户","管理员密码")
# 创建一个新的数据库
> use demo
# 创建一个新的用户  来给这个数据库设置一个对应的角色
>db.createUser({
  user: 'zhangsan',  # 用户名
  pwd: 'zhangsan',  # 密码
  roles:[{
    role: 'dbOwner',  # 数据库管理角色
    db: 'demo'  # 该角色所管理的数据库  也就是刚才所建的demo
  }]
})
# 执行完之后可以查询一下demo数据对应的用户是否设置成功
> show users

角色管理操作对应的数据库的sql,登录完之后就可以对库中的集合和文档进行操作了

# 登录方式一
> mongo
# 选择对应的数据库
> use database
# 登录该数据库对应的账户角色
> db.auth("username","password")
# 登录方式二
> mongo database名 -u username -p password

4.4、用户角色以及数据库的使用

注意❤️:admin库的超级用户角色,demo库以及demo库的管理角色(zhangsan)创建完毕之后,在使用zhangsan账户去操作demo数据库之前需要退出当前的shell脚本(ps:退出当前脚本也会退出当前登录的超级用户角色),因为MongoDB一次会话不允许认证多个用户,如果强行操作会提示mongodb logical sessions can't have multiple authenticated users

# 退出当前MongoDB数据库
> exit
# 登录方式1
# 重新进入MongoDB数据,以docker为例  进入容器后直接运行mongo命令即可
> mongo
# 先不要登录,直接切换数据库
> use demo
# 登录刚才使用超级管理用户创建的demo数据库对应的角色  登录完之后就可以对该数据库进行操作了
> db.auth("zhangsan","zhangsan")
# 登录方式2直接使用命令登录
> mongo 数据库名称 -u 该数据库对应权限账户 -p
# 
> mongo demo -u zhangsan -p zhangsan

4.5、使用Navicat连接服务器MongoDB数据库

PS❤️:因为在设置用户名和密码之前把防火墙对应的MongoDB的端口关掉了,所以要先将端口打开,打开完之后再去设置Navicat

4.5.1、管理所有的库

主机:服务器的IP地址或者域名

端口:MongoDB映射的端口号

验证:None -> Password

验证数据库:admin

用户名:之前在4.2中新建的超级角色用户

密码:超级角色用户的密码

image-20220430202243214.png

4.5.2、仅仅对于某个数据库管理

以4.3创建的demo数据库为例

主机:服务器的IP地址或者域名

端口:MongoDB映射的端口号

验证:None -> Password

验证数据库:demo

用户名:zhangsan

密码:zhangsan

image-20220430202951974.png

4.6、SpringBoot集成MongoDB

配置文件需要进行修改

在裸奔的时候我的配置文件(application.yml)中写的是如下配置

# mongodb 没有开启任何安全协议
# mongodb(协议)://ip地址或域名(主机):27017(端⼝)/demo(库名)
spring:
  data:
    mongodb:
      uri: mongodb://ip地址或域名:27017/demo

设置完账户密码之后修改为以下内容

spring:
  data:
    mongodb:
      username: zhangsan	# 账户
      password: zhangsan	# 密码
      database: demo		# 该账户所对应的库
      host: ip地址或域名		# 服务器ip地址或域名
      port: 27017			# MongoDB端口号

结束

以上内容就是我整理的MongoDB设置账户名和密码,因为是自己的个人小总结,可能会有纰漏或不同的地方,有任何问题可以留言。兄弟们加油!