MongoDB安全认证
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安全认证相关推荐
- 开启docker中MongoDB的认证授权
开启docker中MongoDB的认证授权 思路 开启MongoDB服务后,默认是没有权限验证的.直接通过IP加端口就可以远程访问数据库,并对数据库进行任意操作.下面介绍一下如何开启docker中Mo ...
- springboot集成mongoDB 异常认证
springboot集成mongoDB 异常认证 参考文章: (1)springboot集成mongoDB 异常认证 (2)https://www.cnblogs.com/mh-study/p/980 ...
- MONGODB 权限认证
使用mongoDB 是从2.4 版本开始的,但那时的权限管理相对比较简单.也就没有去弄这个. 现在再回头看几个版本的权限管理,看到各个版本间都在变化. 并且集群与单机也有很大的不同, 下面是以2.6版 ...
- mongodb带认证的副本集搭建
Mongodb副本集带用户认证的 概述 本次实验是在一台虚拟机上做的,正式环境一定要分开实现,以免影响服务的正常使用和性能. 准备工作: 操作系统:centos7.2 Mongodb版本:3.4.1 ...
- MongoDB 权限认证
MongoDB已经使用很长一段时间了,基于MongoDB的数据存储也一直没有使用到权限访问(MongoDB默认设置为无权限访问限制),因为考虑到数据安全的原因特地花了一点时间研究了一下,网上搜出来的解 ...
- MongoDb连接认证错误(Command failed with error 18)
最近新起一项目用到了mongodb,然后直接采用 spring-boot-starter-data-mongodb 做依赖直接使用框架的mongodb配置,连接mongo然后开发及测试都没问题,上生产 ...
- spring.data.mongodb.uri认证失败Authentication failed
使用spring.data.mongodb.uri=mongodb://root:ve#duj7-wa06yhg$@192.154.81.16:27017/xxxx老是出现Authentication ...
- mongoDB Linux 认证配置、重置密码、远程登录配置详解
一.配置用户 1.启用.关闭认证 vi /etc/mongod.conf//注释这两句 => 关闭认证 #security: # authorization: enabled//打开这两句 =& ...
- spring security:基于MongoDB的认证
spring security对基于数据库的认证支持仅限于JDBC,而很多项目并非使用JDBC,比如Nosql数据库很多使用的是 Mongo Java Driver,这样就无法用默认的<jdbc ...
最新文章
- 如何修改Sql2005注册服务器名称 {转载}
- 关于FTP上传方法 (by Liang)
- 《大道至简》第八章读后感
- okcoinapi开发代码_比特币程序化交易入门(5):WebSocket API
- uva 1220——Party at Hali-Bula
- fb 4.7英文版 显示行数
- cnetos7安装zabbix3.0.3安装手册
- 系统学习机器学习之随机场(一)--HMM
- OpenWebFlow0.9用户手册与设计说明
- Eclipse运行异常:Could not find the main class. Program will exit.
- 直接插入排序和冒泡排序有什么区别 直接插入排序和冒泡排序有哪些不同
- Android Studio简介
- 常见的平均查找长度总结
- kali2021.1安装pdtools挤牙膏式爬坑日记
- 前端实现文字竖向排版
- Abbexa 细菌基因组 DNA 试剂盒介绍
- 重庆市渝中区相关部门负责人到访 Conflux 探讨新一线城市区块链技术发展路径...
- Dijkstra算法求解单源最短路径问题
- Greenplum使用TPC-H测试过程及结果
- svn:svnserve 配置使用
热门文章
- 数据科学之数据可视化----Seaborn绘制小提琴图
- SpeedTree软件制作牡丹花
- An Analysis of Scale Invariance in Object Detection – SNIP [CVPR2018]
- 创建线程的四种方式(Thread、Runnable、线程池、Callable)
- c语言除法加速,干货!C语言高效编程与代码优化
- 已经共享了,如何在另一台电脑找到共享文件?
- EfficientDet训练自己的数据集实现抽烟检测
- matlab linprog函数的使用
- Java--URI--使用/实例
- 用一张思维导图去全面学习通信网里的各种技术