上周在巴黎MUG上,我快速讨论了有关安全性和MongoDB的问题,并且决定创建这篇文章,说明如何配置MongoDB中可用的现成安全性。
您可以在以下文档章节中找到有关MongoDB安全性的所有信息:
在本文中, 我不会详细介绍如何在安全的环境(DMZ / Network / IP / Location /…)中部署数据库。我将重点介绍身份验证和授权 ,并为您提供保护访问安全的步骤。到您的数据库和数据。 我不得不提到,默认情况下,在安装和启动MongoDB时,不会启用安全性。 只是为了使其更易于使用。 安全性的第一部分是身份验证 ,您在此处有多种选择。 让我们关注“ MONGODB-CR”机制。
第二部分是授权 ,选择用户连接到数据库后可以做什么或不能做什么。 有关授权的文档可在此处获得 。
现在让我们记录操作方法:
- 创建一个管理员用户
- 创建应用程序用户
对于每种类型的用户,我将展示如何授予特定权限。
1.启动MongoDB
如前所述,默认情况下,启动MongoDB时不启用安全性。 所以首先想到的是使用
--auth
参数。
> mkdir /data/db
> mongod --auth
....
....
2015-02-04T06:56:37.875+0100 [conn1] note: no users configured in admin.system.users, allowing localhost access
...
MongoDB正在启动,并且在您创建用户之前,您可以从localhost连接以创建一些用户(尤其是管理员用户)。 这就是所谓的localhost异常 。
注意:我这里是在简单配置中记录安全性,我邀请您在部署分片群集时查看该文档。
现在我们已经启动了MongoDB,我们可以创建用户了。
2.创建管理员用户
首先是创建一个管理员用户,该用户也可以创建用户,因此我们必须:
- 去蒙戈壳
- 连接到`admin'数据库
- 创建一个用户并为其分配角色userAdminAnyDatabase
use admin
var user = {
"user" : "admin",
"pwd" : "manager",
roles : [
{
"role" : "userAdminAnyDatabase",
"db" : "admin"
}
]
}
db.createUser(user);
exit
现在,您已经在使用--auth
运行的MongoDB中创建了一个用户,匿名连接将无法对数据库执行任何操作。
例如,您可以测试执行show dbs
或db.coll.insert({'x':0})
命令,您会看到授权错误。
与Admnistrator用户联系
现在我们有了管理员用户,您可以使用该用户连接到数据库:
> mongo admin -u admin -p
我们的管理员用户的角色为userAdminAnyDatabase 。 使用此角色,您可以管理用户; 但是该角色无法从应用程序数据库/集合读取/写入数据。
因此,我们现在需要为“电子商务”应用程序创建一个新用户。
3.创建应用程序用户
现在,我们将创建一个负责电子商务数据库的新用户网站 。
> mongo admin -u admin -p
use ecommerce
var user = {
"user" : "website",
"pwd" : "abc123",
roles : [
{
"role" : "readWrite",
"db" : "ecommerce"
}
]
}
db.createUser(user);
exit
该用户将能够在电子商务数据库上进行读取/写入
与应用程序用户联系
使用mongo shell,您现在可以连接和创建/查询数据
> mongo ecommerce -u website -p
db.products.insert({ "title" : "MongoDB in Action" });
db.products.findOne();
db.products.update({}, {"$set" : { "type" : "book" } })
如您所见,该用户拥有适合您的应用程序的完美配置文件。 请注意,如果您尝试使用该用户查询或修改另一个数据库,则会收到授权例外。
创建报告用户(只读)
您可能需要在应用程序中仅读取数据的用户,比如说在所有数据库中。 为此,您只需要分配角色
readAnyDatabase 。
> mongo admin -u admin -p
var user = {
"user" : "reporting",
"pwd" : "abc123",
roles : [
{
"role" : "readAnyDatabase",
"db" : "admin"
}
]
}
db.createUser(user);
exit
该用户将能够查询所有数据库和集合,包括show dbs
命令。
让我们与报告用户联系:
> mongo admin -u reporting -p
show dbs
use ecommerce
db.products.find();
如果您尝试插入/更新/删除文档,则会收到异常。
向用户添加新角色
现在,让我们看看如何向用户添加新角色。 例如,我想让管理员拥有读写任何数据库的能力。 为此,我只需要向管理员用户添加角色readWriteAnyDatabase 。
> mongo admin -u admin -p
db.grantRolesToUser(
"admin",
[{ "role" : "readWriteAnyDatabase", "db" : "admin" }]
)
db.getUser("admin");
使用db.grantRolesToUser
命令,我已将该角色添加到admin用户中,并且使用db.getUser
我可以查看用户概要文件。
现在,管理员用户应该能够创建新的数据库,集合和文档,让我们尝试:
use hr
db.employees.insert({ "name":"John Doe", "hire_date" : new Date() });
db.organization.insert({ "name" : "Development" });
db.employees.findOne();
创建和使用自定义角色
围绕安全性经常使用的另一个功能与角色有关。 在某些情况下,您想为用户提供多个角色,例如:
- 数据库电子商务的所有权限
- 在数据库hr中读取集合员工
为此,您可以创建一个提供所有权限的角色,并将其分配给用户。 让我们使用管理员用户来完成。
use admin
var role = {
"role" : "webSiteManagerRole",
privileges : [
{
"resource": {"db" : "hr", "collection" : "employees"},
"actions": ["find"]
}
],
"roles" : [
{
"role" : "readWrite",
"db" : "ecommerce"
}
]
}
db.createRole( role );
var user = {
"user" : "master",
"pwd" : "abc123",
roles : [
{
"role" : "webSiteManagerRole",
"db" : "admin"
}
]
}
db.createUser(user);
exit
如果您现在与用户“ master”建立连接,您将看到该用户:
- 可以在电子商务数据库中做任何您想做的事
- 只能在此阅读“ hr.employees”集合
- 无能为力
角色和特权
如上一节所述,您可以创建角色,并为这些角色分配特权。 这非常强大,您可以真正控制数据库上的每个操作。 我邀请您详细了解内置角色和特权,这将帮助您在选择适合您的应用程序的过程中大有帮助:
结论
在这篇博客中,我Swift解释了如何:
- 使用MongoDB身份验证
- 建立使用者
- 为用户分配角色和权限。
有趣的是,我在shell中向您展示的所有内容都可以通过MMS中的用户界面完成
翻译自: https://www.javacodegeeks.com/2015/02/introduction-mongodb-security.html