使用您在 Amazon Web Services KMS中创建、拥有和管理的客户托管密钥 ( 集合扫描 ) 对Atlas中的静态数据进行加密。
本页介绍如何在您的Atlas项目以及该项目中的集群上使用Amazon Web Services KMS配置客户密钥管理。
先决条件
要使用 AWS KMS 为 MongoDB 项目启用客户托管密钥,必须:
使用 M10 或更大的集群。
具有足够特权的 AWS IAM 角色。Atlas 必须有权使用密钥执行以下操作:
注意
如果你希望将 AWS KMS 密钥与来自不同 AWS 账户的 AWS IAM 角色(而不是创建 AWS KMS 密钥的 IAM 角色)一起使用,请确保你拥有足够特权:
在 AWS KMS 密钥下添加密钥策略声明以包含外部 AWS 账户。
为外部 AWS 帐户中的 IAM 角色添加 IAM 内联策略。
有关 IAM 角色和客户主密钥的全面讨论,请参阅 AWS 文档。
确认上述特权后,您可以按照常规步骤在 Atlas 中配置 KMS 设置,但以下情况除外:
您必须提供Amazon Web Services KMS密钥的完整 ARN(例如
arn:aws:kms:eu-west-2:111122223333:key/12345678-1234-1234-1234-12345678
),而不是主密钥ID (例如12345678-1234-1234-1234-12345678
),在Amazon Web Services KMS密钥ID字段中。
要学习;了解如何创建 IAM角色,请参阅Amazon Web Services文档中的 IAM 角色。
在启用了静态加密的项目中,Atlas 对所有集群都使用相同的 IAM 角色和 AWS KMS 密钥设置。
如果您的Amazon Web Services KMS配置有要求,请允许访问从 Atlas IP地址和集群节点的公共IP地址或 DNS 主机名,以便Atlas可以与您的KMS通信。您必须通过在策略文档中配置 IP解决条件操作符 ,将IP地址包含在 托管IAM角色策略 中。如果节点IP地址发生变化,则必须更新配置以避免连接中断。
步骤
为项目的加密密钥启用基于角色的访问权限
单击 Authorize a new IAM role(授权新的 IAM 角色)链接,向 Atlas 授权 AWS IAM 角色,以访问您的 AWS KMS 密钥进行静态加密。
要创建新的 AWS IAM 角色用于访问 AWS KMS 密钥进行静态加密,请按照使用 AWS CLI 创建新角色步骤进行操作。如果您要授权现有 AWS IAM 角色,请按照为现有角色添加信任关系步骤进行操作。
通过Amazon Web Services控制台或CLI为您的 Amazon Web Amazon Web Services IAM角色添加访问权限策略。有关更多信息,请参阅管理 IAM 策略。
注意
此策略声明允许 MongoDB 的Amazon Web Services主体使用客户的KMS密钥进行加密和解密操作。Atlas主体不是秘密,所有Atlas客户都使用该主体。这是一个受到高度限制、用途有限的Amazon Web Services帐户,除了 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" ] } ] }
向 cloudProviderAccess
端点发送 POST 请求。
使用 API 终结点创建新的 AWS IAM 角色。Atlas 将使用此角色对您的 AWS 帐户进行身份验证。
保存返回的字段值 atlasAWSAccountArn
和 atlasAssumedRoleExternalId
,以便在下一步中使用。
修改 AWS IAM 角色信任策略。
登录 AWS 管理控制台。
导航至 Identity and Access Management (IAM) 服务。
从左侧导航栏中选择 Roles 。
单击角色列表中您希望用于 Atlas 访问的现有 IAM 角色。
选择 Trust Relationships 标签页。
单击 Edit trust relationship 按钮。
编辑 Policy Document。添加包含以下内容的新
Statement
对象。注意
此策略声明允许 MongoDB 的Amazon Web Services主体使用客户的KMS密钥进行加密和解密操作。Atlas主体不是秘密,所有Atlas客户都使用该主体。这是一个受到高度限制、用途有限的Amazon Web Services帐户,除了 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>" } } } ] } 单击 Update Trust Policy 按钮。
授权新创建的 IAM 角色。
使用 API 端点授权和配置新的 IAM 假定角色 ARN 。如果 API 调用成功,则可以在配置使用 AWS 的 Atlas 服务时使用 roleId
值。
在项目上启用具有角色授权的 AWS KMS
向 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>" } }'
为项目的加密密钥启用基于角色的访问权限后,请按照为Atlas 集群启用客户密钥管理为项目中的每个Atlas集群启用客户数管理的密钥。
切换到基于角色的项目加密密钥访问权限
自一月26 2021, , Amazon Web Services要求使用 IAM 角色而不是 IAM 用户来管理对Atlas中Amazon Web Services KMS加密密钥的访问权限。如果您最初将项目配置为使用 IAM 用户凭证访问权限Amazon Web Services KMS密钥,请使用以下过程切换到基于角色的访问权限,以满足这一新要求。
重要
如果将加密密钥切换为基于角色的访问权限,就无法撤销基于角色的访问权限配置,也无法恢复该项目上基于档案的加密密钥访问权限。
授权 AWS IAM 角色并将其分配给 Atlas,以访问您的 AWS KMS 密钥进行静态加密。
要创建新的 AWS IAM 角色用于访问 AWS KMS 密钥进行静态加密,请按照使用 AWS CLI 创建新角色步骤进行操作。如果您要授权现有 AWS IAM 角色,请按照为现有角色添加信任关系步骤进行操作。
要使用 Atlas Administration API 更新加密密钥管理,请使用上述程序所述的相同步骤。
为 Atlas 集群启用客户密钥管理
为项目的加密密钥启用基于角色的访问权限后,必须为包含要加密的数据的每个Atlas 集群启用客户密钥管理。
注意
您必须拥有 Project Owner
角色才能为该项目中的集群启用客户密钥管理。
对于新集群,请在创建集群时将管理自己的加密密钥设置切换为 Yes(是)。
对于现有群组:
为搜索节点启用客户密钥管理
默认下, MongoDB和搜索进程在同一节点上运行。在这种架构中,客户管理的加密适用于数据库数据,但不适应用搜索索引。
启用专用搜索节点后,搜索进程将在单独的节点上运行。这允许您启用搜索节点数据加密,以便您可以使用相同的客户托管密钥对数据库数据和搜索索引进行加密,以实现全面的加密覆盖范围。