Docs 菜单

Atlas 数据加密指导

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

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

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

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

静态加密可确保磁盘上的所有数据都经过加密,并且只有在由授权进程或应用程序解密后才可见。在Atlas中,客户数据会使用 AES-256 自动进行静态加密。此进程利用云提供商的磁盘加密,由提供商管理加密密钥。无法禁用此进程。

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

此外,您还可以通过使用KMS (KMS)(例如Amazon Web Services KMS、 Google Cloud Platform KMS或Azure Key Vault )自带客户管理的密钥 ( 集合扫描 ) 来启用数据库级加密。 此功能提供文件级加密,相当于透明数据加密 (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白皮书。

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

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

预配集群时请考虑以下安全建议。

您可以使用项目级别的客户密钥管理来启用加密。启用后,该设置会自动应用于项目中创建的所有集群,从而确保在整个环境中提供一致的数据保护。我们建议您使用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,以及使用客户密钥管理加密以提高安全性。

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

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

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