MongoDB安全:创建第1个、第2个、第3个用户
Windows 10家庭中文版,MongoDB3.6.3,
前言
使用mongod命令基于某个空白文件夹(存放数据)启动MongoDB服务器时,要是没有使用--auth选项,启动后,任何客户端是可以无需认证就连接MongoDB服务器的。
比如,在MongoDB服务器启动后,在本机的终端输入mongo命令即可连接到MongoDB服务。
没有认证,不安全,在MongoDB服务器发布后,这是决不允许的!
因此,在使用mongod命令启动MongoDB服务器时,需要添加--auth选项,增加安全认证功能。
注意,
MongoDB默认没有添加用户的,基于易用性考虑;
在默认没有用户时,也是可以开启--auth选项的,因为MongoDB提供了一个localhost exception的功能,此功能允许用户在admin数据库中创建一个用户管理员(user administrator),此用户也是下一节要讲的创建的第1个用户。
说明,
MongoDB的安全体系支持下面三种认证机制:
-SCRAM(默认)
-MongoDB Challenge and Response (MONGODB-CR)(在3.6时被废弃)
-x.509证书鉴别(Certificate Authentication,孤不熟悉,短时间内不准备去了解)
创建第1个用户:必须
第1个用户必须是用户管理员,其角色为userAdmin或userAdminAnyDatabase,这个用户可以用下面的方式管理用户:
-创建用户
-给用户赋予(grant)或取消(revoke)某角色
-创建或修改定制角色
总之,创建第一个用户使用userAdmin或userAdminAnyDatabase角色就对了!
孤的操作(mongod的配置参数请参考其help信息):
在空文件夹使用mongod命令启动MongoDB服务器:使用了--auth选项
mongod --dbpath d:\p\mdb018 --logpath d:\p\mdb018\log --logappend --auth --directoryperdb
创建一个基于角色userAdminAnyDatabase、用于admin数据库的用户admin:
-先在Notepad++中写入脚本(JavaScript?),如下:
db.createUser(
{
user: "admin",
pwd: "111111",
roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
}
)
-使用mongo命令连接MongoDB服务器,切换到admin数据库
-将前面的脚本拷贝到命令行并执行:添加用户admin成功;使用db.auth('admin', '111111')验证,返回,成功!
-检查用户admin及其角色的信息:使用db.getUser(...)和db.getRole(....)命令
断开连接,使用选项--authenticationDatabase "admin"登录:建立连接后,db并非admin,仍然是test(与预期不符!),尚不清楚是怎么回事!
不管如何,第1个用户建立好了,角色为userAdminAnyDatabase,官文介绍说,除了local和config外,此角色的用户可以对其它数据库进行其角色允许的操作——简单地说就是,用户管理。
创建第2个用户:内建角色
MongoDB 3.6共有7类共17个内建角色,其中,Database User Roles、Database Administration Roles是所有数据库都有的角色,而其它类别的角色是admin数据库独有的。
目前MongoDB服务器中只有内建数据库,那么,添加一个名为test0709的数据库——使用use,然后编写脚本,建立用户admin0709,密码为111111,使用内建角色readWrite、dbAdmin,脚本如下:
db.createUser(
{
user: "admin0709",
pwd: "111111",
roles: [
{ role: "readWrite", db: "test0709" },
{ role: "dbAdmin", db: "test0709" }
]
}
)
脚本拷贝到终端执行:用户添加成功!
测试:
-切换到admin,使用admin0709验证;
-切换回test0709,使用admin0709验证;
-查看数据库、集合、用户信息;
-已经在数据库test0709中添加了用户admin0709,但在show dbs中却没有看到数据库test0709,为什么?那么,断开连接后,再次连接到MongoDB服务器,是否还存在数据库test0709和其上的用户admin0709呢?测试!
结果显示:show dbs查看不到数据库,但用户admin0709的信息还在。
-admin0709的其中一个角色为readWrite,那么,测试添加、删除文档——在新的数据集fruit中;
-dbAdmin角色有创建集合的功能,那么,可以使用db.createCollection(name, options)函数创建集合;
a.普通集合
b.固定大小集合(capped)
-其它测试
...
注意:用户admin0709在test0709下无法执行show dbs!
说明,孤对这些操作还不够熟练,需要多多练习才是啊!
创建第3个用户:自定义角色
除了内建角色,MongoDB还提供机制自建角色,以满足各种各样的需求,使用db.createRole()函数。
db.createRole()函数语法如下:
db.createRole(role, writeConcern)
参数role、wrieConcern都是文档,本文仅关注role文档,下面是官方示例:具体信息请参考官网
下面新建一个角色myRole:可以在前面的test0709数据库中的集合中添加文档——insert操作。
同样,将添加角色的脚本(脚本的书写规则是什么?官文在哪里?)写入到文本文件中,然后拷贝到终端执行——用admin可以添加此角色(admin0709不具备此权限):
角色myRole添加成功,现在,基于此角色添加用户insertUser(还是用admin用户),脚本如下:
db.createUser(
{
user: "insertUser",
pwd: "111111",
roles: [
{ role: "myRole", db: "test0709" }
]
}
)
拷贝到终端时,执行出错,无法建立用户insertUser,原因是无法找到之前建立的角色myRole!需要做类似flush的操作吗?可是下午添加另一个角色未发现异常啊!
意外关闭终端后,再次进入终端,此时进入数据库test0709,检查又发现了角色myRole,并且成功添加了用户insertUser:
为什么会这样呢?!检查了MongoDB服务器的日志信息,也没有发现相关的失败操作,此时,怎么查找问题原因呢?哪些工具可以使用?
测试insertUser用户:在fruit数据集中插入文档,成功!但是,无法使用insertUser用户查看fruit数据集的文档,因为其不具备find权限!切换为admin0709查看结果,添加成功!
后记
总算写完了,今天第四篇,都挺基础的,但真的用力了!
之前看了菜鸟教程(RUNOOB) ,但因为没有实际操作,结果全忘记了,经过这一遍,好多了,不过呢,还有很多需要练习的!
更新啊、删除啊……各种!无论是角色还是用户!
居然可以直接存中文,挺好的,至少目前不用为字符集烦恼了,那么,和Web应用结合起来呢?过两天就知道了!
就这样!
可以创建第一个用户了、可以创建角色了、可以创建用户了,那么,单例MongoDB的基本安全应该可以保证了吧!放到公网也不用过于担心被坏人破坏了吧!比特币孤是没有的!万分之一枚也没有的!
有一个疑问,是否可以在创建数据库之前为数据库、数据集创建角色和用户?此问题源于之前角色创建好勒,可show dbs看不到数据库test0709。
问题还有一些,一个一个解决,这段时间解决了不少问题了,后面,应该还会更多!(这个蓝色清楚不掉,编辑器的问题吧)
MongoDB安全:创建第1个、第2个、第3个用户的更多相关文章
- 三、MongoDB的创建、更新和删除
一.MongoDB的下载.安装与部署 二.MongoDB的基础知识简介 三.MongoDB的创建.更新和删除 概要 下面开始学习MongoDB最重要也是最基础的部分:C(创建)R(查询)U(更新)D( ...
- mongodb怎么创建数据库和配置用户
mongodb怎么创建数据库和配置用户,远程连接是不够的,还要上去操作和放数据的. 系统:centos 5.x 环境:mongodb 1.安装mongodb 这步就不说了,大家自己去看Centos安装 ...
- MongoDB数据创建与使用
MongoDB数据创建与使用 创建数据库 代码功能:读取本地文本文件,并保存到数据库中 import pymongo #连接mongo数据库 client = pymongo.MongoClient( ...
- MongoDB索引创建(5)
索引创建 1:索引提高查询速度,降低写入速度,权衡常用的查询字段,不必在太多列上建索引 2. 在mongodb中,索引可以按字段升序/降序来创建,便于排序 3. 默认是用btree来组织索引文件,2. ...
- Data Base MongoDB 无法创建抽象类的问题,
无法创建抽象类BsonClassMap.RegisterClassMap 大家都知道抽象类是无法实例化的,即:不能new. 在以下这些情况会遇到这种问题: 1.基类是抽象类: 2.基类是接口: 由于 ...
- MongoDB 的创建、查询、更新、删除
MongoDB数据库中,创建.查询.更新.删除操作的对象是集合. 1.查看某个数据库中有哪些集合,在此之前需要使用数据库 C:\Windows\system32>mongo MongoDB sh ...
- 5.非关系数据库(Nosql)它mongodb:创建一个集合,导出和导入备份, 数据恢复,进出口
1 固定集合 固定集合值得是事先创建并且大小固定的集合 2 固定集合的特征:固定集合非常像环形队列.假设空间不足,最早文档就会被删除,为新的文档腾出空间.一般来说.固定集合适用于不论什么想要自己 ...
- 在MongoDB中创建一个索引而性能提升1000倍的小例子
在https://www.cnblogs.com/xuliuzai/p/9965229.html的博文中我们介绍了MongoDB的常见索引的创建语法.部分同学还想看看MongoDB的威力到底有多大,所 ...
- MongoDB 数据库创建删除、表创建删除、数据增删改查
一.管理 mongodb 数据库:mongo 查看所有数据库列 表 show dbs 二. 创建数据库 创建 数据库 use student 如果真的想把这个数据库创建成功,(collections) ...
- MongoDB 无法创建抽象类的问题,
无法创建抽象类BsonClassMap.RegisterClassMap 大家都知道抽象类是无法实例化的,即:不能new. 在以下这些情况会遇到这种问题: 1.基类是抽象类: 2.基类是接口: 由于 ...
随机推荐
- Maximum Subarray - LeetCode
目录 题目链接 注意点 解法 小结 题目链接 Maximum Subarray - LeetCode 注意点 最大值有可能是正负数交替着出现 解法 解法一:一次遍历即可.当sum小于0的时候就重新开始 ...
- hdu5909 Tree Cutting 【树形dp + FWT】
题目链接 hdu5909 题解 设\(f[i][j]\)表示以\(i\)为根的子树,\(i\)一定取,剩余节点必须联通,异或和为\(j\)的方案数 初始化\(f[i][val[i]] = 1\) 枚举 ...
- 洛谷 P3698 [CQOI2017]小Q的棋盘 解题报告
P3698 [CQOI2017]小Q的棋盘 题目描述 小 Q 正在设计一种棋类游戏. 在小 Q 设计的游戏中,棋子可以放在棋盘上的格点中.某些格点之间有连线,棋子只能在有连线的格点之间移动.整个棋盘上 ...
- NOIWC前的交流题目汇总
RT 2018.12.27 i207M:BZOJ 4695 最假女选手 以维护最大值为例,记录最大值和严格次大值和最大值的出现次数,然后取min的时候递归到小于最大值但大于次大值修改,这个就是最重要的 ...
- 【纪中集训2019.3.23】Deadline
题意 描述 一个二分图\((A,B)\),每个点额外有一个颜色0或者1: 匹配时,只能相同颜色的点匹配: 给出\(A\)中的颜色,问如何分配\(B\)种的颜色使得\((A,B)\)的最大匹配最小: 范 ...
- 团体程序设计天梯赛 L2-016. 愿天下有情人都是失散多年的兄妹
同时也要记录父母的性别,输出询问时要用到 #include <stdio.h> #include <stdlib.h> #include <string.h> #i ...
- 【题解】Catering World Finals 2015 上下界费用流
Prelude 传送到Codeforces:0.0 Solution 板子题,在这里贴个板子. 这题面是smg?题面中有说每个点只能经过一次吗?是我瞎了吗? 因为这WA on test 27一个小时, ...
- python pop()
pop() 函数用于移除列表中的一个元素(默认最后一个元素),并且返回该元素的值. obj -- 可选参数,要移除列表元素的索引值,不能超过列表总长度,默认为 index=-1,删除最后一个列表值 l ...
- Python【经典类与新式类】
经典类多继承的调用方法顺序是:深度优先查询,如下图: 新式类多继承的调用方法顺序是:广度优先查询,如下图: 可以使用下面的代码进行实验验证: #经典类class A: def __init__ ...
- kibana做图表无法选取需要选的字段
kibana做图表无法选取需要选的字段,即通过term的方式过滤选择某一个field时发现列表里无此选项. 再去discover里看,发现此字段前面带有问号,点击后提示这个字段未做索引,不能用于vis ...