Docs 菜单
Docs 主页
/
MongoDB Atlas
/ /

通过 AWS KMS 管理客户密钥

在此页面上

  • 必需的访问权限
  • 通过 AWS KMS 启用客户托管密钥
  • 例子
  • 先决条件
  • 为项目的加密密钥启用基于角色的访问权限
  • 切换到基于角色的项目加密密钥访问权限
  • 为 Atlas 集群启用客户密钥管理
  • 轮换 AWS 客户主密钥
  • MongoDB 主密钥 - MongoDB 责任
  • 您的 AWS CMK - 您的责任
  • 步骤
  • 在停电期间重新配置 AWS KMS 地区
  • 步骤
  • 相关主题

注意

2021 年 1 月 26 日的发行版本开始,您必须使用 AWS IAM 角色 而不是 IAM 用户来管理对您的 AWS KMS 加密密钥的访问权限以进行客户密钥管理。

当您从 AWS IAM 用户转变为角色时,请确保您的新角色可以访问旧的 AWS 客户主密钥。

重要

无服务器实例中的不可用功能

无服务器实例目前不支持此功能。要了解详情,请参阅无服务器实例限制

您可以将 Atlas 项目配置为使用 AWS IAM 角色访问 AWS KMS 密钥以进行静态加密。为项目启用静态加密时,您可以使用现有角色或创建新角色。

本页介绍了如何在 Atlas 项目上为基于角色的访问权限配置客户密钥管理。

如果您尚未为新的或现有的 Atlas 项目启用静态加密,请按照为项目启用对加密密钥的基于角色的访问中的步骤为您的 Atlas 项目启用静态加密。如果您已经为 Atlas 项目启用了静态加密,并配置了对加密密钥的基于凭证的访问权限,请按照为项目切换到对加密密钥的基于角色的访问权限中的步骤,切换到对加密密钥的基于角色的访问权限。

您必须先为 Atlas 项目配置客户密钥管理,然后才能在该项目中的集群上启用它。

提示

另请参阅:

  • 设置统一 AWS 访问

要配置客户密钥管理,您必须拥有对项目的 Project Owner 访问权限。

拥有 Organization Owner 访问权限的用户必须将自己作为 Project Owner 添加到项目中。

Atlas 中的客户密钥管理遵循的是一种称为信封加密的流程此流程通过使用一个密钥加密另一个密钥来创建多层加密。为了启用客户密钥管理,Atlas 使用以下加密密钥:

Customer-Managed Key (CMK)

客户管理密钥是您在 AWS KMS 中创建、拥有和管理的加密密钥。您在 AWS KMS 中创建CMK,并在项目级别将其连接到 Atlas。要了解有关 AWS KMS 中使用的 CMK 的更多信息,请参阅 AWS KMS 文档

Atlas 仅使用此密钥来加密 MongoDB 主密钥。

MongoDB Master Key

Atlas 集群中的每个节点都会创建一个MongoDB主密钥。 MongoDB主密钥是MongoDB Server用于加密每数据库加密密钥的加密密钥。 Atlas在本地保存密钥的加密副本。

此密钥使用 CMK 加密,并对每个数据库的加密密钥进行加密。

Per-Database Encryption Key

Atlas 集群中的每个节点还会为集群中的每个数据库创建一个加密密钥。Atlas 使用这些密钥,通过 WiredTiger 读取和写入数据,WiredTiger 还对这些密钥进行加密和存储。

此密钥使用 MongoDB 主密钥加密。

下面是一个三节点副本集的加密层次结构。Atlas 使用 AWS KMS 中的 CMK 为集群中的每个节点加密唯一的 MongoDB 主密钥。每个节点还包含三个数据库,每个数据库都使用每个数据库唯一的加密密钥进行加密。当集群启动时,Atlas 使用 AWS KMS 中的客户主密钥解密 MongoDB 主密钥,并将其提供给 MongoDB Server。

注意

如果您撤销 Atlas 对客户主密钥的访问权限,Atlas 就会关闭集群中的节点,并且在您恢复对客户主密钥的访问权限之前,您无法访问数据。

使用 AWS KMS 和 Atlas 的 CMK 工作流程图
点击放大

要使用 AWS KMS 为 MongoDB 项目启用客户托管密钥,必须:

  • 使用 M10 或更大的集群。

  • 拥有对称 AWS KMS 密钥。如要了解如何创建密钥,请参阅 AWS 文档中的创建密钥

    注意

    为确保区域服务中断时的弹性,请将您的 KMS 密钥配置为多区域密钥。

    如要了解详情,请参阅在服务中断期间重新配置 AWS KMS 区域。

  • 具有足够特权的 AWS IAM 角色。Atlas 必须有权使用密钥执行以下操作:

    注意

    如果你希望将 AWS KMS 密钥与来自不同 AWS 账户的 AWS IAM 角色(而不是创建 AWS KMS 密钥的 IAM 角色)一起使用,请确保你拥有足够特权:

    • AWS KMS 密钥下添加密钥策略声明以包含外部 AWS 账户。

    • 为外部 AWS 帐户中的 IAM 角色添加 IAM 内联策略。

    有关 IAM 角色和客户主密钥的全面讨论,请参阅 AWS 文档

    确认上述特权后,您可以按照常规步骤在 Atlas 中配置 KMS 设置,但以下情况除外:

    • 您必须提供完整 ARN 用于 AWS KMS 密钥(例如 arn:aws:kms:eu-west-2:111122223333:key/12345678-1234-1234-1234-12345678),而不是主密钥 ID(例如 12345678-1234-1234-1234-12345678),在 AWS KMS 密钥 ID 字段中。

    如要了解如何创建 IAM 角色,请参阅 AWS 文档中的 IAM 角色。

    在启用了静态加密的项目中,Atlas 对所有集群都使用相同的 IAM 角色和 AWS KMS 密钥设置。

  • 如果 AWS KMS 配置需要,请允许Atlas IP 地址以及集群节点的公共 IP 地址或 DNS 主机名访问,以便 Atlas 可以与 KMS 通信。您必须在策略文档中配置 IP 地址条件操作符,将 IP 地址包含在托管的 IAM 角色策略中。如果节点 IP 地址发生变化,必须更新配置以避免连接中断。

1
  1. 如果尚未显示,请从导航栏上的 Organizations 菜单中选择包含项目的组织。

  2. 如果尚未显示,请从导航栏的 Projects 菜单中选择您的项目。

  3. 在侧边栏中,单击 Security 标题下的 Advanced

    显示“高级”页面。

2
3

要创建新的 AWS IAM 角色用于访问 AWS KMS 密钥进行静态加密,请按照使用 AWS CLI 创建新角色步骤进行操作。如果您要授权现有 AWS IAM 角色,请按照为现有角色添加信任关系步骤进行操作。

4

注意

该政策声明允许 MongoDB 的 AWS Principal 使用客户的 KMS 密钥进行加密和解密操作。Atlas Principal 不是秘密,适用于所有 Atlas 客户。这是一个限制严格、用途受限的 AWS 账户,除了 IAM 用户之外没有其他资源。政策声明中的 ExternalId 对于每个 Atlas 项目都是独一无二的,但这不是秘密。该 ExternalId 用于降低跨上下文 (困惑代理) 漏洞的可能性。Atlas 使用通用主体访问所有客户的密钥是 Amazon 推荐的一种访问模式,如此处所述。

静态加密的访问策略类似于以下内容:

{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"kms:Decrypt",
"kms:Encrypt",
"kms:DescribeKey"
],
"Resource": [
"arn:aws:kms:us-east-1:123456789012:key/12x345y6-7z89-0a12-3456-xyz123456789"
]
}
]
}
5
6
  1. AWS IAM role 下拉列表中选择要分配的角色。

  2. Customer Master Key ID 字段中指定加密密钥。

  3. 选择您的加密密钥的 AWS 区域。

1

使用 API 终端节点创建新的 AWS IAM 角色。Atlas 将使用此角色对您的 AWS 帐户进行身份验证。

保存返回的字段值 atlasAWSAccountArnatlasAssumedRoleExternalId,以便在下一步中使用。

2
  1. 登录 AWS 管理控制台。

  2. 导航至 Identity and Access Management (IAM) 服务。

  3. 从左侧导航栏中选择 Roles

  4. 单击角色列表中您希望用于 Atlas 访问的现有 IAM 角色。

  5. 选择 Trust Relationships 标签页。

  6. 单击 Edit trust relationship 按钮。

  7. 编辑 Policy Document。添加包含以下内容的新 Statement 对象。

    注意

    该政策声明允许 MongoDB 的 AWS Principal 使用客户的 KMS 密钥进行加密和解密操作。Atlas Principal 不是秘密,适用于所有 Atlas 客户。这是一个限制严格、用途受限的 AWS 账户,除了 IAM 用户之外没有其他资源。政策声明中的 ExternalId 对于每个 Atlas 项目都是独一无二的,但这不是秘密。该 ExternalId 用于降低跨上下文 (困惑代理) 漏洞的可能性。Atlas 使用通用主体访问所有客户的密钥是 Amazon 推荐的一种访问模式,如此处所述。

    注意

    用第 1 步中的 API 调用返回的值替换突出显示的行。

    {
    "Version": "2020-03-17",
    "Statement": [
    {
    "Effect": "Allow",
    "Principal": {
    "AWS": "<atlasAWSAccountArn>"
    },
    "Action:" "sts:AssumeRole",
    "Condition": {
    "StringEquals": {
    "sts:ExternalId": "<atlasAssumedRoleExternalId>"
    }
    }
    }
    ]
    }
  8. 单击 Update Trust Policy 按钮。

3

使用 API 端点授权和配置新的 IAM 假定角色 ARN 。如果 API 调用成功,则可以在配置使用 AWS 的 Atlas 服务时使用 roleId 值。

4

encryptionAtRest API 端点发送 PATCH 请求,用您的授权 AWS IAM 角色 ID 更新 awsKms.roleId 字段。

例子

curl --user "{public key}:{private key}" --digest \
--header "Accept: application/json" \
--header "Content-Type: application/json" \
--include \
--request PATCH \
"https://cloud.mongodb.com/api/atlas/v1.0/groups/{groupId}/encryptionAtRest?pretty=true&envelope=true" \
--data '
{
"awsKms": {
"enabled": true,
"roleId": "<roleId>",
"customerMasterKeyID": "<master-key-id>",
"region": "<aws-region>"
}
}'

重要

如果将加密密钥切换为基于角色的访问权限,就无法撤销基于角色的访问权限配置,也无法恢复该项目上基于档案的加密密钥访问权限。

1
  1. 如果尚未显示,请从导航栏上的 Organizations 菜单中选择包含项目的组织。

  2. 如果尚未显示,请从导航栏的 Projects 菜单中选择您的项目。

  3. 在侧边栏中,单击 Security 标题下的 Advanced

    显示“高级”页面。

2
3
4

要创建新的 AWS IAM 角色用于访问 AWS KMS 密钥进行静态加密,请按照使用 AWS CLI 创建新角色步骤进行操作。如果您要授权现有 AWS IAM 角色,请按照为现有角色添加信任关系步骤进行操作。

要使用 Atlas Administration API 更新加密密钥管理,请使用上述程序所述的相同步骤。

启用对项目加密密钥的基于角色的访问之后,必须对包含您想要加密的数据的每个 Atlas 集群启用客户密钥管理。

注意

您必须拥有 Project Owner 角色才能为该项目中的集群启用客户密钥管理。

对于新集群,请在创建集群时将管理自己的加密密钥设置切换为 Yes(是)。

对于现有群组:

1
  1. 如果尚未显示,请从导航栏上的 Organizations 菜单中选择包含所需项目的组织。

  2. 如果尚未显示,请从导航栏的Projects菜单中选择所需的项目。

  3. 如果尚未出现,请单击侧边栏中的 Clusters(集群)。

    会显示集群页面。

2

对于包含要加密的数据的集群,请单击 ,然后选择 Edit Configuration

3
  1. 展开 Additional Settings 面板。

  2. Manage your own encryption keys 设置切换为 Yes

  3. 验证您的集群的 Require Private Networking 设置的状态。

    如果您在项目级别为 Atlas 配置了使用 CMK (通过私有网络)的静态加密,则状态为 Active。如果您尚未为项目配置任何私有端点连接,则状态为 Inactive

4
  1. 单击 Review Changes(连接)。

  2. 查看更改,然后单击 Apply Changes 以更新集群。

注意

此功能不适用于以下任何部署:

  • 无服务器实例

  • M0 集群

  • M2/M5 集群

  • Flex 集群

要学习;了解更多信息,请参阅限制。

当您使用自己的云提供商KMS时, Atlas至少每 天自动轮换MongoDB主密钥。90如果您配置了密钥轮换,则密钥轮换将在维护窗口期间开始。推迟维护(手动或自动)可能会导致密钥轮换超过 90 天。密钥滚动轮换,并且该进程不需要重写数据。

Atlas 不会自动轮换用于 AWS 提供的静态加密的 AWS CMK

作为最佳实践,当您为Atlas alertAmazon Web Services90Atlas项目 启用静态加密 时, 会创建 来提醒您默认每 天轮换一次 CMK 。您可以配置此警报的时间段。

您可以自己轮换 AWS 客户主密钥,也可以配置 AWS KMS 实例以自动轮换客户主密钥。如果配置 AWS 客户主密钥自动轮换,默认轮换时间约为 365 天。

如果您已在 AWS 中设置自动 CMK 轮换,并且不希望收到每 90 天轮换一次 CMK 的 Atlas 警报,则可以将默认警报期限修改为大于 365 天或禁用警报。

本页面介绍如何在 Atlas 中创建新密钥和更新 CMK ID,以轮换 Atlas 项目 CMK。与 AWS KMS 自动 CMK 轮换相比,这种密钥轮换方法支持对轮换周期进行更精细的控制。

重要

采用静态加密的云备份

对于使用静态加密备份集群的集群, Atlas 在创建快照时会使用项目的客户主密钥 AWS IAM 用户凭证来自动加密快照数据文件。这是在应用于所有 Atlas 存储和快照卷的现有加密上的额外加密层。

Atlas 不会在轮换后使用新的 CMK 重新加密快照。在检查项目中每个启用备份的集群是否有任何快照仍在使用该 CMK 之前,请勿删除旧 CMK。Atlas 会根据备份计划、保留和按需快照删除备份。在 Atlas 根据给定的 CMK 删除所有快照后,您可以安全地删除该 CMK

1
  1. 如果尚未显示,请从导航栏上的 Organizations 菜单中选择包含项目的组织。

  2. 如果尚未显示,请从导航栏的 Projects 菜单中选择您的项目。

  3. 在侧边栏中,单击 Security 标题下的 Advanced

    显示“高级”页面。

2
3
  1. 输入以下信息:

    字段
    操作

    AWS IAM role

    选择已有权访问 KMS 密钥的现有 AWS IAM 角色,或使用以下权限授权新角色并授予此角色访问 KMS 密钥的权限:

    要学习;了解更多信息,请参阅对项目加密密钥进行基于角色的访问。

    Customer Master Key ID

    输入您的 AWS 客户主密钥 ID。

    Customer Master Key Region

    选择创建 AWS CMKAWS 区域。

    Atlas仅列出支持 的Amazon Web Services Amazon Web ServicesKMS区域。

  2. 单击 Save(连接)。

CMK 轮换过程中,Atlas 会在 Atlas 控制台中显示横幅。在部署更改之前,请删除或禁用 CMK

区域中断期间,您的 AWS KMS 区域可能不可用。如果启用了“使用客户密钥管理进行静态加密”,就可以在至少一个节点仍然可用的情况下执行加密和解密操作。但是如果所有节点都不可用,就无法执行加密操作。如果节点在中断期间重新启动,则该节点将不可用。

如需将不可用节点恢复至健康状态,可以将当前的 AWS KMS 区域重新配置为可用区域。要更改 KMS 区域,AWS KMS 密钥必须是多区域密钥 。如需创建多区域密钥,请参阅 AWS 文档

注意

您无法将单地区钥转换为多地区密钥。

要重新配置您的 AWS KMS 区域,请在 Atlas 中完成以下步骤:

1
  1. 如果尚未显示,请从导航栏上的 Organizations 菜单中选择包含项目的组织。

  2. 如果尚未显示,请从导航栏的 Projects 菜单中选择您的项目。

  3. 在侧边栏中,单击 Security 标题下的 Advanced

    显示“高级”页面。

2
3

为确保 Atlas 不会重新加密您的数据,请验证 AWS IAM roleCustomer Master Key ID 是否反映您的现有档案。

4

选择您已为其配置多地区密钥的另一个 AWS 区域。

5
  • 要了解有关 MongoDB 静态加密的更多信息,请参阅 MongoDB Server 文档中的静态加密

  • 要了解有关使用云备份进行静态加密的更多信息,请参阅存储引擎和云备份加密

后退

静态加密