共计 6449 个字符,预计需要花费 17 分钟才能阅读完成。
有朋友在评论里问到关于 mongodb 的 auth 的问题,我找资料研究了一下,把操作过程记录了下来。
Mongodb 像 Oracle 一样,有着严格的用户、角色权限控制。具体可以参照官网文档:https://docs.mongodb.com/manual/reference/method/db.createUser/
Mongodb 创建用户的语法在不用的版本之间还是不一样的。我这里使用的版本 3.0.6。版本 3.0 之前使用的是 db.addUser(), 但 3.0 之后使用的是 db.createUser()。3.0 后版本中再使用 db.addUser()会报如下错误:
> db.addUser(‘dba’,’dba’)
2017-11-17T13:17:08.001+0800 E QUERY TypeError: Property ‘addUser’ of object admin is not a function
如果数据库中还没有添加任何用户,要想新创建一个用户,要先把 auth 认证停掉,在进入数据库,也就是让 auth=false。
[root@MidApp mongodb]# cat mongodb.conf# 配置文件
dbpath=/data/db
logpath=/usr/local/mongodb/logs/mongodb.log
logappend=true
port=27000
fork=true
auth=false
nohttpinterface=false
bind_ip=192.168.221.161
journal=false
quiet=true
登入数据库,只能看到一个库,看不到 admin 库:
[root@MidApp mongodb]# mongo 192.168.221.161:27000
MongoDB shell version: 3.0.6
connecting to: 192.168.221.161:27000/test
> show dbs
local 0.078GB
现在需要创建一个帐号,该账号需要有 grant 权限,即:账号管理的授权权限。注意一点,mongodb 帐号是跟着库走的,所以在指定库里授权,必须也在指定库里验证(auth)
> use admin
switched to db admin
> db.createUser({user:”dba”,pwd:”dba”,roles:[{role:”userAdminAnyDatabase”,db:”admin”}]})
Successfully added user: {
“user” : “dba”,
“roles” : [
{
“role” : “userAdminAnyDatabase”,
“db” : “admin”
}
]
}
> db.system.users.find()
{“_id” : “admin.dba”, “user” : “dba”, “db” : “admin”, “credentials” : { “SCRAM-SHA-1” : { “iterationCount” : 10000, “salt” : “MXvU7oJanxW7gPw+NwI7rw==”, “storedKey” : “lTPmK31qbk1YKmx5stmYiphsQZE=”, “serverKey” : “gVovcstiwC0nuU6LTXZAiWkucfA=”} }, “roles” : [{ “role” : “userAdminAnyDatabase”, “db” : “admin”} ] }
> db.system.users.find().pretty()
{
“_id” : “admin.dba”,
“user” : “dba”,
“db” : “admin”,
“credentials” : {
“SCRAM-SHA-1” : {
“iterationCount” : 10000,
“salt” : “MXvU7oJanxW7gPw+NwI7rw==”,
“storedKey” : “lTPmK31qbk1YKmx5stmYiphsQZE=”,
“serverKey” : “gVovcstiwC0nuU6LTXZAiWkucfA=”
}
},
“roles” : [
{
“role” : “userAdminAnyDatabase”,
“db” : “admin”
}
]
}
可以看到创建了一个用户 dba,密码 dba,拥有 admin 库的 userAdminAnyDatabase 角色。下面看一下 mongodb 中的内置角色:
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
看一下具体的角色定义:
Read:允许用户读取指定数据库
readWrite:允许用户读写指定数据库
dbAdmin:允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问 system.profile
userAdmin:允许用户向 system.users 集合写入,可以找指定数据库里创建、删除和管理用户
clusterAdmin:只在 admin 数据库中可用,赋予用户所有分片和复制集相关函数的管理权限。
readAnyDatabase:只在 admin 数据库中可用,赋予用户所有数据库的读权限
readWriteAnyDatabase:只在 admin 数据库中可用,赋予用户所有数据库的读写权限
userAdminAnyDatabase:只在 admin 数据库中可用,赋予用户所有数据库的 userAdmin 权限
dbAdminAnyDatabase:只在 admin 数据库中可用,赋予用户所有数据库的 dbAdmin 权限。
root:只在 admin 数据库中可用。超级账号,超级权限
我们打开 auth 参数,来验证一下。
[root@MidApp mongodb]# mongo 192.168.221.161:27000
MongoDB shell version: 3.0.6
connecting to: 192.168.221.161:27000/test
> show dbs# 没有验证,不会有权限
2017-11-17T13:04:35.357-0800 E QUERY Error: listDatabases failed:{
“ok” : 0,
“errmsg” : “not authorized on admin to execute command {listDatabases: 1.0}”,
“code” : 13
}
at Error (<anonymous>)
at Mongo.getDBs (src/mongo/shell/mongo.js:47:15)
at shellHelper.show (src/mongo/shell/utils.js:630:33)
at shellHelper (src/mongo/shell/utils.js:524:36)
at (shellhelp2):1:1 at src/mongo/shell/mongo.js:47
> use admin# 在 admin 库下面添加的账号,所以要切到 admin 下面认证
switched to db admin
> db.auth(‘dba’,’dba’)
1
> show dbs
admin 0.078GB
local 0.078GB
可以看到,创建的 dba 用户已经验证成功。接下来我在创建两个用户,验证一下其他角色权限。创建一个只读用户,一个读写用户。
> use test;
switched to db test
> db.createUser({user:”zduser”,pwd:”zduser”,roles:[{role:”read”,db:”test”}]})
Successfully added user: {
“user” : “zduser”,
“roles” : [
{
“role” : “read”,
“db” : “test”
}
]
}
> db.createUser({user:”dxuser”,pwd:”dxuser”,roles:[{role:”readWrite”,db:”test”}]})
Successfully added user: {
“user” : “dxuser”,
“roles” : [
{
“role” : “readWrite”,
“db” : “test”
}
]
}
> show users;
{
“_id” : “test.zduser”,
“user” : “zduser”,
“db” : “test”,
“roles” : [
{
“role” : “read”,
“db” : “test”
}
]
}
{
“_id” : “test.dxuser”,
“user” : “dxuser”,
“db” : “test”,
“roles” : [
{
“role” : “readWrite”,
“db” : “test”
}
]
}
>
在 test 库中创建一个集合,验证一下这两个用户权限:
> show tables;#userAdminAnyDatabase 权限只针对用户管理,没有其他的权限
2017-11-17T13:47:39.845-0800 E QUERY Error: listCollections failed: {
“ok” : 0,
“errmsg” : “not authorized on test to execute command {listCollections: 1.0}”,
“code” : 13
}
at Error (<anonymous>)
at DB._getCollectionInfosCommand (src/mongo/shell/db.js:646:15)
at DB.getCollectionInfos (src/mongo/shell/db.js:658:20)
at DB.getCollectionNames (src/mongo/shell/db.js:669:17)
at shellHelper.show (src/mongo/shell/utils.js:625:12)
at shellHelper (src/mongo/shell/utils.js:524:36)
at (shellhelp2):1:1 at src/mongo/shell/db.js:646
> exit
bye
[root@MidApp mongodb]# mongo 192.168.221.161:27000 #重新登录一下
MongoDB shell version: 3.0.6
connecting to: 192.168.221.161:27000/test
> use test
switched to db test
> db.tb1.insert({“a”:1,”b”:2})# 先试着插入数据看看
WriteResult({
“writeError” : {
“code” : 13,
“errmsg” : “not authorized on test to execute command {insert: \”tb1\”, documents: [ { _id: ObjectId(‘5a0f595b3b6523dcb81d4f76’), a: 1.0, b: 2.0 } ], ordered: true }”
}
})
> db.auth(‘dxuser’,’dxuser’)# 用可读写的用户认证
1
> db.tb1.insert({“a”:1,”b”:2})# 可以插入数据
WriteResult({“nInserted” : 1})
> db.tb1.insert({“a”:11,”b”:22})
WriteResult({“nInserted” : 1})
> db.tb1.insert({“a”:111,”b”:222})
WriteResult({“nInserted” : 1})
> db.tb1.find()
{“_id” : ObjectId(“5a0f597f3b6523dcb81d4f77”), “a” : 1, “b” : 2 }
{“_id” : ObjectId(“5a0f59933b6523dcb81d4f78”), “a” : 11, “b” : 22 }
{“_id” : ObjectId(“5a0f59983b6523dcb81d4f79”), “a” : 111, “b” : 222 }
> db.auth(‘zduser’,’zduser’)# 切换只读用户
1
> db.tb1.insert({“a”:1111,”b”:2222})# 没有权限插入数据
WriteResult({
“writeError” : {
“code” : 13,
“errmsg” : “not authorized on test to execute command {insert: \”tb1\”, documents: [ { _id: ObjectId(‘5a0f59c63b6523dcb81d4f7a’), a: 1111.0, b: 2222.0 } ], ordered: true }”
}
})
> db.tb1.find()# 可以查看数据
{“_id” : ObjectId(“5a0f597f3b6523dcb81d4f77”), “a” : 1, “b” : 2 }
{“_id” : ObjectId(“5a0f59933b6523dcb81d4f78”), “a” : 11, “b” : 22 }
{“_id” : ObjectId(“5a0f59983b6523dcb81d4f79”), “a” : 111, “b” : 222 }
>
注意:Mongodb 用户是跟着数据库密切相关的,在哪个库授权的用户就需要去哪个库下面进行认证。
更多 MongoDB 相关教程见以下内容:
MongoDB 文档、集合、数据库简介 http://www.linuxidc.com/Linux/2016-12/138529.htm
MongoDB 3 分片部署及故障模拟验证 http://www.linuxidc.com/Linux/2016-12/138529.htm
Linux CentOS 6.5 yum 安装 MongoDB http://www.linuxidc.com/Linux/2016-12/137790.htm
CentOS 7 yum 方式快速安装 MongoDB http://www.linuxidc.com/Linux/2016-11/137679.htm
MongoDB 的查询操作 http://www.linuxidc.com/Linux/2016-10/136581.htm
在 Azure 虚拟机上快速搭建 MongoDB 集群 http://www.linuxidc.com/Linux/2017-09/146778.htm
MongoDB 复制集原理 http://www.linuxidc.com/Linux/2017-09/146670.htm
MongoDB 3.4 远程连接认证失败 http://www.linuxidc.com/Linux/2017-06/145070.htm
Ubuntu 16.04 中安装 MongoDB3.4 数据库系统 http://www.linuxidc.com/Linux/2017-07/145526.htm
MongoDB 权威指南第 2 版 PDF 完整带书签目录 下载见 http://www.linuxidc.com/Linux/2016-12/138253.htm
MongoDB 的详细介绍:请点这里
MongoDB 的下载地址:请点这里
本文永久更新链接地址:http://www.linuxidc.com/Linux/2017-11/148738.htm