前言: 此文为MongoDB官方文档翻译中文版,查看原文。
MongoDB提供各种功能,如身份验证、访问控制、加密,以保护MongoDB部署的安全。一些关键的安全特性包括以下内容:
-
身份验证
身份验证
SCRAM
x.509 -
授权
基于角色的访问控制RBAC
启用访问控制
管理用户和角色 -
TLS/SSL
TLS/SSL(传输加密)
给mongod和mongos配置TLS/SSL(原文:Configure mongod and mongos for TLS/SSL)
客户端的TLS/SSL配置 -
企业功能
Kerberos 身份验证
LDAP 代理身份验证
静止加密
审计 -
加密
客户端字段级加密
安全检查列表
原文最后更新时间:2019-12-05
MongoDB还提供了一个安全检查表,其中列出了保护MongoDB部署的建议操作。
这里文档提供了一个安全措施列表,您应该实现这些措施来保护您的MongoDB安装。这份清单并不详尽。
生产前检查表及注意事项
-
启用访问控制并强制验证
启用访问控制并指定身份验证机制。您可以使用MongoDB的SCRAM或x.509身份验证机制,或者与您现有的Kerberos/LDAP基础设施集成。身份验证要求所有客户端和服务器在连接到系统之前提供有效凭据。
请转到《MongoDB身份验证》和“启用访问控制”说明中了解详情。 -
配置 RBAC
首先创建一个管理员用户,然后创建其他用户。为访问系统的每个人或应用创建一个唯一的MongoDB用户。
遵循最小特权原则。创建定义一组用户所需的确切访问权限的角色。然后创建用户并仅为他们分配执行操作所需的角色。用户可以是个人或客户端应用程序。
提示:
用户可以在不同的数据库中拥有权限。如果用户需要对多个数据库的权限,请使用授予适用数据库权限的角色创建单个用户,而不是在不同的数据库中多次创建该用户。
-
加密通信(TLS/SSL)
将MongoDB配置为对所有传入和传出连接使用TLS/SSL。使用TLS/SSL加密MongoDB部署的mongod和mongos组件之间以及所有应用程序和MongoDB之间的通信。
从版本4.0开始,MongoDB使用本机TLS/SSL OS库:
系统 | TLS/SSL库 |
---|---|
Windows | Secure Channel(Schannel) |
Linux/BSD | OpenSSL |
macOS | Secure Transport |
注:从4.0版本开始,MongoDB 停止支持在系统上的 TLS 1.0 加密,只支持TLS1.1以上版本。查看禁用TLS1.0。
-
加密并保护数据
从MongoDB Enterprise 3.2开始,您可以使用WiredTiger存储引擎的本机加密对存储层中的数据进行加密。
如果您不使用WiredTiger的加密,MongoDB数据应该在每个主机上使用文件系统、设备或物理加密(例如dm crypt)进行加密。使用文件系统权限保护MongoDB数据。MongoDB数据包括数据文件、配置文件、审核日志和密钥文件。
将日志收集到中心日志存储区。这些日志包含数据库身份验证尝试,包括源IP地址。 -
限制网络曝光
确保MongoDB在受信任的网络环境中运行,并配置防火墙或安全组以控制MongoDB实例的入站和出站流量。
只允许受信任的客户端访问MongoDB实例可用的网络接口和端口。例如,使用IP白名单允许从受信任的IP地址进行访问(请参阅)
注:
从MongoDB 3.6、MongoDB二进制文件、mongod和mongos开始,默认情况下绑定到localhost。从MongoDB版本2.6到3.4,默认情况下只有官方MongoDB RPM(Red Hat、CentOS、Fedora Linux和衍生物)和DEB(Debian、Ubuntu和衍生物)包中的二进制文件绑定到本地主机。要了解有关此更改的详细信息,请参阅本地主机绑定兼容性更改。
参阅:
- 网络和配置强化
-
net.bindIp
配置设置 -
security.clusterIpSourceWhitelist
配置设置 - 用于指定每个用户IP白名单的身份验证限制
禁用直接SSH根访问。
-
审计系统活动
跟踪对数据库配置和数据的访问和更改。MongoDB Enterprise包括一个系统审核工具,可以记录MongoDB实例上的系统事件(例如用户操作、连接事件)。这些审计记录允许法医分析,并允许管理员验证适当的控制。您可以设置筛选器来记录特定事件,例如身份验证事件。
请参阅审核和配置审核。 -
使用专用用户运行MongoDB
使用专用操作系统用户帐户运行MongoDB进程。请确保帐户具有访问数据的权限,但没有不必要的权限。
有关运行MongoDB的详细信息,请参阅安装MongoDB。 -
使用安全配置选项运行MongoDB
MongoDB支持对某些服务器端操作执行JavaScript代码:mapReduce
和$where
。如果不使用这些操作,请在命令行上使用--noscripting
选项禁用服务器端脚本。
保持输入验证启用。默认情况下,MongoDB通过net.wireObjectCheck
设置启用输入验证。这确保mongod实例存储的所有文档都是有效的BSON。
参阅:网络和配置强化。
-
申请安全技术实施指南(如适用)
安全技术实施指南(STIG)包含美国国防部内部部署的安全指南。MongoDB Inc.应要求为需要的情况提供STIG。请索取一份副本以获取更多信息。 -
考虑遵守安全标准
对于需要符合HIPAA或PCI-DSS的应用程序,请参阅MongoDB安全参考体系结构,以了解有关如何使用密钥安全功能构建符合要求的应用程序基础结构的更多信息。
定期/持续生产检查
定期检查MongoDB产品CVE并升级产品。
请参阅MongoDB的终止日期并升级MongoDB安装。一般来说,尽量保持最新版本。
确保信息安全管理系统策略和过程扩展到MongoDB安装,包括执行以下操作:
- 定期对您的计算机应用修补程序并查看指导原则。
- 检查策略/过程更改,特别是对网络规则的更改,以防止MongoDB无意中暴露在Internet上。
- 检查MongoDB数据库用户并定期轮换他们。
启用访问控制
内容概要
- 概述
- 用户管理员
- 程序
- 其他注意事项
概述
在MongoDB部署上启用访问控制将强制进行身份验证,要求用户标识自己。当访问启用了访问控制的MongoDB部署时,用户只能执行由其角色确定的操作。
下面的教程在独立的mongod
实例上启用访问控制,并使用默认的身份验证机制。有关所有支持的身份验证机制,请参阅身份验证机制。
用户管理员
启用访问控制后,请确保在管理数据库中有一个具有userAdmin
或userAdminAnyDatabase
角色的用户。此用户可以管理用户和角色,例如:创建用户、授予或撤消用户的角色,以及创建或修改自定义角色。
程序
以下过程首先将用户管理员添加到不带访问控制的MongoDB实例中,然后启用访问控制。
注:
示例MongoDB实例使用端口27017和数据目录/var/lib/MongoDB目录。本例假设存在数据目录/var/lib/mongodb。根据需要指定其他数据目录。
-
在没有访问控制的情况下启动MongoDB。
启动一个没有访问控制的独立mongod实例。
例如,打开一个终端并发出以下命令:
mongod --port 27017 --dbpath /var/lib/mongodb
-
连接到实例
例如,打开一个新终端并将mongo shell连接到实例:
mongo --port 27017
根据需要指定其他命令行选项以将mongo shell连接到部署,例如--host
。 -
创建用户管理员
从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)是用户的身份验证数据库。尽管用户将对此数据库进行身份验证,但用户可以在其他数据库中具有角色;即,用户的身份验证数据库不限制用户的权限。
-
使用访问控制重新启动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
- 如果从命令行启动mongod,请添加
连接到此实例的客户端现在必须将自己验证为MongoDB用户。客户端只能执行由其分配的角色确定的操作。
-
连接并作为用户管理员进行身份验证。
使用mongo shell,您可以:- 通过传入用户凭据与身份验证连接
- 先连接而不进行身份验证,然后发出
db.auth()
方法进行身份验证
- 连接时验证
使用-u<username>
,-p
和--authenticationDatabase<database>
命令行选项启动mongo shell:
mongo --port 27017 --authenticationDatabase "admin" -u "myUserAdmin" -p
提示时输入密码。 - 连接后验证
将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的早期版本中那样。 -
根据部署需要创建其他用户
身份验证成为用户管理员后,使用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的连接。
-
连接到实例并验证为myTester。
以myUserAdmin
的身份断开mongo shell后,以myTester
的身份重新连接。
操作与第5步类似,在这里就不重复赘述了。 -
用
myTester
用户参入一个文档
作为myTester
,您有权在test
数据库中执行读写操作(以及在reporting
数据库中执行读操作)。一旦认证为myTester
,就将文档插入到test
数据库的集合中。例如,可以在test
数据库中执行以下插入操作:db.foo.insert({ x: 1, y: 1 })
另见:管理用户和角色
其他注意事项
副本集和分片群集
启用访问控制时,副本集和分片群集需要成员之间的内部身份验证。有关详细信息,请参阅内部/成员身份验证。
本地主机异常
您可以在启用访问控制之前或之后创建用户。如果在创建任何用户之前启用访问控制,MongoDB会提供一个本地主机异常,允许您在管理数据库中创建用户管理员。创建后,必须作为用户管理员进行身份验证,以便根据需要创建其他用户。
网友评论