除了使用您在 Amazon Web Services KMS中创建、拥有和管理的客户托管密钥 ( 集合扫描 ) 对Atlas中的静态数据进行加密外,您还可以将所有流量配置为Amazon Web Services KMS使用AWS PrivateLink。
本页介绍如何在Amazon Web Services KMS中设立AWS PrivateLink ,确保Atlas和Amazon Web Services KMS之间的所有流量都通过Amazon Web Services的专用网络接口进行。
Considerations
在通过 PrivateLink 使用Amazon Web Services KMS启用静态加密之前,查看以下使用案例、优势、限制和先决条件。
用例(Use Case)
假设您的Atlas部署在单个云服务提供商上。现在,您要求对Amazon Web Services KMS 的所有访问权限都通过云提供商的私有网络基础设施进行。本页将引导您完成为Atlas项目启用私有端点连接的步骤。
收益分析
您可以通过私有网络使用Amazon Web Services KMS配置静态加密。此配置允许流向Amazon Web Services KMS的所有流量通过一设立私有端点,并避免将Amazon Web Services KMS暴露给公共互联网或公共IP地址。此配置还无需维护允许的IP地址,同时通过将所有Amazon Web Services KMS流量保持在Amazon Web Services的私有网络内来增强数据安全性。
限制
Atlas仅支持在单云部署中通过私有网络使用Amazon Web Services KMS进行静态加密。
Atlas仅支持对处于
ACTIVE状态的项目通过私有网络使用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 设置,但以下情况除外:
您必须提供完整 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角色,请参阅Amazon Web Services文档中的 IAM 角色。
在启用了静态加密的项目中,Atlas 对所有集群都使用相同的 IAM 角色和 AWS KMS 密钥设置。
如果您的Amazon Web Services KMS配置有要求,请允许访问从 Atlas IP地址和集群节点的公共IP地址或 DNS 主机名,以便Atlas可以与您的KMS通信。您必须通过在策略文档中配置 IP解决条件操作符 ,将IP地址包含在 托管IAM角色策略 中。如果节点IP地址发生变化,则必须更新配置以避免连接中断。
步骤
为项目的加密密钥启用基于角色的访问权限
AtlasGoAdvanced在Atlas中,Go项目的 页面。
如果尚未显示,请从导航栏上的 Organizations 菜单中选择包含项目的组织。
如果尚未显示,请从导航栏的 Projects 菜单中选择您的项目。
#.在侧边栏中,单击 Security 标题下的 Database & Network Access。
在侧边栏中,单击 Advanced。
显示“高级”页面。
单击 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>" } }'
为项目的加密密钥启用基于角色的访问权限权限后,按照为项目启用和启用私有端点连接,为项目启用私有端点连接。
切换到基于角色的项目加密密钥访问权限
Amazon Web Services要求使用 IAM 角色而不是 IAM 用户来管理对Atlas中Amazon Web Services KMS加密密钥的访问权限。如果您最初将项目配置为使用 IAM 用户凭证访问权限Amazon Web Services KMS密钥,请使用以下过程切换到基于角色的访问权限。
重要
如果将加密密钥切换为基于角色的访问权限,就无法撤销基于角色的访问权限配置,也无法恢复该项目上基于档案的加密密钥访问权限。
AtlasGoAdvanced在Atlas中,Go项目的 页面。
如果尚未显示,请从导航栏上的 Organizations 菜单中选择包含项目的组织。
如果尚未显示,请从导航栏的 Projects 菜单中选择您的项目。
#.在侧边栏中,单击 Security 标题下的 Database & Network Access。
在侧边栏中,单击 Advanced。
显示“高级”页面。
授权 AWS IAM 角色并将其分配给 Atlas,以访问您的 AWS KMS 密钥进行静态加密。
要创建新的 AWS IAM 角色用于访问 AWS KMS 密钥进行静态加密,请按照使用 AWS CLI 创建新角色步骤进行操作。如果您要授权现有 AWS IAM 角色,请按照为现有角色添加信任关系步骤进行操作。
要使用Atlas Administration API更新加密密钥管理,请使用上述过程中概述的相同步骤。
为项目启用和设置私有端点连接
要启用私有网络并在Amazon Web Services KMS中设立私有端点,您必须执行以下操作:
AtlasGoAdvanced在Atlas中,Go项目的 页面。
如果尚未显示,请从导航栏上的 Organizations 菜单中选择包含项目的组织。
如果尚未显示,请从导航栏的 Projects 菜单中选择您的项目。
#.在侧边栏中,单击 Security 标题下的 Database & Network Access。
在侧边栏中,单击 Advanced。
显示“高级”页面。
在每个地区复制您的加密密钥。
登录您的Amazon Web Services KMS仪表盘。
在Atlas用户界面中,单击 Copy 以保存您的客户主密钥ID。
在Amazon Web Services KMS仪表盘中,将密钥复制到所有所需区域。要学习;了解更多信息,请参阅Amazon Web Services文档。
在 Atlas 用户界面中,单击 Continue
启用专用网络。
向 encryptionAtRest 端点 发送 PATCH请求,并将 requirePrivateNetworking 标志值设立为 true。
要学习;了解有关所需参数的更多信息,请参阅为一个项目更新使用客户托管密钥进行静态加密的配置。
例子
curl --user "{PUBLIC-KEY}:{PRIVATE-KEY}" --digest \ --header "Accept: application/vnd.atlas.2024-11-13+json" \ --header "Content-Type: application/vnd.atlas.2024-11-13+json" \ --include \ --request PATCH "https://cloud.mongodb.com/api/atlas/v2/groups/{groupId}/encryptionAtRest/" \ --data ' { "awsKms": { "accessKeyID": "019dd98d94b4bb778e7552e4", "customerMasterKeyID": "string", "enabled": true, "region": "US_EAST_1", "roleId": "32b6e34b3d91647abb20e7b8", "secretAccessKey": "string", "requirePrivateNetworking": true } }'
创建私有端点。
使用Atlas Administration API创建私有端点以与Amazon Web Services KMS通信。
POST将encryptionAtRest 请求发送到包含您希望Atlas创建私有端点的Amazon Web Services地区的 端点。您必须为希望Atlas创建私有端点的每个地区发送单独的请求。
例子
curl --user "{PUBLIC-KEY}:{PRIVATE-KEY}" --digest \ --header "Accept: application/vnd.atlas.2024-11-13+json" \ --header "Content-Type: application/vnd.atlas.2024-11-13+json" \ --include \ --request POST "https://cloud.mongodb.com/api/atlas/v2/groups/{groupId}/encryptionAtRest/AWS/privateEndpoints" \ --data ' { "regionName": "US_EAST_1" }'
创建私有端点后,应用以下限制:
Atlas仅在私有端点获批的地区创建所有新集群。
Atlas仅在私有端点获批的区域为现有集群部署额外节点。
检查请求的状态。
要检查私有端点的状态,请向encryptionAtRest端点发送GET请求。
例子
curl --user "{PUBLIC-KEY}:{PRIVATE-KEY}" --digest \ --header "Accept: application/vnd.atlas.2024-11-13+json" \ --header "Content-Type: application/vnd.atlas.2024-11-13+json" \ --include \ --request GET "https://cloud.mongodb.com/api/atlas/v2/groups/{groupId}/encryptionAtRest/AWS/privateEndpoints"
{ "links": [ { "href": "https://cloud.mongodb.com/api/atlas", "rel": "self" } ], "results": [ { "cloudProvider": "AWS", "id": "24-hexadecimal-digit-string", "privateEndpointConnectionName": "string", "regionName": "US_EAST_1", "status": "INITIATING", } ], "totalCount": 1 }
Atlas最多可能需要三分钟才能反映私有端点的当前状态。私有端点可能处于以下状态之一:
活跃的 | 表示私有端点已获批准, Atlas可以或正在使用它。 |
已失败 | 表示创建私有端点失败。 |
为项目启用客户密钥管理并设立私有端点后,请按照为 Atlas 集群启用客户密钥管理为项目中的每个AtlasAtlas 集群启用客户数密钥管理。
重要
如果您有一个现有的多区域 AWS集群,并且使用 AWS KMS单区域密钥启用了客户密钥管理,则无法启用 Require Private Networking选项。不支持此配置。
为 Atlas 集群启用客户密钥管理
为项目的加密密钥启用基于角色的访问权限后,必须为包含要加密的数据的每个Atlas 集群启用客户密钥管理。
注意
您必须拥有 Project Owner 角色才能为该项目中的集群启用客户密钥管理。
多区域集合扫描
对于多区域Amazon Web Services 集合扫描,请确保将每个区域密钥 ARN 添加到KMS密钥策略中,以便这些区域中的Atlas集群可以访问权限它。
对于新集群,请在创建集群时将管理自己的加密密钥设置切换为 Yes(是)。
对于现有群组:
AtlasGoClusters在Atlas中,Go项目的 页面。
如果尚未显示,请从导航栏上的 Organizations 菜单中选择包含所需项目的组织。
如果尚未显示,请从导航栏的Projects菜单中选择所需的项目。
在侧边栏中,单击 Database 标题下的 Clusters。
会显示集群页面。
禁用项目的客户管理密钥
要为项目禁用集合扫描 ,必须先删除与项目关联的所有私有端点,无论其状态如何。如果您尝试为与活动私有端点关联的项目禁用集合扫描 , Atlas会显示错误。
删除项目的所有私有端点后,必须先禁用项目中每个集群的客户密钥管理,然后再禁用项目的功能。
警告
在禁用Atlas项目中的客户密钥管理之前,请勿禁用或删除Atlas项目中的任何集群使用的任何Amazon Web Services KMS密钥。如果Atlas无法访问权限Amazon Web Services KMS密钥,则任何经该密钥加密的数据都将无法访问。
为项目创建新端点
为项目启用并设立私有端点连接后,您可以随时从Atlas用户界面和Atlas Administration API添加其他端点。
AtlasGoAdvanced在Atlas中,Go项目的 页面。
如果尚未显示,请从导航栏上的 Organizations 菜单中选择包含项目的组织。
如果尚未显示,请从导航栏的 Projects 菜单中选择您的项目。
#.在侧边栏中,单击 Security 标题下的 Database & Network Access。
在侧边栏中,单击 Advanced。
显示“高级”页面。
创建私有端点。
使用Atlas Administration API创建私有端点以与Amazon Web Services KMS通信。
POST将encryptionAtRest 请求发送到您希望Atlas创建私有端点的Amazon Web Services地区的 端点。您必须为希望Atlas创建私有端点的每个地区发送单独的请求。
例子
curl --user "{PUBLIC-KEY}:{PRIVATE-KEY}" --digest \ --header "Accept: application/vnd.atlas.2024-11-13+json" \ --header "Content-Type: application/vnd.atlas.2024-11-13+json" \ --include \ --request POST "https://cloud.mongodb.com/api/atlas/v2/groups/{groupId}/encryptionAtRest/AWS/privateEndpoints" \ --data ' { "regionName": "US_EAST_1" }'
创建私有端点后,应用以下限制:
Atlas仅在私有端点获批的地区创建所有新集群。
Atlas仅在私有端点获批的区域为现有集群部署额外节点。
检查请求的状态。
要检查私有端点的状态,请向encryptionAtRest端点发送GET请求。
例子
curl --user "{PUBLIC-KEY}:{PRIVATE-KEY}" --digest \ --header "Accept: application/vnd.atlas.2024-11-13+json" \ --header "Content-Type: application/vnd.atlas.2024-11-13+json" \ --include \ --request GET "https://cloud.mongodb.com/api/atlas/v2/groups/{groupId}/encryptionAtRest/AWS/privateEndpoints"
{ "links": [ { "href": "https://cloud.mongodb.com/api/atlas", "rel": "self" } ], "results": [ { "cloudProvider": "AWS", "id": "24-hexadecimal-digit-string", "privateEndpointConnectionName": "string", "regionName": "US_EAST_1", "status": "INITIATING", } ], "totalCount": 1 }
Atlas最多可能需要三分钟才能反映私有端点的当前状态。私有端点可能处于以下状态之一:
活跃的 | 表示私有端点已获批准, Atlas可以或正在使用它。 |
已失败 | 表示创建私有端点失败。 |
拒绝或删除私有端点连接
您可以从Atlas用户界面和Atlas Administration API删除私有端点连接。
AtlasGoAdvanced在Atlas中,Go项目的 页面。
如果尚未显示,请从导航栏上的 Organizations 菜单中选择包含项目的组织。
如果尚未显示,请从导航栏的 Projects 菜单中选择您的项目。
#.在侧边栏中,单击 Security 标题下的 Database & Network Access。
在侧边栏中,单击 Advanced。
显示“高级”页面。
DELETE要成功删除私有端点,请向Atlas Administration API端点发送 请求,并指定项目的ID和要删除的私有端点的 ID。您可以通过向Atlas Administration API“为一个提供商端点返回一个私有端点服务”发送 请求来检索要删除的私有端点的IDGET 。
例子
curl --user "{PUBLIC-KEY}:{PRIVATE-KEY}" --digest \ --header "Accept: application/vnd.atlas.2024-10-23+json" \\ or a different version of the Atlas Admin API --header "Content-Type: application/json" \ --include \ --request DELETE "https://cloud.mongodb.com/api/atlas/v2/groups/{groupId}/encryptionAtRest/AWS/ privateEndpoints/{endpointId}" \ --data ' { "cloudProvider": "AWS", "regions": [ "string" ] }'
当您使用Atlas Administration API删除私有端点时,在Atlas删除私有端点时,私有端点会转换为 DELETING 状态。
如果您从Amazon Web Services用户界面中删除或拒绝活动的私有端点, Atlas会自动尝试在同一地区中重新创建新的私有端点。
当Atlas尝试创建新的私有端点时,您拒绝或删除的私有端点的状态将转换为PENDING_RECREATION ,并且Atlas尝试创建的新端点处于INITIATING状态。 创建新的私有端点后,必须予以批准。
查看私有端点及其状态
您可以从Atlas用户界面和Atlas Administration API查看各个区域中的私有端点及其状态。
AtlasGoAdvanced在Atlas中,Go项目的 页面。
如果尚未显示,请从导航栏上的 Organizations 菜单中选择包含项目的组织。
如果尚未显示,请从导航栏的 Projects 菜单中选择您的项目。
#.在侧边栏中,单击 Security 标题下的 Database & Network Access。
在侧边栏中,单击 Advanced。
显示“高级”页面。
您可以从Atlas AdministrationGET API查看私有端点及其状态,方法是向Atlas Administration APIencryptionAtRest 获取所有端点或获取一个端点发送 请求,为此,您必须在路径。
例子
返回一个项目的所有私有端点
curl --user "{PUBLIC-KEY}:{PRIVATE-KEY}" --digest \ --header "Accept: application/vnd.atlas.2024-10-23+json" \\ or a different version of the Atlas Admin API --header "Content-Type: application/json" \ --include \ --request GET "https://cloud.mongodb.com/api/atlas/v2/groups/{groupId}/encryptionAtRest/AWS/privateEndpoints/"
每个私有端点均可处于以下状态之一:
活跃的 | 表示私有端点已获批准, Atlas可以或正在使用它。 |
已失败 | 表示创建私有端点失败。 |
禁用项目的私有端点连接
要禁用项目的私有端点连接,必须首先删除与项目关联的所有私有端点,无论其状态如何。如果项目与活动的私有端点关联, Atlas不会禁用项目的私有端点连接。
删除项目的所有私有端点后,您可以使用Atlas用户界面和Atlas Administration API禁用项目的私有端点连接。
AtlasGoAdvanced在Atlas中,Go项目的 页面。
如果尚未显示,请从导航栏上的 Organizations 菜单中选择包含项目的组织。
如果尚未显示,请从导航栏的 Projects 菜单中选择您的项目。
#.在侧边栏中,单击 Security 标题下的 Database & Network Access。
在侧边栏中,单击 Advanced。
显示“高级”页面。
要禁用私有端点连接,请向端点发送 PATCH请求,并将 requirePrivateNetworking 布尔标志值设立为 false。
例子
{ "awsKms": { "accessKeyID": "019dd98d94b4bb778e7552e4", "customerMasterKeyID": "string", "enabled": true, "region": "US_EAST_1", "roleId": "32b6e34b3d91647abb20e7b8", "secretAccessKey": "string" "requirePrivateNetworking": false } }
相关主题
如需在部署 Atlas 集群时使用“密钥管理”启用“静态加密”,请参阅“管理加密密钥”。
如需使用“密钥管理”对现有 Atlas 集群启用“静态加密”,请参阅“启用静态加密”。
如需进一步了解如何在 Atlas 中使用“密钥管理”进行静态加密,请参阅“使用客户密钥管理进行静态加密”。
要了解有关 MongoDB 静态加密的更多信息,请参阅 MongoDB Server 文档中的静态加密。
要了解有关使用云备份进行静态加密的更多信息,请参阅存储引擎和云备份加密。
要启用搜索节点的客户密钥管理,请参阅启用搜索节点数据加密。