Docs 菜单
Docs 主页
/ /
Atlas 架构中心
/

Atlas 数据加密指导

Atlas 提供多种加密功能,可在传输、静止和使用过程中保护数据,从而在整个生命周期内保障数据安全。

传输加密可在客户端和服务器之间的传输过程中保护数据,确保您的数据在传输过程中不会被检查。在Atlas中,流向集群的所有网络流量均受传输层安全性 (TLS) 保护,该默认启用且无法禁用。使用 TLS 对传输到节点和节点之间的数据加密,确保整个通信的安全。

您可以选择在Atlas中使用的 TLS 版本。TLS 1.2 和最小密钥长度 128 位是建议的默认设置。OpenSSL FIPS 对象模块支持所有传输中加密。

该图显示了客户端应用程序和MongoDB Atlas之间使用 TLS 进行的传输加密。
点击放大

静态加密确保磁盘上的所有数据都被加密,并且只有在由授权的进程或应用程序解密后才可见。

在 Atlas 中,客户数据会自动使用 AES-256 进行静态加密。该流程利用云提供商的磁盘加密,由提供商管理加密密钥。此过程无法禁用。

默认情况下,静态加密是基于卷的加密。

此外,您还可以通过自带密钥 (BYOK) 启用数据库级别的加密。这是您通过 key management service (KMS)(如 AWS KMS、Google Cloud KMS 或 Azure Key Vault)添加的客户托管密钥 (CMK)。BYOK 功能提供文件级加密,相当于透明数据加密(TDE),满足企业 TDE 要求。使用客户数密钥管理增加了另一层安全性,以增强机密性和数据分段。

要学习;了解详情,请参阅 使用客户数密钥管理进行静态加密。

显示使用额外的客户托管密钥静态加密的图像。
点击放大

正在使用的加密可在处理数据时确保数据安全。MongoDB 有两种正在使用的加密功能,可以满足您的数据保护需求:客户端字段级加密和 Queryable Encryption。

客户端字段级加密 (CSFLE) 是一种正在使用的加密功能,它使客户端应用程序能够在将敏感数据存储到MongoDB 数据库之前对其进行加密。敏感数据经过透明加密,在其整个生命周期中保持加密,并且仅在客户端端解密。

您可以选择性地对文档中的各个字段、文档中的多个字段或整个文档进行加密。您可以选择为每个字段使用自己的密钥进行保护,并通过 MongoDB 驱动程序在客户端无缝解密它们。CSFLE 使用经过身份验证的 CBC 模式下的 AES-256 来加密数据。

此外,您可以选择 随机加密,该加密不可查询,但出于某些安全要求可能是必需的。

下图演示了 CSFLE 工作流程,其中用户记录存储在MongoDB 数据库中并由客户端查询。用户的社会安全号 (SSN) 在存储到数据库之前会被加密。当应用程序提交对该字段的基本相等查询时, MongoDB驾驶员使用密钥对客户端端的查询进行加密,并将加密的查询发送到服务器。服务器将加密的结果返回给客户端,客户端再对结果进行解密,然后将其作为可读明文返回给经过身份验证的客户端。

CSFLE 支持所有主要的云和本地部署密钥管理服务。

显示示例客户端字段级加密 (CSFLE) 工作流程的图像。
点击放大

Queryable Encryption 有助于组织在查询敏感数据时保护这些数据。与 CSFLE 类似,它允许应用程序在客户端加密数据,然后再将其存储到 MongoDB 数据库中。它还使应用程序能够使用加密搜索算法,直接对加密数据执行表达式查询,例如等值查询。Queryable Encryption 可确保对敏感信息的保护,而不会牺牲对敏感信息执行查询的能力。Queryable Encryption 始终使用非确定性加密。

要学习;了解Queryable Encryption中使用的算法,请参阅Queryable Encryption白皮书。

下图展示了一个 Queryable Encryption 工作流程,其中用户记录存储在 MongoDB 数据库中,并由客户端进行查询。用户的出生日期 (DOB) 会先加密,再存储到数据库中。当应用程序在字段上提交表达式范围查询时,MongoDB 驱动程序使用密钥加密查询,并将加密令牌与查询一起传递给 MongoDB 服务器。服务器使用加密的搜索算法来处理查询,而无需了解实际数据。最后,驱动程序使用密钥解密查询结果,并将查询结构作为可读明文形式返回给已认证的客户端。

显示示例 Queryable Encryption 工作流程的图像。
点击放大

仅适用于单区域部署的建议

单区域部署在数据加密方面没有特别的考虑。请参阅下一个部分中的“所有部署范式建议”。

仅适用于跨多个区域或多个云提供商部署的建议

在多区域和多云部署中,您可以通过自带客户托管密钥 (BYOK) 启用数据库级加密。

某些 KMS 提供商支持多区域功能。例如:

然而,如果发生影响已配置 KMS 终结点的区域性服务中断事件,Atlas 与 KMS 提供商的集成不会提供跨区域的 KMS 连接或访问机制的自动故障转移

如果配置的 KMS 提供商不可用,Atlas 会定期验证您的 KMS 配置。如果您的 KMS 提供商凭证失效或加密密钥被删除或禁用,Atlas 将在下一个计划的验证检查中关闭 mongodmongos 进程,并通过电子邮件通知您,状态将反映在 Atlas 用户界面中。

如果 Atlas 无法连接到您的密钥管理提供程序,则不会关闭您的进程。因此,如果由于区域问题导致对 KMS 的访问中断,集群可能会继续运行,直到您手动重新启动它或验证更严重地失败。

因此,如果 KMS 出现故障,您可以更改配置。要在多区域服务中断场景下恢复对加密密钥的访问,您必须手动更改 Atlas 中的配置,以指向其他可访问的 KMS 实例或配置。

如果您使用私有端点连接到 KMS,您必须从部署 Atlas 节点的每个区域建立一个私有端点连接到主节点 KMS。这是为了确保在定期检查和初始配置或密钥轮换期间配置仍然有效,每个节点需要访问存储在主节点 KMS 中的客户主密钥。

总之,Atlas 与 BYOK 提供商的静态加密集成不支持自动多区域故障转移,您需要手动更改配置。

以下建议适用于所有部署范式。

您可以使用项目级别的客户密钥管理来启用加密。启用后,该设置会自动应用于项目中创建的所有集群,从而确保在整个环境中提供一致的数据保护。我们建议您使用Amazon Web Services KMS、 Google Cloud Platform KMS或Azure Key Vault等KMS (KMS )。

对于暂存和生产环境,我们建议您在预配集群时使用客户密钥管理启用加密,避免依赖应用程序开发团队在日后进行配置。

对于开发和测试环境,请考虑使用客户密钥管理跳过加密,以节省成本。但是,如果您在Atlas中存储敏感数据(例如医疗保健或金融服务行业的数据),请考虑在开发和测试环境中也使用客户密钥管理来启用加密。

使用以下方法通过客户数密钥管理启用加密:

要了解如何在预配新的 Atlas 组织、项目和集群时使用客户密钥管理配置加密,请参阅自动化示例:Atlas 组织、项目和集群

在预配进程中,我们还建议评估数据中某些字段的敏感性并对它们进行分类,以确定哪些数据需要加密,以及对这些群组应用哪些全局限制。作为一般准则,除了遵循数据建模最佳实践之外,我们还建议您对所有敏感字段应用Queryable Encryption 。

以以下数据分类级别为点:

  • 公共数据:如果发生未经授权的数据泄露、更改或破坏,对公司几乎没有风险或没有风险的数据。虽然保密性不太重要,但您仍应应用授权控制,以防止未经授权的修改或销毁公共数据。

    示例:产品、手册、培训信息

  • 私有数据:如果发生未经授权的数据披露、篡改或破坏,这些数据会对公司构成中度风险。默认情况下,所有未明确归类为受限数据或公共数据的机构数据都应被视为私有数据。对任何包含私有数据(例如 PII)的字段应用 CSFLE 或 Queryable Encryption。

    示例:客户数信息、合同、产品成本

  • 受限数据:如果发生未经授权的数据泄露、更改或销毁,则会给公司带来重大风险的数据。对受限数据应用最高级别的安全控制,包括对所有字段进行 CSFLE 或Queryable Encryption,以及使用客户密钥管理加密以提高安全性。

    示例:收入信息、工资、安全风险

提示

有关在所有支柱上实施我们建议的 Terraform 示例,请参阅Github中的以下示例之一:

以下示例使用Atlas自动化工具通过客户密钥管理配置加密。

在使用客户密钥管理配置加密之前,您必须创建组织、项目和集群。要了解更多信息,请参阅自动化示例:Atlas 组织、项目和集群。

对于开发和测试环境,建议考虑不使用客户密钥管理的加密以节省成本,除非您处于高度监管的行业或需要存储敏感数据。要了解更多信息,请参阅 Atlas 组织、项目和集群建议

要使用 Terraform 启用客户密钥管理的加密功能,请创建以下资源。更改 ID 和名称以使用您自己的值:

提示

有关完整的配置示例,请参阅Atlas Terraform 提供程序示例。

或者,为了简化配置进程,您可以使用 Terraform 模块的静态加密。

resource "mongodbatlas_cloud_provider_access_setup" "setup_only" {
project_id = var.atlas_project_id
provider_name = "AWS"
}
resource "mongodbatlas_cloud_provider_access_authorization" "auth_role" {
project_id = var.atlas_project_id
role_id = mongodbatlas_cloud_provider_access_setup.setup_only.role_id
aws {
iam_assumed_role_arn = aws_iam_role.test_role.arn
}
}
resource "mongodbatlas_encryption_at_rest" "test" {
project_id = var.atlas_project_id
aws_kms_config {
enabled = true
customer_master_key_id = aws_kms_key.kms_key.id
region = var.atlas_region
role_id = mongodbatlas_cloud_provider_access_authorization.auth_role.role_id
}
}
data "mongodbatlas_encryption_at_rest" "test" {
project_id = mongodbatlas_encryption_at_rest.test.project_id
}
output "is_aws_kms_encryption_at_rest_valid" {
value = data.mongodbatlas_encryption_at_rest.test.aws_kms_config.valid
}

提示

有关完整的配置示例,请参阅Atlas Terraform 提供程序示例。

resource "mongodbatlas_encryption_at_rest" "test" {
project_id = var.atlas_project_id
azure_key_vault_config {
enabled = true
azure_environment = "AZURE"
tenant_id = var.azure_tenant_id
subscription_id = var.azure_subscription_id
client_id = var.azure_client_id
secret = var.azure_client_secret
resource_group_name = var.azure_resource_group_name
key_vault_name = var.azure_key_vault_name
key_identifier = var.azure_key_identifier
}
}
data "mongodbatlas_encryption_at_rest" "test" {
project_id = mongodbatlas_encryption_at_rest.test.project_id
}
output "is_azure_encryption_at_rest_valid" {
value = data.mongodbatlas_encryption_at_rest.test.azure_key_vault_config.valid
}
resource "mongodbatlas_encryption_at_rest" "test" {
project_id = var.atlas_project_id
google_cloud_kms_config {
enabled = true
service_account_key = "{\"type\": \"service_account\",\"project_id\": \"my-project-common-0\",\"private_key_id\": \"e120598ea4f88249469fcdd75a9a785c1bb3\",\"private_key\": \"-----BEGIN PRIVATE KEY-----\\nMIIEuwIBA(truncated)SfecnS0mT94D9\\n-----END PRIVATE KEY-----\\n\",\"client_email\": \"my-email-kms-0@my-project-common-0.iam.gserviceaccount.com\",\"client_id\": \"10180967717292066\",\"auth_uri\": \"https://accounts.google.com/o/oauth2/auth\",\"token_uri\": \"https://accounts.google.com/o/oauth2/token\",\"auth_provider_x509_cert_url\": \"https://www.googleapis.com/oauth2/v1/certs\",\"client_x509_cert_url\": \"https://www.googleapis.com/robot/v1/metadata/x509/my-email-kms-0%40my-project-common-0.iam.gserviceaccount.com\"}"
key_version_resource_id = "projects/my-project-common-0/locations/us-east4/keyRings/my-key-ring-0/cryptoKeys/my-key-0/cryptoKeyVersions/1"
}
}

有关此示例的更多配置选项和信息,请参阅Terraform 文档。

对于预发布和生产环境,我们建议您在预配集群时启用客户密钥管理的加密功能。如需了解更多信息,请参阅 Atlas 组织、项目和集群建议

要使用 Terraform 启用客户密钥管理的加密功能,请创建以下资源。更改 ID 和名称以使用您自己的值:

提示

有关完整的配置示例,请参阅Atlas Terraform 提供程序示例。

或者,为了简化配置进程,您可以使用 Terraform 模块的静态加密。

resource "mongodbatlas_cloud_provider_access_setup" "setup_only" {
project_id = var.atlas_project_id
provider_name = "AWS"
}
resource "mongodbatlas_cloud_provider_access_authorization" "auth_role" {
project_id = var.atlas_project_id
role_id = mongodbatlas_cloud_provider_access_setup.setup_only.role_id
aws {
iam_assumed_role_arn = aws_iam_role.test_role.arn
}
}
resource "mongodbatlas_encryption_at_rest" "test" {
project_id = var.atlas_project_id
aws_kms_config {
enabled = true
customer_master_key_id = aws_kms_key.kms_key.id
region = var.atlas_region
role_id = mongodbatlas_cloud_provider_access_authorization.auth_role.role_id
}
}
data "mongodbatlas_encryption_at_rest" "test" {
project_id = mongodbatlas_encryption_at_rest.test.project_id
}
output "is_aws_kms_encryption_at_rest_valid" {
value = data.mongodbatlas_encryption_at_rest.test.aws_kms_config.valid
}

提示

有关完整的配置示例,请参阅Atlas Terraform 提供程序示例。

resource "mongodbatlas_encryption_at_rest" "test" {
project_id = var.atlas_project_id
azure_key_vault_config {
enabled = true
azure_environment = "AZURE"
tenant_id = var.azure_tenant_id
subscription_id = var.azure_subscription_id
client_id = var.azure_client_id
secret = var.azure_client_secret
resource_group_name = var.azure_resource_group_name
key_vault_name = var.azure_key_vault_name
key_identifier = var.azure_key_identifier
}
}
data "mongodbatlas_encryption_at_rest" "test" {
project_id = mongodbatlas_encryption_at_rest.test.project_id
}
output "is_azure_encryption_at_rest_valid" {
value = data.mongodbatlas_encryption_at_rest.test.azure_key_vault_config.valid
}
resource "mongodbatlas_encryption_at_rest" "test" {
project_id = var.atlas_project_id
google_cloud_kms_config {
enabled = true
service_account_key = "{\"type\": \"service_account\",\"project_id\": \"my-project-common-0\",\"private_key_id\": \"e120598ea4f88249469fcdd75a9a785c1bb3\",\"private_key\": \"-----BEGIN PRIVATE KEY-----\\nMIIEuwIBA(truncated)SfecnS0mT94D9\\n-----END PRIVATE KEY-----\\n\",\"client_email\": \"my-email-kms-0@my-project-common-0.iam.gserviceaccount.com\",\"client_id\": \"10180967717292066\",\"auth_uri\": \"https://accounts.google.com/o/oauth2/auth\",\"token_uri\": \"https://accounts.google.com/o/oauth2/token\",\"auth_provider_x509_cert_url\": \"https://www.googleapis.com/oauth2/v1/certs\",\"client_x509_cert_url\": \"https://www.googleapis.com/robot/v1/metadata/x509/my-email-kms-0%40my-project-common-0.iam.gserviceaccount.com\"}"
key_version_resource_id = "projects/my-project-common-0/locations/us-east4/keyRings/my-key-ring-0/cryptoKeys/my-key-0/cryptoKeyVersions/1"
}
}

有关此示例的更多配置选项和信息,请参阅Terraform 文档。

后退

Auth 示例

在此页面上