MongoDB数据库安全

2020-04-23  本文已影响0人  且须文雅

前言: 此文为MongoDB官方文档翻译中文版,查看原文

MongoDB提供各种功能,如身份验证、访问控制、加密,以保护MongoDB部署的安全。一些关键的安全特性包括以下内容:

  1. 身份验证
    身份验证
    SCRAM
    x.509

  2. 授权
    基于角色的访问控制RBAC
    启用访问控制
    管理用户和角色

  3. TLS/SSL
    TLS/SSL(传输加密)
    给mongod和mongos配置TLS/SSL(原文:Configure mongod and mongos for TLS/SSL)
    客户端的TLS/SSL配置

  4. 企业功能
    Kerberos 身份验证
    LDAP 代理身份验证
    静止加密
    审计

  5. 加密
    客户端字段级加密

安全检查列表

原文最后更新时间:2019-12-05
MongoDB还提供了一个安全检查表,其中列出了保护MongoDB部署的建议操作。

这里文档提供了一个安全措施列表,您应该实现这些措施来保护您的MongoDB安装。这份清单并不详尽。

生产前检查表及注意事项

提示:
用户可以在不同的数据库中拥有权限。如果用户需要对多个数据库的权限,请使用授予适用数据库权限的角色创建单个用户,而不是在不同的数据库中多次创建该用户。

去了解一下 RBAC管理用户和角色

系统 TLS/SSL库
Windows Secure Channel(Schannel)
Linux/BSD OpenSSL
macOS Secure Transport

注:从4.0版本开始,MongoDB 停止支持在系统上的 TLS 1.0 加密,只支持TLS1.1以上版本。查看禁用TLS1.0

注:
从MongoDB 3.6、MongoDB二进制文件、mongod和mongos开始,默认情况下绑定到localhost。从MongoDB版本2.6到3.4,默认情况下只有官方MongoDB RPM(Red Hat、CentOS、Fedora Linux和衍生物)和DEB(Debian、Ubuntu和衍生物)包中的二进制文件绑定到本地主机。要了解有关此更改的详细信息,请参阅本地主机绑定兼容性更改
参阅:

禁用直接SSH根访问。

参阅:网络和配置强化

定期/持续生产检查

定期检查MongoDB产品CVE并升级产品。
请参阅MongoDB的终止日期并升级MongoDB安装。一般来说,尽量保持最新版本。
确保信息安全管理系统策略和过程扩展到MongoDB安装,包括执行以下操作:

  1. 定期对您的计算机应用修补程序并查看指导原则。
  2. 检查策略/过程更改,特别是对网络规则的更改,以防止MongoDB无意中暴露在Internet上。
  3. 检查MongoDB数据库用户并定期轮换他们。

启用访问控制

内容概要

概述

在MongoDB部署上启用访问控制将强制进行身份验证,要求用户标识自己。当访问启用了访问控制的MongoDB部署时,用户只能执行由其角色确定的操作。
下面的教程在独立的mongod实例上启用访问控制,并使用默认的身份验证机制。有关所有支持的身份验证机制,请参阅身份验证机制。

用户管理员

启用访问控制后,请确保在管理数据库中有一个具有userAdminuserAdminAnyDatabase角色的用户。此用户可以管理用户和角色,例如:创建用户、授予或撤消用户的角色,以及创建或修改自定义角色。

程序

以下过程首先将用户管理员添加到不带访问控制的MongoDB实例中,然后启用访问控制。

注:
示例MongoDB实例使用端口27017和数据目录/var/lib/MongoDB目录。本例假设存在数据目录/var/lib/mongodb。根据需要指定其他数据目录。

  1. 在没有访问控制的情况下启动MongoDB。
    启动一个没有访问控制的独立mongod实例。
    例如,打开一个终端并发出以下命令:
    mongod --port 27017 --dbpath /var/lib/mongodb

  2. 连接到实例
    例如,打开一个新终端并将mongo shell连接到实例:
    mongo --port 27017
    根据需要指定其他命令行选项以将mongo shell连接到部署,例如--host

  3. 创建用户管理员
    从mongo shell中,在管理数据库中添加一个具有userAdminAnyDatabase角色的用户。包括此用户所需的其他角色。例如,下面在管理数据库中创建用户myUserAdmin,该用户具有userAdminAnyDatabase角色和readWriteAnyDatabase角色。

注:
从MongoShell的4.2版开始,您可以用passwordPrompt()方法与各种用户身份验证/管理方法/命令结合使用来提示输入密码,而不是直接在方法/命令调用中指定密码。但是,您仍然可以直接指定密码,就像在mongo shell的早期版本中那样。

use admin
db.createUser(
  {
    user: "myUserAdmin",
    pwd: passwordPrompt(), // or cleartext password
    roles: [ { role: "userAdminAnyDatabase", db: "admin" }, "readWriteAnyDatabase" ]
  }
)

注:
创建用户的数据库(在本例中为admin)是用户的身份验证数据库。尽管用户将对此数据库进行身份验证,但用户可以在其他数据库中具有角色;即,用户的身份验证数据库不限制用户的权限。

  1. 使用访问控制重新启动MongoDB实例
    a. 关闭mongod实例。例如,从mongo shell发出以下命令:
    db.adminCommand( { shutdown: 1 } )
    b. 退出 mongo shell
    c. 在启用访问控制的情况下启动mongod。
    • 如果从命令行启动mongod,请添加--auth命令行选项:
      mongod --auth --port 27017 --dbpath /var/lib/mongodb
    • 如果使用配置文件启动mongod,请添加security.authorization配置文件设置:
      security:
        authorization: enabled
      

连接到此实例的客户端现在必须将自己验证为MongoDB用户。客户端只能执行由其分配的角色确定的操作。

  1. 连接并作为用户管理员进行身份验证。
    使用mongo shell,您可以:

    • 通过传入用户凭据与身份验证连接
    • 先连接而不进行身份验证,然后发出db.auth()方法进行身份验证
    1. 连接时验证
      使用-u<username>-p--authenticationDatabase<database>命令行选项启动mongo shell:
      mongo --port 27017 --authenticationDatabase "admin" -u "myUserAdmin" -p
      提示时输入密码。
    2. 连接后验证
      将mongo shell连接到mongod:
      mongo --port 27017
      在mongo shell中,切换到身份验证数据库(在本例中为admin),并使用db.auth(<username>,<pwd>)方法进行身份验证:
      use admin
      db.auth("myUserAdmin", passwordPrompt()) // 或者直接在第二个字段中传入密码
      

    在提示时输入密码。

    注:
    从MongoShell的4.2版开始,您可以将passwordPrompt()方法与各种用户身份验证/管理方法/命令结合使用来提示输入密码,而不是直接在方法/命令调用中指定密码。但是,您仍然可以直接指定密码,就像在mongo shell的早期版本中那样。

  2. 根据部署需要创建其他用户
    身份验证成为用户管理员后,使用db.createUser()方法创建其他用户。可以将任何内置角色或用户自定义角色分配给用户。
    以下操作将用户myTester添加到test数据库中,该用户在测试数据库中具有readWrite角色,在reporting数据库中也具有read角色。

    use test
    db.createUser(
      {
        user: "myTester",
        pwd: passwordPrompt(),
        roles: [
          { role: "readWrite", db: "test" },
          { role: "read", db: "reporting" }
        ]
      }
    )
    

    注:
    创建用户的数据库(在本例中为test)是该用户的身份验证数据库。尽管用户将对此数据库进行身份验证,但用户可以在其他数据库中具有角色;即,用户的身份验证数据库不限制用户的权限。

    创建其他用户后,断开mongo shell的连接。

  3. 连接到实例并验证为myTester。
    myUserAdmin的身份断开mongo shell后,以myTester的身份重新连接。
    操作与第5步类似,在这里就不重复赘述了。

  4. myTester用户参入一个文档
    作为myTester,您有权在test数据库中执行读写操作(以及在reporting数据库中执行读操作)。一旦认证为myTester,就将文档插入到test数据库的集合中。例如,可以在test数据库中执行以下插入操作:

    db.foo.insert({ x: 1, y: 1 })
    

    另见:管理用户和角色

其他注意事项

副本集和分片群集

启用访问控制时,副本集和分片群集需要成员之间的内部身份验证。有关详细信息,请参阅内部/成员身份验证

本地主机异常

您可以在启用访问控制之前或之后创建用户。如果在创建任何用户之前启用访问控制,MongoDB会提供一个本地主机异常,允许您在管理数据库中创建用户管理员。创建后,必须作为用户管理员进行身份验证,以便根据需要创建其他用户。

上一篇 下一篇

猜你喜欢

热点阅读