MongoDB安全性简介

上周在巴黎MUG上,我快速讨论了有关安全性和MongoDB的问题,并且决定创建这篇文章,说明如何配置MongoDB中可用的现成安全性。

您可以在以下文档章节中找到有关MongoDB安全性的所有信息:



密码

在本文中, 我不会详细介绍如何在安全的环境(DMZ / Network / IP / Location /…)中部署数据库。我将重点介绍身份验证授权 ,并为您提供保护访问安全的步骤。到您的数据库和数据。 我不得不提到,默认情况下,在安装和启动MongoDB时,不会启用安全性。 只是为了使其更易于使用。 安全性的第一部分是身份验证 ,您在此处有多种选择。 让我们关注“ MONGODB-CR”机制。

第二部分是授权 ,选择用户连接到数据库后可以做什么或不能做什么。 有关授权的文档可在此处获得

现在让我们记录操作方法:

  1. 创建一个管理员用户
  2. 创建应用程序用户

对于每种类型的用户,我将展示如何授予特定权限。

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.创建管理员用户

首先是创建一个管理员用户,该用户也可以创建用户,因此我们必须:

  1. 去蒙戈壳
  2. 连接到`admin'数据库
  3. 创建一个用户并为其分配角色userAdminAnyDatabase
use admin

var user = {
    "user" : "admin",
    "pwd" : "manager",
    roles : [
        {
            "role" : "userAdminAnyDatabase",
            "db" : "admin"
        }
    ]
}

db.createUser(user);

exit

现在,您已经在使用--auth运行的MongoDB中创建了一个用户,匿名连接将无法对数据库执行任何操作。

例如,您可以测试执行show dbsdb.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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值