mongodb学习之:安全和认证
mongodb默认是不认证的,默认没有账号,只要能连接上服务就可以对数据库进行各种操作,mongodb认为安全最好的方法就是在一个可信的环境中运行它,保证之后可信的机器才能访问它。因此需要在登录的时候进行用户认证
创建一个数据库新用户用db.createUser()方法,如果用户存在则返回一个用户重复错误。语法:
db.createUser(user, writeConcern)
user这个文档创建关于用户的身份认证和访问信息;
writeConcern这个文档描述保证MongoDB提供写操作的成功报告。
· user文档,定义了用户的以下形式:
{ user: “”,
pwd: “”,
customData: { },
roles: [
{ role: “”, db: “” } | “”,
…
]
}
user文档字段介绍:
user字段,为新用户的名字;
pwd字段,用户的密码;
cusomData字段,为任意内容,例如可以为用户全名介绍;
roles字段,指定用户的角色,可以用一个空数组给新用户设定空角色;
在roles字段,可以指定内置角色和用户定义的角色。
角色有如下几种:
1. 数据库用户角色:read、readWrite;
2. 数据库管理角色:dbAdmin、dbOwner、userAdmin;
3. 集群管理角色:clusterAdmin、clusterManager、clusterMonitor、hostManager;
4. 备份恢复角色:backup、restore;
5. 所有数据库角色:readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase
6. 超级用户角色:root
// 这里还有几个角色间接或直接提供了系统超级用户的访问(dbOwner 、userAdmin、userAdminAnyDatabase)
7. 内部角色:__system
PS:关于每个角色所拥有的操作权限可以点击上面的内置角色链接查看详
在添加用户的时候以下三点需要注意:
· 1) 一定要切换到对应的数据库去创建用户, 否则在进行认证的时候, 会提示找不到用户
· 2) 一定要到对应的数据库上去认证用户, 否则会认证授权失败
· 3) 不是所有人都能操作admin数据库, 分配给用户权限的时候,一定要谨慎
添加一个所有权限的用户
> db.createUser({"user":"root","pwd":"root","roles":["root"]})
Successfully added user: { "user" : "root", "roles" : [ "root" ]
添加一个只读权限的用户
> db.createUser({user:"test",pwd:"test",roles:[{role:"read",db:"admin"}]})
Successfully added user: {
"user" : "test",
"roles" : [
{
"role" : "read",
"db" : "admin"
}
]
}
>
查看用户能发现所有的用户信息。注意,只有在admin数据库下才能查看到所有用户的信息
> db.system.users.find()
{ "_id" : "admin.root", "user" : "root", "db" : "admin", "credentials" : { "SCRAM-SHA-1" : { "iterationCount" : 10000, "salt" : "BPOHThbxXgAF9XTuqzHirg==", "storedKey" : "/bTtbcsHQqKeD8OpNcGOgSy1tvk=", "serverKey" : "rmkh2z/FXPBc+UbEX4vMugApwlU=" } }, "roles" : [ { "role" : "root", "db" : "admin" } ] }
{ "_id" : "admin.test", "user" : "test", "db" : "admin", "credentials" : { "SCRAM-SHA-1" : { "iterationCount" : 10000, "salt" : "8t74rwlbNhj56CDX89HuCw==", "storedKey" : "Pbu0g4IA4f9LsXfmeDm0zTXzrY4=", "serverKey" : "YItP35I5Wul1s6E2yAPsLQdVmZE=" } }, "roles" : [ { "role" : "read", "db" : "admin" } ] }
添加用户后通过mongod --auth重新启动服务器。
这个时候如果我们不使用用户名和密码的话,访问数据库会出现如下错误:提示没有权限去执行命令。
> show dbs
2018-01-01T20:50:42.735+0800 E QUERY [thread1] Error: listDatabases failed:{
"ok" : 0,
"errmsg" : "not authorized on admin to execute command { listDatabases: 1.0 }",
"code" : 13,
"codeName" : "Unauthorized"
} :
使用用户名和密码登录有两种方式:
第一种方式:客户端连接时,指定用户名,密码,db名称。和mysql类似
root@zhf-maple:/var/lib/mongodb# mongo -u "root" -p "root" --authenticationDatabase "admin"
这个时候查看数据库就能成功访问了
> show dbs
admin 0.000GB
local 0.000GB
maple 0.000GB
第二种方式:客户端连接后再进行验证
> use admin
switched to db admin
> db.auth("test","test")
1
返回1代表验证成功
但是采用test用户进行用户查询的时候提示如下的错误
> db.system.users.find()
Error: error: {
"ok" : 0,
"errmsg" : "not authorized on admin to execute command { find: \"system.users\", filter: {} }",
"code" : 13,
"codeName" : "Unauthorized"
}
原因在于我们之前创建test用户的时候,给予的权限只是read。如果给予userAdminAnyDatabase的权限,则可以访问和修改所有的用户信息
db.updateUser("test",{roles:[{role:"userAdminAnyDatabase",db:"admin"}]})
> db.system.users.find()
{ "_id" : "admin.root", "user" : "root", "db" : "admin", "credentials" : { "SCRAM-SHA-1" : { "iterationCount" : 10000, "salt" : "BPOHThbxXgAF9XTuqzHirg==", "storedKey" : "/bTtbcsHQqKeD8OpNcGOgSy1tvk=", "serverKey" : "rmkh2z/FXPBc+UbEX4vMugApwlU=" } }, "roles" : [ { "role" : "root", "db" : "admin" } ] }
{ "_id" : "admin.test", "user" : "test", "db" : "admin", "credentials" : { "SCRAM-SHA-1" : { "iterationCount" : 10000, "salt" : "8t74rwlbNhj56CDX89HuCw==", "storedKey" : "Pbu0g4IA4f9LsXfmeDm0zTXzrY4=", "serverKey" : "YItP35I5Wul1s6E2yAPsLQdVmZE=" } }, "roles" : [ { "role" : "userAdminAnyDatabase", "db" : "admin" } ] }
如果要删除用户的话采用dropUser就可以了
> db.dropUser("test")
true
> db.auth("root","root")
1
> db.system.users.find()
{ "_id" : "admin.root", "user" : "root", "db" : "admin", "credentials" : { "SCRAM-SHA-1" : { "iterationCount" : 10000, "salt" : "BPOHThbxXgAF9XTuqzHirg==", "storedKey" : "/bTtbcsHQqKeD8OpNcGOgSy1tvk=", "serverKey" : "rmkh2z/FXPBc+UbEX4vMugApwlU=" } }, "roles" : [ { "role" : "root", "db" : "admin" } ] }
我们再来看下对于普通数据库的操作。首先在maple数据库下创建一个用户test只有read的权限
> use maple
switched to db maple
> db.createUser({user:"test",pwd:"test",roles:[{role:"read",db:"maple"}]})
Successfully added user: {
"user" : "test",
"roles" : [
{
"role" : "read",
"db" : "maple"
}
]
}
> db.auth("test","test")
1
创建完成后推出重新登录,并在maple集合中插入文档。提示失败,原因是not authorized on maple to execute command.这是由于test用户的权限只是read,没有写的权限
> use maple
switched to db maple
> db.auth("test","test")
1
> db.maple.insert({"name":"abc"})
WriteResult({
"writeError" : {
"code" : 13,
"errmsg" : "not authorized on maple to execute command { insert: \"maple\", documents: [ { _id: ObjectId('5a4a3bbc7e7e6dd2b17893d9'), name: \"abc\" } ], ordered: true }"
}
})
更改用户的权限为readWrite。则可以成功的插入文档
> db.updateUser("test",{roles:[{role:"readWrite",db:"maple"}]})
> show collections
fixedcollection
maple
student_infor
> db.maple.insert({"name","123"})
2018-01-01T21:49:57.536+0800 E QUERY [thread1] SyntaxError: missing : after property id @(shell):1:23
> db.maple.insert({"name":"123"})
WriteResult({ "nInserted" : 1 })
mongodb学习之:安全和认证的更多相关文章
- MongoDB学习之--安全和认证
MongoDB学习之--安全和认证 本文主要介绍两部分内容,Mongodb的安全检查配置以及安全认证操作: 虽然确保系统安全是系统管理员的重要工作,但是作为程序员了解其机制也是大有好处的,毕竟不是每个 ...
- MongoDB学习总结(五) —— 安全认证
作为数据库软件,我们要确保数据的安全,不是谁都可以访问的,所以mongodb也像其他的数据库软件一样可以采用用户验证的方法, mongodb 3.0之前的版本提供了addUser方法向不同的数据库添加 ...
- MongoDB学习总结(四) —— 索引的基本用法
说到索引,大家肯定都在关系型数据库或多或少接触过,它的主要目的是加速查询的速度.MongoDB作为一种数据库,当然也提供了索引的操作. 我们先插入1万条测试数据. 首先,我们先来看看不加索引查找nam ...
- MongoDB学习总结(二)
前言:学习札记! MongoDB学习总结(二) 1. 安装.初识 之前写过一篇MongoDB的快速上手文章,里边详细的讲了如何安装.启动MongoDB,这里就不再累述安装过程,简单介绍一下Mongo ...
- MongoDB学习笔记(三)--权限 && 导出导入备份恢复 && fsync和锁
权限 绑定内网I ...
- MongoDB学习笔记:快速入门
MongoDB学习笔记:快速入门 一.MongoDB 简介 MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统.在高负载的情况下,添加更多的节点,可以保证服务器性能.M ...
- MongoDB学习笔记系列
回到占占推荐博客索引 该来的总会来的,Ef,Redis,MVC甚至Sqlserver都有了自己的系列,MongoDB没有理由不去整理一下,这个系列都是平时在项目开发时总结出来的,希望可以为各位一些帮助 ...
- MongoDB学习笔记—Linux下搭建MongoDB环境
1.MongoDB简单说明 a MongoDB是由C++语言编写的一个基于分布式文件存储的开源数据库系统,它的目的在于为WEB应用提供可扩展的高性能数据存储解决方案. b MongoDB是一个介于关系 ...
- Mongodb学习笔记一(Mongodb环境配置)
Mongodb学习 说明: MongoDB由databases组成,database由collections组成,collection由documents组成,document由fileds组成.Mo ...
- MongoDB学习记录
一.操作符 "$lt" :"<""$lte" :"<=""$gt" :"> ...
随机推荐
- 【Linux】多进程与多线程之间的区别
http://blog.csdn.net/byrsongqq/article/details/6339240 网络编程中设计并发服务器,使用多进程与多线程 ,请问有什么区别? 答案一: 1,进程:子 ...
- linux下网络监控神器"iptraf-ng"
优点:监控的网络信息很全面,安装和使用方便 #centos安装: #yum 源使用centos自带的base源即可. yum install -y iptraf-ng #运行 iptraf-n ...
- github每次push提交都要输入账号密码
问题产生的原因是在克隆的时候使用的是https的方式或者用一些特殊的指令来克隆的github项目源,如 golang里的go get github.com/...... 没次提交push的时候都会提示 ...
- python常用模块2
collections模块 在内置数据类型(dict.list.set.tuple)的基础上,collections模块还提供了几个额外的数据类型:Counter.deque.defaultdict. ...
- python 中各种数据类型的排序问题
list #按照list的第二键值排序 disP2P = [[1,2,3],[2,3,4],[4,5,6]] disP2P = sorted(disP2P,key = lambda x:x[2]) s ...
- Android Q 兼容那些事
文章微信公众号「AndroidTraveler」首发 5 月 20 号参加了 Android Q Labs,因此本篇说一说会议的部分内容以及自己的一些想法. 会议主要是加深开发者对 Android Q ...
- 两种const函数
有两种const函数,声明如下:1.const T func();2.T func() const;第一种表示返回的是const的类型,也即返回的值不能作为左值,楼主懂的.第二种表示该成员函数不能修改 ...
- git history 记录(上传到 issu-170 )
一.上传到gitlab 本地issu-170落后git很多,发生冲突的要手动修改. 2000 cd robot_demo_0226_ws/ 2001 ls 2002 cd IGV01-SW-170 2 ...
- bzoj 1552: [Cerc2007]robotic sort
1552: [Cerc2007]robotic sort Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 1198 Solved: 457[Submit] ...
- Atcoder Grand Contest 024
A 略 B 略 C 略 D(构造分形) 题意: 给出一个由n个点的组成的树,你可以加一些点形成一个更大的树.对于新树中的两个点i和j,如果以i为根的树与以j为根的树是同构的那么i和j颜色可以相同.问最 ...