加密EBS快照跨账号复制

基于AWS官方文档整理并实际验证的完整操作指南

概述

本教程介绍如何将使用客户托管KMS密钥加密的EBS快照安全地复制到另一个AWS账号。

前提条件

  • 源账号:拥有加密EBS快照的账号
  • 目标账号:接收快照副本的账号
  • 快照必须使用客户托管KMS密钥加密(不能是AWS托管密钥)

⚠️ 根据AWS官方文档明确说明

You can't share snapshots that are encrypted with the default AWS managed key. You can only share snapshots that are encrypted with a customer managed key.

Link: Share an Amazon EBS snapshot with other AWS accounts - Amazon EBS

如采用AWS托管密钥,请参考这篇blog 为加密EBS卷更换客户托管密钥 将AWS托管密钥加密的EBS卷转换为客户托管密钥加密。

操作环境信息

  • 源账号: <SOURCE-ACCOUNT-ID>
  • 目标账号: <TARGET-ACCOUNT-ID>
  • 测试区域: <AWS-REGION>
  • 源KMS密钥: <SOURCE-KMS-KEY-ID>
  • 目标KMS密钥: <TARGET-KMS-KEY-ID>
  • 测试快照: <SOURCE-SNAPSHOT-ID>

步骤1:准备源账号的KMS密钥

1.1 创建客户托管KMS密钥(如果没有)

aws kms create-key \
    --description "Key for cross-account EBS snapshot testing" \
    --region <AWS-REGION>

1.2 修改KMS密钥策略

在源账号中,需要给目标账号授予KMS密钥使用权限:

# 获取当前密钥策略
aws kms get-key-policy \
    --key-id <SOURCE-KMS-KEY-ID> \
    --policy-name default \
    --region <AWS-REGION>

1.3 更新密钥策略

创建包含目标账号权限的策略文件:

{
  "Version": "2012-10-17",
  "Id": "key-default-1",
  "Statement": [
    {
      "Sid": "Enable IAM User Permissions",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::<SOURCE-ACCOUNT-ID>:root"
      },
      "Action": "kms:*",
      "Resource": "*"
    },
    {
      "Sid": "Allow use of the key for cross-account snapshot",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::<TARGET-ACCOUNT-ID>:root"
      },
      "Action": [
        "kms:Decrypt",
        "kms:DescribeKey",
        "kms:CreateGrant",
        "kms:GenerateDataKey",
        "kms:GenerateDataKeyWithoutPlaintext",
        "kms:ReEncrypt*"
      ],
      "Resource": "*"
    },
    {
      "Sid": "Allow attachment of persistent resources",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::<TARGET-ACCOUNT-ID>:root"
      },
      "Action": [
        "kms:CreateGrant",
        "kms:ListGrants",
        "kms:RevokeGrant"
      ],
      "Resource": "*",
      "Condition": {
        "Bool": {
          "kms:GrantIsForAWSResource": true
        }
      }
    }
  ]
}

应用策略:

aws kms put-key-policy \
    --key-id <SOURCE-KMS-KEY-ID> \
    --policy-name default \
    --policy file://kms-policy.json \
    --region <AWS-REGION>

步骤2:在目标账号创建KMS密钥(可选)

如果要在目标账号使用不同的KMS密钥重新加密,则执行本步骤:

# 在目标账号创建新的KMS密钥
aws kms create-key \
    --description "Key for receiving cross-account snapshot copy" \
    --region <AWS-REGION>

步骤3:为加密EBS卷创建快照

实际场景中直接对需要复制的 EBS 卷进行快照操作。

# 创建加密EBS卷 (可选)
aws ec2 create-volume \
    --volume-type gp3 \
    --size 8 \
    --availability-zone <AWS-REGION>a \
    --kms-key-id <SOURCE-KMS-KEY-ID> \
    --tag-specifications 'ResourceType=volume,Tags=[{Key=Name,Value=test-encrypted-volume}]'

# 创建快照
aws ec2 create-snapshot \
    --volume-id <VOLUME-ID> \
    --description "Test encrypted snapshot for cross-account copy" \
    --tag-specifications 'ResourceType=snapshot,Tags=[{Key=Name,Value=test-encrypted-snapshot}]'

步骤4:跨账号复制快照

⚠️ 注意:必须先在源账号分享快照给目标账号。直接跨账号复制会失败,错误信息为"Source snapshot is not found"。

4.1 在源账号分享快照

# 分享快照给目标账号
aws ec2 modify-snapshot-attribute \
    --snapshot-id <SOURCE-SNAPSHOT-ID> \
    --attribute createVolumePermission \
    --operation-type add \
    --user-ids <TARGET-ACCOUNT-ID> \
    --region <AWS-REGION>

4.2 在目标账号复制共享快照

# 在目标账号复制共享的快照
aws ec2 copy-snapshot \
    --source-region <AWS-REGION> \
    --source-snapshot-id <SOURCE-SNAPSHOT-ID> \
    --description "Cross-account copy of shared encrypted snapshot" \
    --kms-key-id <TARGET-KMS-KEY-ID> \
    --region <AWS-REGION>

注意:对于加密快照,不需要显式添加--encrypted参数,AWS会自动处理。

步骤5:验证复制结果

# 检查复制状态
aws ec2 describe-snapshots \
    --snapshot-ids <COPIED-SNAPSHOT-ID> \
    --region <AWS-REGION>

# 验证快照可以创建卷
aws ec2 create-volume \
    --snapshot-id <COPIED-SNAPSHOT-ID> \
    --availability-zone <AWS-REGION>a \
    --volume-type gp3 \
    --region <AWS-REGION>

成功情况

  • 源快照:<SOURCE-SNAPSHOT-ID> (源账号)
  • 复制快照:<COPIED-SNAPSHOT-ID> (目标账号)
  • 复制状态:completed (100%)
  • 卷创建:成功

步骤6:清理(可选)

# 取消快照分享
aws ec2 modify-snapshot-attribute \
    --snapshot-id <SOURCE-SNAPSHOT-ID> \
    --attribute createVolumePermission \
    --operation-type remove \
    --user-ids <TARGET-ACCOUNT-ID> \
    --region <AWS-REGION>

# 删除测试资源
aws ec2 delete-volume --volume-id <VOLUME-ID>
aws ec2 delete-snapshot --snapshot-id <SNAPSHOT-ID>
aws kms schedule-key-deletion --key-id <KMS-KEY-ID> --pending-window-in-days 7

注意事项

  1. KMS密钥类型限制:根据AWS官方文档,只能分享使用客户托管密钥加密的快照,不能分享使用AWS托管密钥加密的快照
  2. 必须先分享:不能直接跨账号复制,必须先分享快照
  3. 权限要求:目标账号需要源KMS密钥的使用权限
  4. 成本考虑:跨账号复制会产生完整副本,不是增量复制
  5. 区域限制:快照复制受区域限制,跨区域需要额外步骤
  6. 安全考虑:分享快照等于分享所有数据,谨慎操作
  7. 自动加密:复制加密快照时会自动使用目标KMS密钥重新加密

故障排除

常见错误

  1. "Source snapshot is not found"

    • 解决方案:必须先在源账号分享快照给目标账号
    • 使用modify-snapshot-attribute命令分享
  2. "You can't share snapshots that are encrypted with the default AWS managed key"

    • 原因:快照使用了AWS托管密钥 (aws/ebs) 加密
    • 解决方案:重新创建使用客户托管密钥加密的快照
  3. "Given key ID is not accessible"

    • 检查KMS密钥策略是否正确配置
    • 确认目标账号有密钥使用权限
  4. "You are not authorized to perform this operation"

    • 检查IAM权限
    • 确认快照分享权限
  5. "The parameter KmsKeyId requires the parameter Encrypted to be set"

    • 对于加密快照复制,通常不需要显式设置encrypted参数
    • AWS会自动处理加密快照的复制

参考文档

Next Post Previous Post
No Comment
Add Comment
comment url