本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
DynamoDB 全域資料表安全性
全域資料表複本是 DynamoDB 資料表,因此您可以使用與單一區域資料表相同的方法來控制對複本的存取,包括 AWS Identity and Access Management (IAM) 身分政策和以資源為基礎的政策。本主題說明如何使用 IAM 許可和 AWS Key Management Service (AWS KMS) 加密保護 DynamoDB 多帳戶全域資料表。您可以了解允許跨區域跨帳戶複寫和自動擴展的資源型政策和服務連結角色 (SLR),以及建立、更新和刪除全域資料表所需的 IAM 許可,以取得多區域最終一致性 (MREC) 資料表。您也會了解 AWS KMS 加密金鑰,以安全地管理跨區域複寫。
它提供有關建立跨帳戶和跨區域資料表複寫所需的資源型政策和許可的詳細資訊。對於需要實作安全、跨帳戶資料複寫解決方案的客戶而言,了解此安全模型至關重要。
複寫的服務主體授權
DynamoDB 的多帳戶全域資料表使用不同的授權方法,因為複寫是跨帳戶邊界執行。這是使用 DynamoDB 的複寫服務主體來完成:replication.dynamodb.amazonaws.com。每個參與帳戶都必須在複本資料表的資源政策中明確允許該主體,並授予其許可,該許可可由 aws:SourceAccount、 等金鑰上的來源內容條件限制為特定複本 — 如需詳細資訊aws:SourceArn,請參閱AWS 全域條件金鑰。許可是雙向的,這表示所有複本都必須明確地互相授予許可,才能跨任何特定複本對建立複寫。
下列服務主體許可對於跨帳戶複寫至關重要:
-
dynamodb:ReadDataForReplication授予讀取資料以用於複寫的能力。此許可允許讀取一個複本中的變更,並將其傳播到其他複本。 -
dynamodb:WriteDataForReplication允許將複寫的資料寫入目的地資料表。此許可允許全域資料表中所有複本的變更同步。 -
dynamodb:ReplicateSettings啟用跨複本的資料表設定同步,在所有參與的資料表之間提供一致的組態。
每個複本都必須將上述許可授予所有其他複本和 本身,即來源內容條件必須包含包含全域資料表的完整複本集。這些許可會在新增至多帳戶全域資料表時,針對每個新複本進行驗證。這會驗證複寫操作僅由授權的 DynamoDB 服務執行,並且僅在預期的資料表之間執行。
多帳戶全域資料表的服務連結角色
DynamoDB 多帳戶全域資料表會複寫所有複本的設定,讓每個複本都設定一致輸送量,並提供無縫的容錯移轉體驗。設定複寫是透過服務主體的 ReplicateSettings 許可進行控制,但我們也依賴服務連結角色 (SLRs) 來管理特定跨帳戶跨區域複寫和自動擴展功能。這些角色每個 AWS 帳戶只會設定一次。建立之後,相同的角色會為您帳戶中的所有全域資料表提供服務。如需服務連結角色的詳細資訊,請參閱《IAM 使用者指南》中的使用服務連結角色。
設定管理服務連結角色
當您在帳戶中建立第一個多帳戶全域資料表複本時,Amazon DynamoDB 會自動建立 AWSServiceRoleForDynamoDBGlobalTableSettingsManagement 服務連結角色 (SLR)。此角色會為您管理設定的跨帳戶跨區域複寫。
將資源型政策套用至複本時,請確認您不會拒絕 中定義的任何許可AWSServiceRoleForDynamoDBGlobalTableSettingsManagement給 SLR 主體,因為這可能會干擾設定管理,如果複本或 GSIs 之間的輸送量不相符,則可能會影響複寫。如果您拒絕必要的 SLR 許可,對受影響複本的複寫和複寫可能會停止,而複本資料表狀態會變更為 REPLICATION_NOT_AUTHORIZED。對於多帳戶全域資料表,如果複本保持 REPLICATION_NOT_AUTHORIZED 狀態超過 20 小時,則複本會不可復原地轉換為單一區域 DynamoDB 資料表。SLR 具有下列許可:
-
application-autoscaling:DeleteScalingPolicy -
application-autoscaling:DescribeScalableTargets -
application-autoscaling:DescribeScalingPolicies -
application-autoscaling:DeregisterScalableTarget -
application-autoscaling:PutScalingPolicy -
application-autoscaling:RegisterScalableTarget
自動擴展服務連結角色
設定佈建容量模式的全域資料表時,必須為全域資料表設定自動擴展。DynamoDB Auto Scaling 服務會使用 AWS Application Auto Scaling 服務動態調整全域資料表複本上的佈建輸送量容量。Application Auto Scaling 服務會建立名為 AWSServiceRoleForApplicationAutoScaling_DynamoDBTable 的服務連結角色 (SLR)。當您第一次設定 DynamoDB 資料表的自動擴展時,會在 AWS 您的帳戶中自動建立此服務連結角色。它允許 Application Auto Scaling 管理佈建的資料表容量並建立 CloudWatch 警示。
將資源型政策套用至複本時,請確認您未拒絕 AWSApplicationAutoscalingDynamoDBTablePolicy 中定義的任何許可至 Application Auto Scaling SLR 主體,因為這會中斷自動調整規模功能。
全域資料表如何使用 AWS IAM
下列各節說明不同全域資料表操作的必要許可,並提供政策範例,協助您為使用者和應用程式設定適當的存取權。
注意
所描述的所有許可都必須套用至受影響區域中的特定資料表資源 ARN ()。資料表資源 ARN 遵循格式 arn:aws:dynamodb:region:account-id:table/table-name,您需要指定實際的區域、帳戶 ID 和資料表名稱值。
以下是我們在下列各節涵蓋的step-by-step主題:
-
建立多帳戶全域資料表並新增複本
-
更新多帳戶全域資料表
-
刪除全域資料表和移除複本
建立全域資料表並新增複本
建立全域資料表的許可
當新的複本新增至區域資料表以形成多帳戶全域資料表或現有多帳戶全域資料表時,執行動作的 IAM 主體必須經過所有現有成員的授權。所有現有成員都必須在其資料表政策中授予下列許可,才能成功新增複本:
-
dynamodb:AssociateTableReplica- 此許可允許資料表加入全域資料表設定。這是啟用初始建立複寫關係的基礎許可。
此精確控制僅允許授權帳戶參與全域資料表設定。
建立全域資料表的 IAM 政策範例
多帳戶全域資料表的設定遵循提供安全複寫的特定授權流程。讓我們演練一個實際案例,其中客戶想要建立具有兩個複本的全球資料表,藉此檢查其實際運作方式。第一個複本 (ReplicaA) 位於 ap-east-1 區域中的帳戶 A,而第二個複本 (ReplicaB) 位於 eu-south-1 區域中的帳戶 B。
-
在來源帳戶 (帳戶 A) 中,程序會從建立主要複本資料表開始。帳戶管理員必須將資源型政策連接到此資料表,以明確授予目的地帳戶 (帳戶 B) 執行關聯的必要許可。此政策也會授權 DynamoDB 複寫服務執行必要的複寫動作。
-
目的地帳戶 (帳戶 B) 遵循類似的程序,方法是在建立複本時連接對應的資源型政策,並參考要用來建立複本的來源資料表 ARN。此政策會反映帳戶 A 授予的許可,建立信任的雙向關係。在建立複寫之前,DynamoDB 會驗證這些跨帳戶許可,以確認已具備適當的授權。
若要建立此設定:
-
帳戶 A 的管理員必須先將資源型政策連接至ReplicaA。此政策明確授予帳戶 B 和 DynamoDB 複寫服務必要的許可。
-
同樣地,帳戶 B 的管理員必須將相符政策連接至ReplicaB,並在建立資料表呼叫中將對應的許可反向授予帳戶 A,以建立參考複本 A 做為來源資料表的複本 B。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "DynamoDBActionsNeededForSteadyStateReplication", "Effect": "Allow", "Action": [ "dynamodb:ReadDataForReplication", "dynamodb:WriteDataForReplication", "dynamodb:ReplicateSettings" ], "Resource": "arn:aws:dynamodb:ap-east-1:A:table/ReplicaA", "Principal": {"Service": ["replication.dynamodb.amazonaws.com"]}, "Condition": { "StringEquals": { "aws:SourceAccount": [ "A", "B" ], "aws:SourceArn": [ "arn:aws:dynamodb:ap-east-1:A:table/ReplicaA", "arn:aws:dynamodb:eu-south-1:B:table/ReplicaB" ] } } }, { "Sid": "AllowTrustedAccountsToJoinThisGlobalTable", "Effect": "Allow", "Action": [ "dynamodb:AssociateTableReplica" ], "Resource": "arn:aws:dynamodb:ap-east-1:A:table/ReplicaA", "Principal": {"AWS": ["B"]} } ] }
{ "Version": "2012-10-17", "Statement": [ { "Sid": "DynamoDBActionsNeededForSteadyStateReplication", "Effect": "Allow", "Action": [ "dynamodb:ReadDataForReplication", "dynamodb:WriteDataForReplication", "dynamodb:ReplicateSettings" ], "Resource": "arn:aws:dynamodb:eu-south-1:B:table/ReplicaB", "Principal": {"Service": ["replication.dynamodb.amazonaws.com"]}, "Condition": { "StringEquals": { "aws:SourceAccount": [ "A", "B" ], "aws:SourceArn": [ "arn:aws:dynamodb:ap-east-1:A:table/ReplicaA", "arn:aws:dynamodb:eu-south-1:B:table/ReplicaB" ] } } } ] }
在此設定中,帳戶 ReplicaA、帳戶 ReplicaB 和帳戶 C 分別有 3 個複本複本 A、複本 B 和ReplicaC C。複本 A 是第一個複本,其開頭為區域資料表,然後將ReplicaB 和ReplicaC 新增至其中。
-
帳戶 A 的管理員必須先將資源型政策連接至ReplicaA,以允許複寫所有成員,並允許帳戶 B 和帳戶 C 的 IAM 主體新增複本。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "DynamoDBActionsNeededForSteadyStateReplication", "Effect": "Allow", "Action": [ "dynamodb:ReadDataForReplication", "dynamodb:WriteDataForReplication", "dynamodb:ReplicateSettings" ], "Resource": "arn:aws:dynamodb:ap-east-1:A:table/ReplicaA", "Principal": {"Service": ["replication.dynamodb.amazonaws.com"]}, "Condition": { "StringEquals": { "aws:SourceAccount": [ "A", "B", "C" ], "aws:SourceArn": [ "arn:aws:dynamodb:ap-east-1:A:table/ReplicaA", "arn:aws:dynamodb:eu-south-1:B:table/ReplicaB", "arn:aws:dynamodb:us-east-1:C:table/ReplicaC" ] } } }, { "Sid": "AllowTrustedAccountsToJoinThisGlobalTable", "Effect": "Allow", "Action": [ "dynamodb:AssociateTableReplica" ], "Resource": "arn:aws:dynamodb:ap-east-1:A:table/ReplicaA", "Principal": { "AWS": [ "B", "C" ] } } ] }
-
帳戶 B 的管理員必須新增指向ReplicaA做為來源的複本 (複本 B)。複本 B 具有下列政策,允許所有成員之間複寫,並允許帳戶 C 新增複本:
{ "Version": "2012-10-17", "Statement": [ { "Sid": "DynamoDBActionsNeededForSteadyStateReplication", "Effect": "Allow", "Action": [ "dynamodb:ReadDataForReplication", "dynamodb:WriteDataForReplication", "dynamodb:ReplicateSettings" ], "Resource": "arn:aws:dynamodb:eu-south-1:B:table/ReplicaB", "Principal": {"Service": ["replication.dynamodb.amazonaws.com"]}, "Condition": { "StringEquals": { "aws:SourceAccount": [ "A", "B", "C" ], "aws:SourceArn": [ "arn:aws:dynamodb:ap-east-1:A:table/ReplicaA", "arn:aws:dynamodb:eu-south-1:B:table/ReplicaB", "arn:aws:dynamodb:us-east-1:C:table/ReplicaC" ] } } }, { "Sid": "AllowTrustedAccountsToJoinThisGlobalTable", "Effect": "Allow", "Action": [ "dynamodb:AssociateTableReplica" ], "Resource": "arn:aws:dynamodb:eu-south-1:B:table/ReplicaB", "Principal": { "AWS": [ "C" ] } } ] }
-
最後,帳戶 C 的管理員會使用允許所有成員之間複寫許可的下列政策來建立複本。此政策不允許新增任何進一步的複本。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "DynamoDBActionsNeededForSteadyStateReplication", "Effect": "Allow", "Action": [ "dynamodb:ReadDataForReplication", "dynamodb:WriteDataForReplication", "dynamodb:ReplicateSettings" ], "Resource": "arn:aws:dynamodb:us-east-1:C:table/ReplicaC", "Principal": {"Service": ["replication.dynamodb.amazonaws.com"]}, "Condition": { "StringEquals": { "aws:SourceAccount": [ "A", "B" ], "aws:SourceArn": [ "arn:aws:dynamodb:ap-east-1:A:table/ReplicaA", "arn:aws:dynamodb:eu-south-1:B:table/ReplicaB" ] } } } ] }
更新多帳戶全域資料表
若要使用 UpdateTable API 修改現有全域資料表的複本設定,您需要對進行 API 呼叫之區域中的資料表資源具有下列許可: dynamodb:UpdateTable
您也可以更新其他全域資料表組態,例如自動擴展政策和存留時間設定。這些額外的更新操作需要下列許可:
若要使用 UpdateTimeToLive API 更新存留時間設定,您必須在包含複本的所有區域中對資料表資源擁有下列許可: dynamodb:UpdateTimeToLive
若要使用 UpdateTableReplicaAutoScaling API 更新複本自動擴展政策,您必須在包含複本的所有區域中對資料表資源擁有下列許可:
-
application-autoscaling:DeleteScalingPolicy -
application-autoscaling:DeleteScheduledAction -
application-autoscaling:DeregisterScalableTarget -
application-autoscaling:DescribeScalableTargets -
application-autoscaling:DescribeScalingActivities -
application-autoscaling:DescribeScalingPolicies -
application-autoscaling:DescribeScheduledActions -
application-autoscaling:PutScalingPolicy -
application-autoscaling:PutScheduledAction -
application-autoscaling:RegisterScalableTarget
注意
您需要跨所有複本區域和帳戶提供dynamodb:ReplicateSettings許可,更新資料表才能成功。如果任何複本不提供將設定複寫到多帳戶全域資料表中任何複本的許可,則所有複本的所有更新操作都會失敗,AccessDeniedException直到許可修正為止。
刪除全域資料表和移除複本
若要刪除全域資料表,您必須移除所有複本。與相同帳戶全域資料表不同,您無法使用 UpdateTable刪除遠端區域中的複本資料表,而且每個複本必須透過 DeleteTable API 從控制該複本的帳戶刪除。
刪除全域資料表和移除複本的許可
移除個別複本和完全刪除全域資料表需要下列許可。刪除全域資料表組態只會移除不同區域中資料表之間的複寫關係。它不會刪除最後一個剩餘區域中的基礎 DynamoDB 資料表。最後一個區域中的資料表會繼續做為具有相同資料和設定的標準 DynamoDB 資料表存在。
您需要在移除複本的每個區域中的資料表資源具有下列許可:
-
dynamodb:DeleteTable -
dynamodb:DeleteTableReplica
全域資料表的使用方式 AWS KMS
與所有 DynamoDB 資料表一樣,全域資料表複本一律使用存放在 AWS Key Management Service () 中的加密金鑰來加密靜態資料AWS KMS。
注意
與相同帳戶全域資料表不同,多帳戶全域資料表中的不同複本可以使用不同類型的 AWS KMS 金鑰 (AWS 擁有的金鑰或客戶受管金鑰) 進行設定。多帳戶全域資料表不支援 AWS 受管金鑰。
使用 CMKs多帳戶全域資料表需要每個複本的金鑰政策,才能授予 DynamoDB 複寫服務主體 (replication.dynamodb.amazonaws.com) 存取金鑰以進行複寫和設定管理的許可。需要以下許可:
-
kms:Decrypt -
kms:ReEncrypt* -
kms:GenerateDataKey* -
kms:DescribeKey
Important (重要)
DynamoDB 需要存取複本的加密金鑰才能刪除複本。如果您想要停用或刪除用於加密複本的客戶受管金鑰,因為您要刪除複本,您應該先刪除複本,等待從複寫群組中移除資料表,方法是呼叫其中一個複本中的描述,然後停用或刪除金鑰。
如果您停用或撤銷 DynamoDB 對用於加密複本之客戶受管金鑰的存取權,複本的複寫將停止,複本狀態將變更為 INACCESSIBLE_ENCRYPTION_CREDENTIALS。如果複本保持 INACCESSIBLE_ENCRYPTION_CREDENTIALS 狀態超過 20 小時,複本會不可逆地轉換為單一區域 DynamoDB 資料表。
範例 AWS KMS 政策
此 AWS KMS 政策允許 DynamoDB 存取複本 A 和 B 之間的兩個複寫 AWS KMS 金鑰。每個帳戶中連接至 DynamoDB 複本的 AWS KMS 金鑰需要更新為下列政策:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "replication.dynamodb.amazonaws.com" }, "Action": [ "kms:Decrypt", "kms:ReEncrypt*", "kms:GenerateDataKey*", "kms:DescribeKey" ], "Condition": { "StringEquals": { "aws:SourceAccount": [ "A", "B" ], "aws:SourceArn": [ "arn:aws:dynamodb:ap-east-1:A:table/ReplicaA", "arn:aws:dynamodb:eu-south-1:B:table/ReplicaB" ] } } } ] }