该系列的一部分:
MongoDB 安全性:确保数据安全的最佳实践
MongoDB,也称为Mongo,是许多现代 Web 应用程序中使用的文档数据库。与任何数据库管理系统一样,负责管理 Mongo 数据库的人员必须遵守推荐的安全最佳实践,以防止数据在发生灾难时丢失并防止其落入恶意行为者之手。
本系列概念文章对 MongoDB 的内置安全功能进行了高级概述,同时还重点介绍了一些通用的数据库安全最佳实践。
加密是将一条信息从明文(信息的原始形式)转换为密文的过程,密文是一种不可读的形式,只能由具有正确密码来解密的人或计算机读取。如果恶意行为者要拦截一段加密数据,他们将无法读取它,直到他们能够解密它。
您可以通过将 MongoDB 实例配置为需要使用传输层安全性(也称为TLS)的连接来加密您的 MongoDB 实例与任何需要访问它的客户端或应用程序之间的通信。与它的前身安全套接字层(SSL) 一样,TLS 是一种加密协议,它使用基于证书的身份验证对通过网络传输的数据进行加密。
请注意,TLS 仅在数据通过网络移动时对其进行加密,也称为传输中的数据。即使您已将 Mongo 配置为要求使用 TLS 建立连接,存储在数据库服务器上的静态数据(称为data at rest)仍将是未加密的。使用 MongoDB 的免费社区版无法加密静态数据,但使用 Mongo 基于付费订阅的企业版可以。
但是,即使启用了静态加密和传输中加密,您的敏感数据仍有可能被未经批准的用户访问。例如,考虑一个场景,您部署了一个分片 NoSQL 文档数据库来存储您开发的冰淇淋交付应用程序的数据。数据库管理系统允许您加密静态数据(您启用该功能),并且您还可以将其配置为要求在分片以及任何客户端之间进行加密的 TLS 连接。
在此示例情况下,当客户下订单时,他们被要求提交一些敏感信息,例如他们的家庭住址或信用卡号。然后应用程序将此信息写入数据库的文档中,如下所示:
{
"name" : "Sammy Shark",
"address" : {
"street" : "602 Surf Ave",
"city" : "Brooklyn",
"state" : "New York",
"zip" : 11224
},
"phone" : "555-555-1234",
"creditcard" : "1234567890123456"
}
这是一个潜在的安全漏洞,因为任何有权访问数据库的人都可以看到并利用您客户的敏感信息。
为了帮助减轻这种风险,从4.2版开始,官方 MongoDB 驱动程序允许您执行客户端字段级加密。这意味着,如果配置正确,应用程序可以在将数据发送到数据库之前加密文档中的某些字段。将数据写入数据库后,只有能够提供正确加密密钥的应用程序或客户端才能解密和读取这些字段中的数据。否则,数据文件将类似于此,假设street
,city
,zip
,phone
,和creditcard
字段已在客户的身边加密:
{
"name" : "Sammy Shark",
"address" : {
"street" : BinData(6,"eirefi3eid5feiZae9t+oot0noh9oovoch3=iethoh9t"),
"city" : BinData(6,"xiesoh+aiveez=ngee1yei+u0aijah2eeKu7jeeB=oGh"),
"state" : "New York"
"zip" : BinData(6,"CoYeve+ziemaehai=io1Iliehoh6rei2+oo5eic0aeCh")
},
"phone" : BinData6,"quas+eG4chuolau6ahq=i8ahqui0otaek7phe+Miexoo"),
"creditcard" : BinData6,"rau0Teez=iju4As9Eeyiu+h4coht=ukae8ahFah4aRo="),
}
MongoDB 将加密值存储为二进制数据,如上BinData
一个示例中的类标签所示。的6
每个值代表二进制亚型,其中数据被存储,并且表明其中一个已经编码的二进制数据。使用 Mongo 的客户端字段级加密加密的值始终使用 subtype 6
。