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" :"> ...
随机推荐
- Xcode 如何计算整个项目的代码行数
参考链接:https://www.cnblogs.com/sunfuyou/p/7921538.html 1.打开终端 2.cd 空格 将工程的文件夹拖到终端上,回车,此时进入到工程的路径 此时已经进 ...
- AC日记——太空飞行计划 洛谷 P2762
题目背景 题目描述 W 教授正在为国家航天中心计划一系列的太空飞行.每次太空飞行可进行一系列商业性实验而获取利润.现已确定了一个可供选择的实验集合E={E1,E2,…,Em},和进行这些实验需要使用的 ...
- Java 基础【06】复合赋值运算
这是今天在开发当中遇到的问题,虽然不是很大,但还是花了一点时间去琢磨. 嗯,好了.先看一段源代码 short value=2; value-=2; 源码就是上面这个样子的,我动手写的时候因为理解的问题 ...
- 可能是全网最详细的express--middleware
写在前面 hello,小伙伴们,我是你们的pubdreamcc,本篇博文出至于我的GitHub仓库node学习教程资料,欢迎小伙伴们点赞和star,你们的点赞是我持续更新的动力. GitHub仓库地址 ...
- vue报错之Duplicate keys detected: '0'. This may cause an update error.
昨天运行vue项目的时候,出现了[Vue warn]: Duplicate keys detected: '0'. This may cause an update error(错误,检测到重复的ke ...
- SQL盲注工具BBQSQL
SQL盲注工具BBQSQL SQL注入是将SQL命令插入到表单.域名或者页面请求的内容中.在进行注入的时候,渗透测试人员可以根据网站反馈的信息,判断注入操作的结果,以决定后续操作.如果网站不反馈具 ...
- inotify+rsync实现实时同步(附解决crontab中无法执行python脚本的问题)
1.准备环境 # 系统支持的话,下面的目录就会存在 ls /proc/sys/fs/inotify/ rpm -qa inotify-tools yum -y install inotify-tool ...
- 【APIO2015】Bali Sculptures
题目描述 印尼巴厘岛的公路上有许多的雕塑,我们来关注它的一条主干道. 在这条主干道上一共有 $N$ 座雕塑,为方便起见,我们把这些雕塑从 $1$ 到 $N$ 连续地进行标号,其中第 $i$ 座雕塑的年 ...
- ES6新语法学习
参考: 1.http://es6.ruanyifeng.com/#docs/let#let-命令 2.https://reactjs.org/tutorial/tutorial.html 3.http ...
- utuntu16.04安装tensorflow1.4-gpu
之前一直在windows下使用tensorflow,对cpu和gpu的安装都是比较顺利,都是使用anaconda环境下,创建虚拟conda环境,这样方便不同python版本的管理. 一直也想尝试使用u ...