MongoDB用户和角色解释系列(下)

MongoDB用户和角色解析系列(上)是否已经阅读呢?
如果没阅读可以参考这篇文章《MongoDB用户和角色解析系列(上)》

在前半部分我已经讲了很多理论。但是,我知道,如果这是您第一次处理MongoDB角色和用户问题,可能非常令人困惑。因此,让我们一步一步地通过一个示例来了解这个过程,比如当您新增一个新的3个节点副本集,并将安全选项标志设置为true,之后运行该副本集时,这个过程您将怎样操作。同时,我们还将看到使用诸如Studio 3T(用于MongoDB的IDE)这样的可视化界面管理用户和角色是多么容易。

修改mongod.conf配置文件

security:
authorization: enabled
keyFile: /var/lib/rs.key

replication:
replSetName: 'studio3trs'

在三台服务器上面运行mongod服务(Ubuntu 16.04)

$ systemctl start mongod.service

连接其中一台服务器

vagrant@primary:~$ mongo
MongoDB shell version v3.4.16
connecting to: mongodb://127.0.0.1:27017
MongoDB server version: 3.4.16
Welcome to the MongoDB shell.
For interactive help, type "help".
For more comprehensive documentation, see

http://docs.mongodb.org/

Questions? Try the support group

http://groups.google.com/group/mongodb-user

首先初始化副本集:

> rs.initiate()
{
"info2" : "no configuration specified. Using a default configuration for the set",
"me" : "192.168.60.10:27017",
"ok" : 1
}
studio3trs:SECONDARY>
studio3trs:PRIMARY>

创建第一个用户

> use admin
switched to db admin

db.createUser(
{ user : 'juan',
pwd : 'juanpwd',
roles : [ { role : 'userAdminAnyDatabase', db : 'admin' } ]
}
)
Successfully added user: {
"user" : "juan",
"roles" : [
{
"role" : "userAdminAnyDatabase",
"db" : "admin"
}
]
}

通过Studio 3T中的point and click向导,添加第一个用户很容易完成。如前所述,第一步是选择要创建用户的数据库,然后单击“Users”按钮,填写所需的数据,并将角色授予它。

延伸阅读:阅读我们《在Studio 3T中创建新用户管理》的深入指南。
参考网址:https://studio3t.com/knowledge-base/articles/create-mongodb-user/#add-the-new-user

1

用新用户进行登陆

>db.auth('juan','juanpwd')
1

给“test”数据库创建一个dbAdmin用户

> use admin
switched to db admin

db.createUser({ user : 'dbadminuser', pwd : 'dbadminuserpwd', roles : [ { role : 'dbAdmin', db : 'test' } ] })
Successfully added user: {
"user" : "dbadminuser",
"roles" : [
{
"role" : "dbAdmin",
"db" : "test"
}
]
}

创建一个角色,其中包含对’people’集合赋予’find’、’insert’、’update’和’remove’的操作权限,并且对’address’集合只有’find’的操作权限,它们都适用于测试数据库。

> use admin
switched to db admin

db.createRole({ role : 'testuser', privileges : [ { resource : { db : 'test', collection : 'people' }, actions : [ 'find', 'insert', 'update', 'remove' ] }, { resource : { db : 'test', collection : 'address' }, actions : [ 'find' ] } ], roles : [] })
{
"role" : "testuser",
"privileges" : [
{
"resource" : {
"db" : "test",
"collection" : "people"
},
"actions" : [
"find",
"insert",
"update",
"remove"
]
},
{
"resource" : {
"db" : "test",
"collection" : "address"
},
"actions" : [
"find"
]
}
],
"roles" : [ ]
}

在Studio 3T中创建MongoDB角色非常简单。选择数据库,单击“Roles”按钮,填写数据,就可以了。
延伸阅读:获取《角色管理器中可用的所有特权》的概述文章。
参考网址:https://studio3t.com/knowledge-base/articles/role-manager/

2

现在,我们将用如下角色来创建一个用户:

> use admin

db.createUser(
{ user : 'testuser',
pwd : 'testuserpwd',
roles : [ 'testuser' ]
}
)
Successfully added user: { "user" : "testuser", "roles" : [ "testuser" ] }

如果您不喜欢在命令行执行此操作,我们还可以通过Studio 3T MongoDB GUI给用户授予角色。

3

我们也希望能够监控我们的副本集:

> use admin

db.createUser(
{ user : 'monitoruser',
pwd : 'monitoruserpwd',
roles : [ 'clusterMonitor' ]
}
)
Successfully added user: { "user" : "monitoruser", "roles" : [ "clusterMonitor" ] }

现在我们需要一个用户来建立我们的副本集:

> use admin

db.createUser(
{ user : 'clustermanageruser',
pwd : 'clustermanageruserpwd',
roles : [ 'clusterManager' ]
}
)
Successfully added user: { "user" : "clustermanageruser", "roles" : [ "clusterManager" ] }

因此,我们需要给最后一个创建的用户进行身份认证授权,之后创建副本集。

> use admin

db.auth('clustermanageruser','clustermanageruserpwd')
1

用“clustermanageruser”用户连接服务器中一个节点

$ mongo admin -u clustermanageruser --authenticationDatabase admin -p
MongoDB shell version v3.4.16
Enter password:
connecting to: mongodb://127.0.0.1:27017/admin
MongoDB server version: 3.4.16

将剩余节点添加到复制集

studio3trs:PRIMARY> rs.add('secondary:27017')
{ "ok" : 1 }
studio3trs:PRIMARY> rs.addArb('arbiter:27017')
{ "ok" : 1 }
studio3trs:PRIMARY>

检查副本集的状态

studio3trs:PRIMARY> rs.status()

检查“testuser”用户的权限

studio3trs:PRIMARY> use admin
switched to db admin
studio3trs:PRIMARY> db.auth('testuser','testuserpwd')
1
studio3trs:PRIMARY> use test
switched to db test
studio3trs:PRIMARY> db.address.find()
studio3trs:PRIMARY> db.address.insert({ a : 1 })
WriteResult({
"writeError" : {
"code" : 13,
"errmsg" : "not authorized on test to execute command { insert: \"address\", documents: [ { _id: ObjectId('5b7215bcc1c1ef9b446c2c9b'), a: 1.0 } ], ordered: true }"
}
})
studio3trs:PRIMARY>
studio3trs:PRIMARY> db.people.insert({ a : 1 })
WriteResult({ "nInserted" : 1 })
studio3trs:PRIMARY> db.people.update({ a : 1 }, { $set : { b : 2 } })
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
studio3trs:PRIMARY> db.people.find({ a : 1 })
{ "_id" : ObjectId("5b7215e5c1c1ef9b446c2c9c"), "a" : 1, "b" : 2 }
studio3trs:PRIMARY> db.people.remove({ a : 1 })
WriteResult({ "nRemoved" : 1 })
studio3trs:PRIMARY> db.people.find({ a : 1 })
studio3trs:PRIMARY>

总结

我们学习了MongoDB用户认证和授权,以及角色和用户的概念,并将角色分配给用户。我们已经知道如何在MongoDB中启用访问控制权限,如何管理用户和角色,以及如何使用localhost异常。我们现在能够使用各种方便的方法连接到数据库。我们讨论了最重要的内置角色,并且知道如何创建自己的自定义角色并将它们分配给用户。最后,我们将逐步介绍如何在一个新的包含三个数据的节点副本集中启用访问控制,如何利用localhost异常创建第一个用户,以及如何为用户创建所需的MongoDB角色。此外,我们还了解了如何通过使用诸如Studio 3T之类的MongoDB IDE来节省管理MongoDB用户管理和角色管理的时间。

原文作者:Juan Roy Couto
Juan为了让自己成为目前MongoDB大师之一(https://www.mongodb.com/community/masters)。他获得了MongoDB认证,DBA和DEV。目前,他的工作角色是MongoDB数据库工程师。在此之前,在多家金融公司做了20年的开发。他喜欢与皇马的马克杯合作,也喜欢与技术社区交流。你可以在twitter.com/juanroycouto上阅读他的文章。

更多阅读:《MongoDB用户和角色解析系列(上)》

译者:管祥青
湖南大学研究生毕业,毕业后在海康威视研究院从事大数据研发及机器学习相关工作,现在就职于一家大数据金融公司。

推文转化图片

发表评论