Mongodb如何开启用户访问控制详解

前言

Mongodb 数据库默认情况下是没有访问控制的,整个数据库对外是开发的,只要能连上数据库,则可以进行任何操作,这会对数据带来很大的风险。当然,我们可以启用mongodb的访问控制,只让通过认证的用户才能对数据库进行角色范围内的操作。

启用访问控制可以通过在启动 mongodb 时指定 --auth 参数来设置,另外还涉及到创建用户 db.createUser 操作以及一些角色的定义,我们先来看这部分内容。

db.createUser() 用法

db.createUser({
 user: "$USERNAME",
 pwd: "$PASSWROD",
 roles: [
 { role: "$ROLE_NAME", db: "$DBNAME"}
 ]
})

参数说明:

  • user 是用户名
  • pwd 是密码
  • role 来指定用户的角色
  • db 来指定所属的数据库
  • roles 是用户所有角色的集合

Mongodb 预定义角色

Mongodb 中预定义了一些角色,把这些角色赋予给适当的用户上,用户就只能进行角色范围内的操作。

1、数据库用户角色 (所有数据库都有)

  • read 用户可以读取当前数据库的数据
  • readWrite 用户可以读写当前数据库的数据

2、数据库管理角色(所有数据库都有)

  1. dbAdmin 管理员用户但不能对用户和角色管理授权
  2. dbOwner 数据库所有者可进行任何管理任务
  3. userAdmin 可以管理当前数据的用户和角色

3、集群管理角色(admin数据库可用)

  1. clusterAdmin 集群所有管理权限,是 clusterManager , clusterMonitor, hostManager 合集
  2. clusterManager 集群管理和监控
  3. clusterMonitor 集群监控,只读的
  4. hostManager 监控和管理服务器

4、备份和恢复角色(admin数据库可用)

  1. backup
  2. restore

5、所有数据库角色(admin数据库可用)

  1. readAnyDatabase 读取所有数据库
  2. readWriteAnyDatabase 读写所有数据库
  3. userAdminAnyDatabase 所有数据库的 userAdmin 权限
  4. dbAdminAnyDatabase 所有数据库的 dbAdmin 权限

6、超级角色(admin数据库可用)

  1. root 超级用户

7、内部角色

  • __system 所有操作权限

更多预定于角色的信息请参看:https://docs.mongodb.com/manual/core/security-built-in-roles/

启用访问控制的步骤

1, 启动 mongodb 实例,关闭 访问控制

不带 --auth

./mongod

2, 连接上 mongodb 实例

./mongo

3,创建用户管理员

在 admin 数据库中添加一个 具有 userAdminAnyDatabase 角色的用户作为用户管理用户。下面的例子中创建了 admin 为用户管理员。

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

退出连接

4,重启数据库启用访问控制

命令行启动,只需要添加 --auth 参数

./mongo --auth

5,使用管理用户连接,有两种方法

  1. 使用命令行 ./mongo -u "$USERNAME" -p "$PASSWROD" --authenticationDatabase "admin"
  2. 使用 db.auth()

我们使用第二种

>
> use admin
switched to db admin
> db.auth("admin", "admin")
1
>

1 表示认证成功

6, 为某个数据库创建独立用户

以下为 test 数据库 创建具有读写权限的用户 test

admin 用户由于只有 userAdminAnyDatabase 权限,所以没有 test 数据的读写权限,所以,为了读写 test 数据库,我们需要创建一个用户。先看一下直接用 admin 会报什么错误

> use test
> show collections
2017-01-13T13:49:17.691+0800 E QUERY [thread1] Error: listCollections failed: {
"ok" : 0,
"errmsg" : "not authorized on test to execute command { listCollections: 1.0, filter: {} }",
"code" : 13
} :
_getErrorWithCode@src/mongo/shell/utils.js:25:13
DB.prototype._getCollectionInfosCommand@src/mongo/shell/db.js:773:1
DB.prototype.getCollectionInfos@src/mongo/shell/db.js:785:19
DB.prototype.getCollectionNames@src/mongo/shell/db.js:796:16
shellHelper.show@src/mongo/shell/utils.js:754:9
shellHelper@src/mongo/shell/utils.js:651:15
@(shellhelp2):1:1

我们直接使用 show collections , 则报错:not authorized on test to execute command ,意思是没有权限。

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

然后我们使用 db.auth(“test”, “test”) , 再执行命令 则没有报错

> db.auth("test", "test")
1
>
> show collections

试着写入一条数据,也是正常的。

> db.t.insert({name:"buzheng"});
WriteResult({ "nInserted" : 1 })
> db.t.find();
{ "_id" : ObjectId("58786c84bf5dd606ddfe1144"), "name" : "buzheng" }
>

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。

(0)

相关推荐

  • centos7防火墙导致java程序访问mongodb3.0.1时报错的问题分析

    环境描述: 数据库:mongodb3.0.1 数据库系统:centos7,(虚拟机,最小安装) 数据库驱动:mongo-Java-driver-3.0.0.jar 问题描述:shell环境下用mongo客户端程序能正常连接mongod,但java程序始终报错. 查看centos7的官方文档,知道centos7最小安装默认只安装防火墙的动态配置规则服务(firewalld),静态配置规则服务(iptables与ip6tables)需要另行安装. 1.关闭firewall: systemctl st

  • MongoDB系列教程(四):设置用户访问权限

    我们知道mysql在安装的时候需要我们设置一个数据库默认的用户名和密码,mongodb也不例外,不过mongodb是默认的没有设置访问限制的,不需要输入用户名和密码都可以访问的,但是这样会十分的不安全,我们需要手动的为mongodb加上权限限制命令.   首先建立一个默认的账户   复制代码 代码如下: Use admin     Db.addUser('sa','sa') 这样我们建立了一个用户名为sa,密码为sa的默认账户.       在此时我们还是可以不输入用户名和密码进入数据库的,接下

  • mongodb权限设置之添加管理员、普通用户的方法

    我知道的关系型数据库都是有权限控制的,什么用户能访问什么库,什么表,什么用户可以插入,更新,而有的用户只有读取权限. 例如:mysql安装配置好后,有一个自带的mysql数据库,里面有一张user表,用来存放用户,以及用户权限,而mongodb这个最像关系型的数据库,有没有这样的表呢. 一.掌握权限,理解下面4条基本上就差不多 1.mongodb是没有默认管理员账号,所以要先添加管理员账号,在开启权限认证.2.切换到admin数据库,添加的账号才是管理员账号.3.用户只能在用户所在数据库登录,包

  • mongodb 修改用户密码 2种方法

    1,错误做法,直接更新表 > db.system.users.update({"_id" : ObjectId("529e67553992b24438d5e315")},{"user":"tank2","readOnly" : false,"pwd":"123"}) > db.system.users.find(); { "_id" :

  • 关于mongoose连接mongodb重复访问报错的解决办法

    具体代码如下所示: var express = require('express'); var mongoose = require('mongoose'); var router = express.Router(); var Person = mongoose.model('Person',{ id:Number, name:String }); /*新增*/ router.get('/insert', function(req, res){ var student = new Person

  • MongoDB远程访问配置步骤详解

    本文介绍的内容是关于MongoDB远程访问配置,下面话不多说,直接来看看详细的步骤. 1.首先修改mongodb的配置文件 让其监听所有外网ip 编辑文件: /etc/mongodb.conf 修改后的内容如下: bind_ip = 0.0.0.0 port = 27017 auth=true 2. /etc/init.d/mongodb restart 3.连接 #本地连接 /usr/local/mongodb/bin/mongo #远程连接 /usr/local/mongodb/bin/mo

  • nodejs中使用monk访问mongodb

    安装mongodb 我觉得还是用mannual install靠谱一点儿:http://docs.mongodb.org/manual/tutorial/install-mongodb-on-os-x/ 启动mongodb $ mongod 连接mogodb $ mongo mongo> use monk-app mongo> db.products.insert({"name":"apple juice", "description"

  • MongoDB为用户设置访问权限

    MongoDB已经使用很长一段时间了,基于MongoDB的数据存储也一直没有使用到权限访问(MongoDB默认设置为无权限访问限制),今天特地花了一点时间研究了一下,研究成果如下: 注:研究成果基于Windows平台 MongoDB在本机安装部署好后 1. 输入命令:show dbs,你会发现它内置有两个数据库,一个名为admin,一个名为local.local好像没啥用,如果哪位在使用过程中发现了这个local表的用途,希望能够留言提醒,那我们就专心来说说admin表 2. 输入命令:use

  • mongodb 添加用户及权限设置详解

    例如:mysql安装配置好后,有一个自带的mysql数据库,里面有一张user表,用来存放用户,以及用户权限,而mongodb这个最像关系型的数据库,有没有这样的表呢. 一,掌握权限,理解下面4条基本上就差不多 1,mongodb是没有默认管理员账号,所以要先添加管理员账号,在开启权限认证. 2,切换到admin数据库,添加的账号才是管理员账号. 3,用户只能在用户所在数据库登录,包括管理员账号. 4,管理员可以管理所有数据库,但是不能直接管理其他数据库,要先在admin数据库认证后才可以.这一

  • 浅析MongoDB用户管理

    1. 创建一个超级用户 use admin db.createUser( { user: "adminUserName", pwd: "userPassword", roles: [ { roles: "userAdminAnyDatabase", db: "admin" } ] } ) 超级用户的role有两种,userAdmin或者userAdminAnyDatabase(比前一种多加了对所有数据库的访问). db是指定数

随机推荐