继上一篇 MongoDB 教程番外篇之管理工具: Rockmongo ,MongoDB 缺省是没有设置鉴权的,业界大部分使用 MongoDB 的项目也没有设置访问权限。这就意味着只要知道 MongoDB 服务器的端口,任何能访问到这台服务器的人都可以查询和操作 MongoDB 数据库的内容。在一些项目当中,这种使用方式会被看成是一种安全漏洞。

本文介绍如何在单台 MongoDB 服务器上设置鉴权。设置完后,MongoDB 客户端必须用正确的用户名和密码登录,才能在指定的数据库中操作。

首先介绍下 MongoDB 的用户和权限。每个数据库都有自己的用户,创建用户的命令是db.createUser()(文档),当你创建一个用户时,该用户就属于你当前所在的数据库。

每个用户包含三个要素:用户名、密码和角色列表。下面是一个例子:

{user: "dbuser",pwd : "dbpass",roles: ["readWrite", "clusterAdmin"]
}

这个例子表示一个名为dbuser的用户,它在当前的数据库中拥有 readWrite 和 clusterAdmin 两个角色。

MongoDB 2.4新引入了一套权限控制的机制,而旧的addUser的方法在3.0已经不再提供

MongoDB 内置了很多角色,但要注意,不是每个数据库的内置角色都一样。其中 admin 数据库就包含了一些其他数据库所没有的角色。

(1).数据库用户角色

针对每一个数据库进行控制。
read :提供了读取所有非系统集合,以及系统集合中的system.indexes, system.js, system.namespaces
readWrite: 包含了所有read权限,以及修改所有非系统集合的和系统集合中的system.js的权限.

(2).数据库管理角色

每一个数据库包含了下面的数据库管理角色。
dbOwner:该数据库的所有者,具有该数据库的全部权限。
dbAdmin:一些数据库对象的管理操作,但是没有数据库的读写权限。(参考:http://docs.mongodb.org/manual/reference/built-in-roles/#dbAdmin)
userAdmin:为当前用户创建、修改用户和角色。拥有userAdmin权限的用户可以将该数据库的任意权限赋予任意的用户。

(3).集群管理权限

admin数据库包含了下面的角色,用户管理整个系统,而非单个数据库。这些权限包含了复制集和共享集群的管理函数。
clusterAdmin:提供了最大的集群管理功能。相当于clusterManager, clusterMonitor, and hostManager和dropDatabase的权限组合。
clusterManager:提供了集群和复制集管理和监控操作。拥有该权限的用户可以操作config和local数据库(即分片和复制功能)
clusterMonitor:仅仅监控集群和复制集。
hostManager:提供了监控和管理服务器的权限,包括shutdown节点,logrotate, repairDatabase等。
备份恢复权限:admin数据库中包含了备份恢复数据的角色。包括backup、restore等等。

(4).所有数据库角色

admin数据库提供了一个mongod实例中所有数据库的权限角色:
readAnyDatabase:具有read每一个数据库权限。但是不包括应用到集群中的数据库。
readWriteAnyDatabase:具有readWrite每一个数据库权限。但是不包括应用到集群中的数据库。
userAdminAnyDatabase:具有userAdmin每一个数据库权限,但是不包括应用到集群中的数据库。
dbAdminAnyDatabase:提供了dbAdmin每一个数据库权限,但是不包括应用到集群中的数据库。

(5). 超级管理员权限

root: dbadmin到admin数据库、useradmin到admin数据库以及UserAdminAnyDatabase。但它不具有备份恢复、直接操作system.*集合的权限,但是拥有root权限的超级用户可以自己给自己赋予这些权限。

(6). 备份恢复角色:backup、restore;

(7). 内部角色:__system

PS:关于每个角色所拥有的操作权限可以点击上面的内置角色链接查看详情。

官方实例

use products # mongoDB的权限设置是以库为单位的,必选要先选择库
db.createUser(
{ "user" : "accountAdmin01", "pwd": "cleartext password","customData" : { employeeId: 12345 },"roles" : [ { role: "clusterAdmin", db: "admin" }, { role: "readAnyDatabase", db: "admin" },"readWrite" ] },
{ w: "majority" , wtimeout: 5000 } ) # readWrite 适用于products库,clusterAdmin与readAnyDatabase角色适用于admin库

熟 悉 Oracle 的童鞋们都知道,数据库用户有两种,一种是管理员,用来管理用户,一种是普通用户,用来访问数据。类似的,为 MongoDB 规划用户鉴权时,至少要规划两种角色:用户管理员和数据库用户。如果搭建了分片或主从,可能还会要规划数据库架构管理员的角色,它们专门用来调整数据库的 分布式架构。

在创建用户之前,我们首先要修改 MongoDB 的启动方式。缺省方式下 MongoDB 是不进行鉴权检查的。我们只要在运行 MongoDB 的命令后面加上一个 --auth 参数即可,例如:

mongod --dbpath ./db1 --port 20000 --auth

MongoDB默认不启用安全授权机制。在单节点环境下,你需要在启动mongod时指定–auth,或者在参数里设置auth=true来启用这个特性。

如果上述命令无效的话,那就 手动开启用户权限认证

[gideon@ikeepstudying]$ vi /etc/mongodb.conf           //将auth=true前面的注释拿掉
[gideon@ikeepstudying]$ /etc/init.d/mongod restart      //重启生效
// 或者使用 sudo service mongod restart 重启

如何创建用户管理员

用户管理员是第一个要创建的用户。在没有创建任何用户之前,你可以随意创建用户;但数据库中一旦有了用户,那么未登录的客户端就没有权限做任何操作了,除非使用db.auth(username, password)方法登录。

用户管理员的角色名叫 userAdminAnyDatabase,这个角色只能在 admin 数据库中创建。下面是一个例子:

> use admin
switched to db admin
> db.createUser({user:"root",pwd:"root123",roles:["userAdminAnyDatabase"]})
Successfully added user: { "user" : "root", "roles" : [ "userAdminAnyDatabase" ] }

这个例子创建了一个名为 root 的用户管理员。创建完了这个用户之后,我们应该马上以该用户的身份登录:

> db.auth("root","root123")
1

db.auth() 方法返回 1 表示登录成功。接下来我们为指定的数据库创建访问所需的账号。

如何创建数据库用户

首先保证你已经以用户管理员的身份登录 admin 数据库。然后用 use 命令切换到目标数据库,同样用 db.createUser() 命令来创建用户,其中角色名为 “readWrite”。

普通的数据库用户角色有两种,read 和 readWrite。顾名思义,前者只能读取数据不能修改,后者可以读取和修改。

下面是一个例子:

> use test
switched to db test
> db.createUser({user:"testuser",pwd:"testpass",roles:["readWrite"]})
Successfully added user: { "user" : "testuser", "roles" : [ "readWrite" ] }
> db.auth("testuser","testpass")
1

这样 MongoDB 的数据安全性就得到保障了,没有登录的客户端将无法执行任何命令。

除了db.createUser(),下面几个函数也是常用的:
获得数据库的所有用户权限信息:db.getUsers()
获得某个用户的权限信息:db.getUser()
创建角色: db.createRole()
更新角色:db.updateRole()
删除角色:db.dropRole()
获得某个角色信息:db.getRole()
删除用户:db.dropUser()
删除所有用户:db.dropAllUsers()
将一个角色赋予给用户:db.grantRolesToUser()
撤销某个用户的某个角色权限:db.revokeRolesFromUser()
更改密码:db.changeUserPassword()
更多内容可以去看下 reference

那么,设置完这些后,如果需要登陆Rockmongo的话,可参考如下设置:

进入Rockmongo安装的根目录下,通常在/var/www/rockmongo路径下。找到config.php文件并打开,在文件下面添加如下几行配置代码:

/*** This is the configuration  for remote mongodb*/
$MONGO["servers"][$i]["mongo_name"] = "The name of mongodb"; // 随便自己命名,显示在rockmongo的db昵称,如: mongoHQ-helloworld
$MONGO["servers"][$i]["mongo_host"] = "The host of mongodb"; // 远程mongodb服务器的主域名,如:troup.mongohq.com
$MONGO["servers"][$i]["mongo_port"] = "The port of mongodb"; // 远程mongodb服务器提供的端口,如37017
$MONGO["servers"][$i]["mongo_user"] = "The username of mongodb"; // 拥有权限操作该db的用户名,如:pigerla
$MONGO["servers"][$i]["mongo_pass"] = "The password of mongodb"; // 拥有权限操作该db的用户密码,如:xxxxxx
$MONGO["servers"][$i]["mongo_db"] = "The database's name of mongodb"; // 数据库的名称,如:helloworld
$MONGO["servers"][$i]["mongo_auth"] = false; // 当值为false时,表示rockmongo使用这里的配置去连接远程mongodb,否则,只能在rockmongo登录界面输入以上信息进行登录
$MONGO["servers"][$i]["control_users"]["admin"] = "admin"; // 当mongo_auth为false时,这设置才有效,表示在rockmongo登录界面,用户名为admin,密码为
admin,这也是默认配置。
$i ++;

我个人设置如下:

/**
* Configuration of MongoDB servers
*
* @see more details at http://rockmongo.com/wiki/configuration?lang=en_us
*/
$MONGO["servers"][$i]["mongo_name"] = "Localhost";//mongo server name
//$MONGO["servers"][$i]["mongo_sock"] = "/var/run/mongo.sock";//mongo socket path (instead of host and port)
$MONGO["servers"][$i]["mongo_host"] = "127.0.0.1";//mongo host
$MONGO["servers"][$i]["mongo_port"] = "27017";//mongo port
$MONGO["servers"][$i]["mongo_timeout"] = 0;//mongo connection timeout
//$MONGO["servers"][$i]["mongo_db"] = "MONGO_DATABASE";//default mongo db to connect, works only if mongo_auth=false
//$MONGO["servers"][$i]["mongo_user"] = "MONGO_USERNAME";//mongo authentication user name, works only if mongo_auth=false
//$MONGO["servers"][$i]["mongo_pass"] = "MONGO_PASSWORD";//mongo authentication password, works only if mongo_auth=false
$MONGO["servers"][$i]["mongo_auth"] = TRUE;//enable mongo authentication?$MONGO["servers"][$i]["control_auth"] = true;//enable control users, works only if mongo_auth=false
$MONGO["servers"][$i]["control_users"]["admin"] = "admin";//one of control users ["USERNAME"]=PASSWORD, works only if mongo_auth=false$MONGO["servers"][$i]["ui_only_dbs"] = "";//databases to display
$MONGO["servers"][$i]["ui_hide_dbs"] = "";//databases to hide
$MONGO["servers"][$i]["ui_hide_collections"] = "";//collections to hide
$MONGO["servers"][$i]["ui_hide_system_collections"] = false;//whether hide the system collections//$MONGO["servers"][$i]["docs_nature_order"] = false;//whether show documents by nature order, default is by _id field
//$MONGO["servers"][$i]["docs_render"] = "default";//document highlight render, can be "default" or "plain"$i ++;

这样,rockmongo可以自动查询登陆信息是否正确了。

另外 mongo_host 和 mongo_port 都可以在 /etc/mongodb.conf 文件中找到,下面是我个人的截图:

更多配置看官方文档  https://code.google.com/p/rock-php/wiki/configuration 或者 http://rockmongo.com/wiki/configuration  

原文/转自:MongoDB 教程番外篇之添加用户及设置用户权限 ( Rockmongo登陆设置 )

MongoDB 教程番外篇之添加用户及设置用户权限 ( Rockmongo登陆设置 )相关推荐

  1. MongoDB 教程番外篇之管理工具: Rockmongo

    RockMongo是PHP5写的一个MongoDB管理工具. 通过 Rockmongo 你可以管理 MongoDB服务,数据库,集合,文档,索引等等. 它提供了非常人性化的操作.类似 phpMyAdm ...

  2. 番外篇---如何添加论文中的文献引用右上角小标

    番外篇--如何添加论文中的文献引用右上角小标 1.末尾的参考文献就位 2.回到需要添加引用的正文 3.修改为右上角小标注 补充说明: 1.末尾的参考文献就位 (主要为更改为自动编号) 注意:自己手打的 ...

  3. 给深度学习入门者的Python快速教程 - 番外篇之Python-OpenCV

    转载自:https://zhuanlan.zhihu.com/p/24425116 本篇是前面两篇教程:给深度学习入门者的Python快速教程 - 基础篇 给深度学习入门者的Python快速教程 - ...

  4. ARM 汇编基础教程番外篇 ——配置实验环境

    From:https://zhuanlan.zhihu.com/p/29145513 win10 arm 汇编环境 Windows 平台下搭建 ARM 汇编集成环境:https://jingyan.b ...

  5. 数学分析教程 番外篇(2):微分方程 学习感受

    微分方程一般数学系是要专门开一门课讲的,书中也并没有写这方面的内容,但是史济怀老师上课还是讲了.我觉得原因主要是因为他的授课对象是"少年班"的学生,以后不一定学数学,有机会仔细学微 ...

  6. 【梅哥的Ring0湿润插入教程】【番外篇四】抓取盛大GPK驱动保护文件及简略逆向...

    [梅哥的Ring0湿润插入教程] Email:mlkui@163.com 转载请注明出处,谢绝喷子记者等,如引起各类不适请自觉滚J8蛋! 番外篇四:抓取盛大GPK驱动保护文件及简略逆向 [湿润前言] ...

  7. yolov5使用2080ti显卡训练是一种什么样的体验我通过vscode搭建linux服务器对python-yolov5-4.0项目进行训练,零基础小白都能看得懂的教程。>>>>>>>>>第二章番外篇

    第二章番外篇:yolov5通过vscode搭建linux服务器对python-yolov5-4.0项目进行训练,零基础小白都能看得懂的教程.YOLOv5搭建的最快搭建方式,踩坑经历详谈 前期准备: 2 ...

  8. 【梅哥的Ring0湿润插入教程】【番外篇二】秒杀网游Lanucher直接开客户端

    [梅哥的Ring0湿润插入教程] Email:mlkui@163.com 转载请注明出处,谢绝喷子记者等,如引起各类不适请自觉滚J8蛋! 番外篇二:秒杀网游Lanucher直接开客户端 [湿润前言] ...

  9. [zt]数学之美番外篇:平凡而又神奇的贝叶斯方法

    数学之美番外篇:平凡而又神奇的贝叶斯方法 Tags: 数学, 机器学习与人工智能, 计算机科学 save it69 saved tags: 贝叶斯 math bayesian algorithm 数学 ...

最新文章

  1. 交互两个数(不引入第三个变量)
  2. android 向左滑动动画,Android中的滑动动画
  3. java并发之synchronized实现原理及其优化
  4. python3seek_Python seek()和tell()函数详解
  5. 使用springboot来实现WebLog
  6. selenium隐式等待
  7. 用PARL训练mini-alphaGO
  8. 华为网络技术比赛-云平台课件笔记
  9. 昂达v80 plus linux,8英寸便携平板 昂达V80 Plus一体工艺来袭
  10. UVM基本介绍(UVM class hierarchy、验证平台、树状图)
  11. BZOJ 1776: [Usaco2010 Hol]cowpol 奶牛政坛 贪心lca/点分治
  12. bootstrap-table+bootstrap+font-awesome+layui+jquery+popper+sweetalert2+layer综合应用+图+代码
  13. 腾讯qq空间GET登陆JS分析
  14. SAP ABAP 使用 ALSM_EXCEL_TO_INTERNAL_TABLE 批导/上载大数据量 Excel (2)
  15. 【读书笔记】代码思考
  16. cocos creator开发微信小游戏(五)贪吃蛇大作战
  17. oracle加入生僻字,ORACLE数据库中如何插入生僻字
  18. Linux的系统架构(linux由哪几部分组成?)
  19. 【工具推荐】2022博客写作工具流指南
  20. 第三章 非常高的水平层

热门文章

  1. 合法整数集(51Nod-1315)
  2. 庆功会(信息学奥数一本通-T1269)
  3. 2 SD配置-企业结构-定义-定义分销渠道
  4. C语言 strnlen函数实现
  5. 带栩字的优美古诗句_带栩字的名字_以栩字起名-尚名网
  6. MySQL:数据库备份批处理脚本
  7. OpenVINO InferenceEngine之Core类
  8. 3-1HDFS基本概念
  9. Window10 NVIDIA显卡 Tensorflow 2.1 GPU 安装和测试
  10. 自动论文生成器 python_python生成器