如何保护 MongoDB 实例?

信息安全 数据库 硬化 mongodb nosql
2021-08-28 04:42:45

有人有保护/加固 MongoDB 服务器的经验吗?欢迎检查清单或指南。

3个回答

NoSQL 数据库相对较新(尽管可以说是一个旧概念),我还没有看到任何特定的 MongoDB 强化指南和我经常查看的地方(CISSecurity、供应商出版物、Sans 等都不足)。建议对于组织、大学生、信息安全社区来说,编写并维护它是一个很好的项目。

Mongodb.org 中有一些基本信息。应遵循此处的所有步骤,包括启用安全性。该站点本身声明 MongoDB 仅具有非常基本的安全级别。 http://www.mongodb.org/display/DOCS/Security+and+Authentication

MongoDB 和其他 NoSQL 数据库的功能也比成熟的 SQL 数据库少很多(尤其是安全性),因此您不太可能找到细粒度的权限或数据加密,它使用 MD5 以用户名作为种子进行密码散列。还有一些限制,例如在 1.9.1 版本之前无法通过分片进行身份验证,因此始终执行风险评估并构建威胁模型来确定您的安全需求和面临的威胁是个好主意。基于此输出,MongoDB 或 NoSQL 数据库通常可能不适合您的需求,或者您可能需要以不同的方式使用它,以最大限度地发挥其优势并最大限度地减少其弱点(例如,用于数据提取而不是您最敏感的信息,

也就是说,我坚信安全原则与技术无关。如果您分析最新的攻击,以及 datalossdb.org 上的一个很好的列表,那么令人惊讶的是还有多少与默认密码和缺少的补丁有关。如果您遵循以下做法,纵深防御应该有足​​够的安全性来保护大多数资产(例如个人、商业),可能不是军事资产。

数据库加固原则:

  • 身份验证 - 需要身份验证,对于管理员或特权用户,如果可能有两个因素(在平台级别或通过网络设备执行此操作,因为数据库本身不支持它)。如果可能,使用基于密钥的身份验证来避免使用密码。
  • 授权 - 所需帐户数量最少,所需权限最少,支持只读帐户,因此请使用它们。由于不存在细粒度访问控制,请使用替代方法,例如数据库前面的 Web 服务,其中包含业务逻辑,包括访问控制规则或应用程序内。最小化 Mongodb 在平台上运行的权限,例如不应该作为 root 运行。
  • 默认和系统帐户 - 更改所有默认帐户的密码,删除/锁定/禁用您可以删除的内容,尽可能禁用登录。
  • 日志记录和监控 - 启用日志记录并将其导出到中央监控系统。为您的监控人员定义特定的警报和调查程序
  • 输入验证 - NoSQL 数据库仍然容易受到注入攻击,因此只有通过它验证已知的良好输入,在应用程序框架中使用参数化,所有将不可信输入传递到数据库的良好实践都是必需的
  • 加密 - 取决于数据的敏感性,因为您无法在数据库级别加密,因此需要在应用程序层加密或散列任何敏感数据。传输加密也通过网络层(例如 VPN)。
  • 最小化服务并更改默认监听端口
  • 删除任何样本或测试数据库
  • 建立补丁管理流程以及时识别、评估和安装所有相关的安全补丁
  • 强化平台和虚拟化平台(如果使用)
  • 配置适当的网络控制,例如防火墙、VLAN 以最大限度地减少对数据库的访问、上游拒绝服务过滤服务、完全合格的 DNS、单独的生产和非生产数据库
  • 物理安全环境
  • 有一个变更管理流程

要记住的一些非常初始的事情是:

  • 将 IP 绑定从全部删除到仅 IP(私有或本地主机),您希望获得连接请求
  • 更改默认端口绑定
  • 仅授予所需的权限(例如没有更新/删除权限来选择查询用户)
  • 为所需的主从连接设置 ssh 密钥,消除密码的参与
  • 你甚至可以为你的应用程序和 mongodb 之间的连接设置一个加密隧道

实际上它们适用于所有数据存储服务

PS:非常有限的mongodb经验

这是 MongoDB 安全性的清单

启用身份验证 - 即使您已将 Mongodb 服务器部署在受信任的网络中,启用身份验证也是一种很好的安全实践。如果您的网络受到威胁,它会为您提供“深度防御”。编辑您的 mongod 配置文件以启用身份验证

不要将您的生产数据库暴露在互联网上——限制对数据库的物理访问是安全性的一个重要方面。如果没有必要,请不要将您的生产数据库公开到 Internet。如果攻击者无法物理连接到您的 MongoDB 服务器,则您的数据会更加安全。如果您在 AWS 上,您可以将您的数据库放在 VPC 私有子网中。阅读博文在 VPC 中部署 MongoDB 以了解更多信息。

使用防火墙——使用防火墙来限制允许哪些其他实体连接到您的 mongodb 服务器。最佳实践是只允许您的应用程序服务器访问数据库。如果您托管在 AWS 上,请使用“安全组”来限制访问。如果您托管在不支持防火墙结构的提供商上,您可以使用“iptables”轻松地自己配置它。请参阅 mongodb 文档为您的场景配置 iptables。

使用密钥文件设置副本集 - 指定共享密钥文件以启用副本集中 mongodb 实例之间的通信。要启用此功能,请将 keyfile 参数添加到配置文件中,如下所示。该文件的内容需要在所有机器上都相同。

禁用 HTTP 状态接口 Mongodb 默认提供一个 http 接口,默认在 28017 端口上运行,该接口提供“主页”状态页面。不建议将此接口用于生产用途,最好禁用。使用“nohttpinterface”配置设置禁用 http 接口。

禁用 REST 接口 Monogdb REST 接口不建议用于生产。它不支持任何身份验证。默认情况下它是关闭的。如果您已使用“rest”配置选项将其打开,则应在生产系统中将其关闭。

配置 Bind_ip 如果你的系统有多个网络接口,你可以使用“bind_ip”选项来限制你的 mongodb 服务器只监听相关的接口。默认情况下,mongodb 将绑定到所有接口

启用 SSL – 如果您不使用 SSL,您的数据在 Mongo 客户端和 Mongo 服务器之间传输时未加密,并且容易受到窃听、篡改和“中间人”攻击。如果您通过 Internet 等不安全的网络连接到 Mongodb 服务器,这一点尤其重要。

基于角色的授权——MongoDB 支持基于角色的身份验证,让您可以对每个用户可以执行的操作进行细粒度控制。使用基于角色的结构来限制访问,而不是让所有用户成为管理员。有关更多详细信息,请参阅角色文档。

Enterprise mongodb & Kerberos Enterprise mongodb 与 Kerberos 集成以进行身份​​验证。有关详细信息,请参阅 mongodb 文档。用户名/密码系统本质上是不安全的——如果可能的话,使用基于限制的身份验证。

https://scalegrid.io/blog/10-tips-to-improve-your-mongodb-security/

免责声明:我是 scalegrid.io 的创始人

此外,正如其他评论所指出的那样,我建议您还加密您的 mongodb 数据。您可以使用 LUKS(Linux 统一密钥设置)来设置卷级加密。