我无法通过 Amazon EC2 Auto Scaling 使用加密 AMI 或加密卷启动 EC2 实例
上次更新时间:2021 年 10 月 12 日
Amazon Elastic Compute Cloud(Amazon EC2)Auto Scaling 无法使用加密的 Amazon Machine Image(AMI)或加密卷启动实例。创建 Amazon EC2 Auto Scaling 时所用的 AWS Identity and Access Management(IAM)身份(用户、角色)具有管理员权限。
简短描述
Amazon EC2 Auto Scaling 使用服务相关角色来获得调用其他 AWS 服务所需的权限。SLR 的权限由 AWS 进行硬编码,无法更改。默认情况下,提供给 Amazon EC2 Auto Scaling SLR 的权限不包括访问 AWS KMS 密钥的权限。
您可以使用 AWS 托管密钥或客户管理的密钥通过 Amazon EC2 Auto Scaling 对 Amazon Elastic Block Store(Amazon EBS)卷或 AMI 进行加密。Amazon EC2 Auto Scaling 不需要额外的权限即可使用 AWS 托管密钥。但是,Amazon EC2 Auto Scaling SLR 必须拥有对客户管理的密钥的额外权限。
解决方法
根据 Amazon EC2 Auto Scaling 所使用的客户管理的密钥是在同一账户中还是在外部 AWS 账户中,按照下面的相应说明操作。
注意:
- 下面的示例使用默认的 Amazon EC2 Auto Scaling SLR AWSServiceRoleForAutoScaling,当然您也可以创建一个唯一角色名称。
- 如果您在运行 AWS 命令行界面 (AWS CLI) 命令时收到错误,请确保您运行的是最新版本的 AWS CLI。
- AWS KMS 授权必须从拥有 Amazon EC2 Auto Scaling 组的账户而非 AWS KMS 账户创建。有关更多信息,请参阅使用授权。
Amazon EC2 Auto Scaling 使用同一 AWS 账户中的客户管理的密钥
按照更改密钥策略的说明操作,并添加以下示例语句:
注意:将 123456789012 替换为部署了 Amazon EC2 Auto Scaling 组的账户 ID。
{
"Sid": "Allow service-linked role use of the KMS",
"Effect": "Allow",
"Principal": {
"AWS": [
"arn:aws:iam::123456789012:role/aws-service-role/autoscaling.amazonaws.com/AWSServiceRoleForAutoScaling"
]
},
"Action": [
"kms:Encrypt",
"kms:Decrypt",
"kms:ReEncrypt*",
"kms:GenerateDataKey*",
"kms:DescribeKey"
],
"Resource": "*"
},
{
"Sid": "Allow attachment of persistent resources",
"Effect": "Allow",
"Principal": {
"AWS": [
"arn:aws:iam::123456789012:role/aws-service-role/autoscaling.amazonaws.com/AWSServiceRoleForAutoScaling"
]
},
"Action": [
"kms:CreateGrant"
],
"Resource": "*",
"Condition": {
"Bool": {
"kms:GrantIsForAWSResource": true
}
}
}
Amazon EC2 Auto Scaling 使用外部 AWS 账户中存在的客户管理的密钥
1. 遵循更改密钥策略的说明。修改密钥策略以向外部 AWS 账户中存在的 IAM 实体授予执行 CreateGrant API 操作的权限:
{
"Sid": "Allow external account 111122223333 use of the KMS",
"Effect": "Allow",
"Principal": {
"AWS": [
"arn:aws:iam::111122223333:root"
]
},
"Action": [
"kms:Encrypt",
"kms:Decrypt",
"kms:ReEncrypt*",
"kms:GenerateDataKey*",
"kms:DescribeKey"
],
"Resource": "*"
},
{
"Sid": "Allow attachment of persistent resources in external account 111122223333",
"Effect": "Allow",
"Principal": {
"AWS": [
"arn:aws:iam::111122223333:root"
]
},
"Action": [
"kms:CreateGrant"
],
"Resource": "*"
}
2. 借助 Amazon EC2 Auto Scaling 组的 AWS 账户中存在的 IAM 实体的凭证使用 AWS CLI 命令 create-grant。
注意:将 444455556666 替换为 KMS 密钥所在的账户 ID。
$ aws kms create-grant --key-id arn:aws:kms:us-west-2:444455556666:key/1a2b3c4d-5e6f-1a2b-3c4d-5e6f1a2b3c4d --grantee-principal arn:aws:iam::111122223333:role/aws-service-role/autoscaling.amazonaws.com/AWSServiceRoleForAutoScaling --operations Decrypt GenerateDataKeyWithoutPlaintext ReEncryptFrom ReEncryptTo CreateGrant
注意:请确保 IAM 实体拥有执行 CreateGrant API 操作的权限。如果 CreateGrant 权限缺失,则向 IAM 实体的附加策略中添加以下语句:
{
"Sid": "AllowCreationOfGrantForTheKMSinExternalAccount444455556666",
"Effect": "Allow",
"Action": "kms:CreateGrant",
"Resource": "arn:aws:kms:us-west-2:444455556666:key/1a2b3c4d-5e6f-1a2b-3c4d-5e6f1a2b3c4d"
}