1、安全认证概述

MongoDB 默认是没有账号的,可以直接连接,无须身份验证。实际项目中肯定是要权限验证的,否则后果不堪设想。从2016年开始 发生了多起MongoDB黑客赎金事件,大部分MongoDB安全问题 暴露出了安全问题的短板其实是用户,首先用户对于数据库的安全不重视,其次用户在使用过程中可能没有养成定期备份的好习惯,最后是企业可能缺乏有经验和技术的专业人员。所以对MongoDB进行安全认证是必须要做的。

2、用户相关操作

(1)切换到admin数据库对用户的添加

use admin;
db.createUser(userDocument):用于创建 MongoDB 登录用户以及分配权限的方法

db.createUser({user: "账号",pwd: "密码",roles: [{ role: "角色", db: "安全认证的数据库" },{ role: "角色", db: "安全认证的数据库" }]}
)
  • user:创建的用户名称,如 admin、root 、lagou
  • pwd:用户登录的密码
  • roles:为用户分配的角色,不同的角色拥有不同的权限,参数是数组,可以同时设置多个
  • role:角色,MonngoDB 已经约定好的角色,不同的角色对应不同的权限 后面会对role做详细解释
  • db:数据库实例名称,如 MongoDB 4.0.2 默认自带的有 admin、local、config、test 等,即为哪个数据库实例设置用户

举例:

db.createUser(
        {
                user:"root",
                pwd:"123321",
                roles:[{role:"root",db:"admin"}]
        }
)

(2)修改密码

db.changeUserPassword('用户名','新密码');

(3)用户添加角色

db.grantRolesToUser( '用户名' , [{ role: '角色名' , db: '数据库名'}])

(4)以auth 方向启动mongod

./bin/mongod -f conf/mongo.conf --auth
(也可以在mongo.conf 中添加auth=true 参数)

(5)验证用户

db.auth("账号","密码")

(6)删除用户

db.dropUser("用户名")

3、角色

(1)数据库内置的角色

  • read:允许用户读取指定数据库
  • readWrite:允许用户读写指定数据库
  • dbAdmin:允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问system.profile
  • userAdmin:允许用户向system.users集合写入,可以找指定数据库里创建、删除和管理用户
  • clusterAdmin:只在admin数据库中可用,赋予用户所有分片和复制集相关函数的管理权限
  • readAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读权限
  • readWriteAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读写权限
  • userAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的userAdmin权限
  • dbAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的dbAdmin权限
  • root:只在admin数据库中可用。超级账号,超级权限
  • dbOwner:库拥有者权限,即readWrite、dbAdmin、userAdmin角色的合体

(2)各个类型用户对应的角色

  • 数据库用户角色:read、readWrite
  • 数据库管理角色:dbAdmin、dbOwner、userAdmin
  • 集群管理角色:clusterAdmin、clusterManager、clusterMonitor、hostManager
  • 备份恢复角色:backup、restore;
  • 所有数据库角色:readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase
  • 超级用户角色:root
  • 这里还有几个角色间接或直接提供了系统超级用户的访问(dbOwner 、userAdmin、userAdminAnyDatabase)

4、单机安全认证实现流程

创建 mydb1 数据库并创建了两个用户,zhangsan 拥有读写权限,lisi 拥有只读权限测试这两个账户的权限。

以超级管理员登录测试权限。

(1)创建管理员

MongoDB 服务端开启安全检查之前,至少需要有一个管理员账号,admin 数据库中的用户都被视为管理员,如果 admin 库没有任何用户的话,即使在其他数据库中创建了用户,启用身份验证,默认的连接方式依然会有超级权限,即仍然可以不验证账号密码照样能进行 CRUD,安全认证相当于无效。

>use admin
switched to db admin
> db
admin
> db.createUser(
... {
... user:"root",
... pwd:"123456",
... roles:[{role:"root",db:"admin"}]
... })

(2)创建普通用户

如下所示 mydb1 是自己新建的数据库,没安全认证之前可以随意 CRUD,其余的都是 mongoDB 4.0.2 自带的数据库

>show dbs
admin 0.000GB
config 0.000GB
local 0.000GB
mydb1 0.000GB
> use mydb1
switched to db mydb1
> db.c1.insert({name:"testdb1"})
> db.c1.insert({name:"testdb1"})
> show tables
c1
c2
> db.c1.find()
...

  • 为 admin 库创建管理员之后,现在来为 普通数据库创建普通用户,以 mydb1 为例,方式与创建管理员一致,切换到指定数据库进行创建即可。
  • 如下所示,为 mydb1 数据库创建了两个用户,zhangsan 拥有读写权限,lisi 拥有只读权限,密码都是 123456

    use mydb1
    switched to db mydb1
    > db
    mydb1
    > db.createUser({
    ... user:"zhangsan",
    ... pwd:"123456",
    ... roles:[{role:"readWrite",db:"mydb1"}]
    ... })
    > db.createUser({
    ... user:"lisi",
    ... pwd:"123456",
    ... roles:[{role:"read",db:"mydb1"}]
    ... })

接着从客户端关闭 MongoDB 服务端,之后使用服务端以安全认证方式进行启动

> use admin
switched to db admin
> db.shutdownServer()
server should be down...

(2)MongoDB 安全认证方式启动

  • mongod --dbpath=数据库路径 --port=端口 --auth
  • 也可以在配置文件中 加入 auth=true

(3)分别以普通用户登录验证权限

普通用户现在仍然像以前一样进行登录,如下所示直接登录进入 mydb1 数据库中,登录是成功的,只是登录后日志少了很多东西,而且执行 show dbs 命令,以及 show tables 等命令都是失败的,即使没有被安全认证的数据库,用户同样操作不了,这都是因为权限不足,一句话:用户只能在自己权限范围内的数据库中进行操作

mongo localhost:57017/mydb1
> show dbs

如下所示,登录之后必须使用 db.auth("账号","密码") 方法进行安全认证,认证通过,才能进行权限范围内的操作

> db.auth("zhangsan","123456")
1
> show dbs
mydb1 0.000GB
> show tables
c1
c2

(5)以管理员登录验证权限

客户端管理员登录如下所示管理员 root 登录,安全认证通过后,拥有对所有数据库的所有权限。

mongo localhost:57017
> use admin
switched to db admin
> db.auth("root","root")
1
> show dbs
...

5、分片集群安全认证

(1)开启安全认证之前 进入路由创建管理员和普通用户

use lagou_resume
db.createUser({
... user:"chengdao",
... pwd:"123456",
... roles:[{role:"readWrite",db:"lagou_resume"}]
... })

(2)关闭所有的配置节点,分片节点 和 路由节点

安装psmisc
        yum install psmisc
安装完之后可以使用killall 命令 快速关闭多个进程
        killall mongod

(3)生成密钥文件,并修改权限

openssl rand -base64 756 > data/mongodb/testKeyFile.file
chmod 600 data/mongodb/keyfile/testKeyFile.file

(4)配置节点集群和分片节点集群开启安全认证和指定密钥文件

auth=true
keyFile=data/mongodb/testKeyFile.file

(5)在路由配置文件中 设置密钥文件

keyFile=data/mongodb/testKeyFile.file

(6)启动所有的配置节点、分片节点 和 路由节点 使用路由进行权限验证

直接启动太麻烦,我们可以建立一个shell脚本,然后批量启动。

  • vi startup.sh # 建立文件

    # 将下面内容添加到此文件中,并保存退出

    ./bin/mongod -f config/config-17017.conf
    ./bin/mongod -f config/config-17018.conf
    ./bin/mongod -f config/config-17019.conf
    ./bin/mongod -f shard/shard1/shard1-37017.conf
    ./bin/mongod -f shard/shard1/shard1-37018.conf
    ./bin/mongod -f shard/shard1/shard1-37019.conf
    ./bin/mongod -f shard/shard2/shard2-47017.conf
    ./bin/mongod -f shard/shard2/shard2-47018.conf
    ./bin/mongod -f shard/shard2/shard2-47019.conf
    ./bin/mongos -f route/route-27017.conf

  • 对此文件添加执行权限:chomd +x startup.sh
  • 启动文件:./startup.sh

(7)Spring boot 连接安全认证的分片集群

spring.data.mongodb.username=账号
spring.data.mongodb.password=密码
# spring.data.mongodb.uri=mongodb://账号:密码@IP:端口/数据库名

MongoDB安全认证相关推荐

  1. 开启docker中MongoDB的认证授权

    开启docker中MongoDB的认证授权 思路 开启MongoDB服务后,默认是没有权限验证的.直接通过IP加端口就可以远程访问数据库,并对数据库进行任意操作.下面介绍一下如何开启docker中Mo ...

  2. springboot集成mongoDB 异常认证

    springboot集成mongoDB 异常认证 参考文章: (1)springboot集成mongoDB 异常认证 (2)https://www.cnblogs.com/mh-study/p/980 ...

  3. MONGODB 权限认证

    使用mongoDB 是从2.4 版本开始的,但那时的权限管理相对比较简单.也就没有去弄这个. 现在再回头看几个版本的权限管理,看到各个版本间都在变化. 并且集群与单机也有很大的不同, 下面是以2.6版 ...

  4. mongodb带认证的副本集搭建

    Mongodb副本集带用户认证的 概述 本次实验是在一台虚拟机上做的,正式环境一定要分开实现,以免影响服务的正常使用和性能. 准备工作: 操作系统:centos7.2 Mongodb版本:3.4.1 ...

  5. MongoDB 权限认证

    MongoDB已经使用很长一段时间了,基于MongoDB的数据存储也一直没有使用到权限访问(MongoDB默认设置为无权限访问限制),因为考虑到数据安全的原因特地花了一点时间研究了一下,网上搜出来的解 ...

  6. MongoDb连接认证错误(Command failed with error 18)

    最近新起一项目用到了mongodb,然后直接采用 spring-boot-starter-data-mongodb 做依赖直接使用框架的mongodb配置,连接mongo然后开发及测试都没问题,上生产 ...

  7. spring.data.mongodb.uri认证失败Authentication failed

    使用spring.data.mongodb.uri=mongodb://root:ve#duj7-wa06yhg$@192.154.81.16:27017/xxxx老是出现Authentication ...

  8. mongoDB Linux 认证配置、重置密码、远程登录配置详解

    一.配置用户 1.启用.关闭认证 vi /etc/mongod.conf//注释这两句 => 关闭认证 #security: # authorization: enabled//打开这两句 =& ...

  9. spring security:基于MongoDB的认证

    spring security对基于数据库的认证支持仅限于JDBC,而很多项目并非使用JDBC,比如Nosql数据库很多使用的是 Mongo Java Driver,这样就无法用默认的<jdbc ...

最新文章

  1. 如何修改Sql2005注册服务器名称 {转载}
  2. 关于FTP上传方法 (by Liang)
  3. 《大道至简》第八章读后感
  4. okcoinapi开发代码_比特币程序化交易入门(5):WebSocket API
  5. uva 1220——Party at Hali-Bula
  6. fb 4.7英文版 显示行数
  7. cnetos7安装zabbix3.0.3安装手册
  8. 系统学习机器学习之随机场(一)--HMM
  9. OpenWebFlow0.9用户手册与设计说明
  10. Eclipse运行异常:Could not find the main class. Program will exit.
  11. 直接插入排序和冒泡排序有什么区别 直接插入排序和冒泡排序有哪些不同
  12. Android Studio简介
  13. 常见的平均查找长度总结
  14. kali2021.1安装pdtools挤牙膏式爬坑日记
  15. 前端实现文字竖向排版
  16. Abbexa 细菌基因组 DNA 试剂盒介绍
  17. 重庆市渝中区相关部门负责人到访 Conflux 探讨新一线城市区块链技术发展路径...
  18. Dijkstra算法求解单源最短路径问题
  19. Greenplum使用TPC-H测试过程及结果
  20. svn:svnserve 配置使用

热门文章

  1. 数据科学之数据可视化----Seaborn绘制小提琴图
  2. SpeedTree软件制作牡丹花
  3. An Analysis of Scale Invariance in Object Detection – SNIP [CVPR2018]
  4. 创建线程的四种方式(Thread、Runnable、线程池、Callable)
  5. c语言除法加速,干货!C语言高效编程与代码优化
  6. 已经共享了,如何在另一台电脑找到共享文件?
  7. EfficientDet训练自己的数据集实现抽烟检测
  8. matlab linprog函数的使用
  9. Java--URI--使用/实例
  10. 用一张思维导图去全面学习通信网里的各种技术