为什么拥有完全 Amazon EC2 权限的 IAM 用户或角色无法启动 EC2 实例?

2 分钟阅读
0

我的 AWS Identity and Access Management(IAM)实体(用户、组、角色)拥有对 Amazon Elastic Compute Cloud(Amazon EC2)实例的完全权限。我尝试启动 Amazon EC2 实例,但它已从“待处理”状态更改为“已停止”。

简短描述

检查实例是否附加了 Amazon Elastic Block Store(Amazon EBS)。如果使用 AWS Key Management Service(AWS KMS)密钥对 Amazon EBS 卷进行加密,则可能存在权限问题。调用 StartInstances API 操作的 IAM 实体必须有权为 Amazon EC2 服务创建授权。该授权允许 Amazon EC2 解密 AWS KMS 密钥(KMS 密钥)。

Amazon EBS 卷向 AWS KMS 发送一个 GenerateDataKeyWithoutPlaintext API 调用请求,该请求会创建一个新的数据密钥并在 KMS 密钥中对其进行加密。加密的数据密钥被发送回 Amazon EBS 卷,然后附加到 Amazon EC2 实例。对于这种情况,KMS 密钥存在于 EC2 实例和 KMS 密钥的同一 AWS 账户中。

**注意:**如果您在运行 AWS Command Line Interface(AWS CLI)命令时收到错误消息,请确保您使用的是最新版本的 AWS CLI

1.要确认 Amazon EC2 实例为何处于“已停止”状态,请运行类似于以下内容的 AWS CLI 命令:

aws ec2 describe-instances --instance-id your-instance_ID --query "Reservations[*].Instances[*].StateReason"

示例输出:

[
  [
    {
      "Message": "Client.InternalError: Client error on launch",
      "Code": "Client.InternalError"
    }
  ]
]

此错误意味着根卷或其他附加的卷已加密。您无权访问 AWS KMS 密钥进行解密。

2.(可选)按照为事件名称 CreateGrant 筛选 AWS CloudTrail 事件的说明进行操作。

示例输出:

"errorMessage": "User: arn:aws:iam::123456789012:user/test is not authorized to perform: kms:CreateGrant on resource: arn:aws:kms:eu-west-1:123456789012:key/8e3426b8-87b4-434c-ae74-8e63dadf354a"

此错误意味着 IAM 实体没有 Amazon EC2 的 CreateGrant 权限来解密数据密钥,因此实例无法启动。

解决方法

要查找密钥类型,请执行以下步骤:

1.    打开 Amazon EC2 控制台,然后选择实例

2.    在 Instance ID(实例 ID)中,选择 Amazon EC2 实例 ID,然后选择 Storage(存储)选项卡。

3.    在 Volume ID(卷 ID)中,选择加密卷的卷 ID。

4.    在 KMS key ID(KMS 密钥 ID)中,复制密钥 ID。

5.    在同一 AWS 区域中打开 AWS KMS 控制台

6.    在 AWS managed keys(AWS 托管密钥)和 Customer managed keys(客户托管密钥)中,粘贴步骤 4 中的 KMS 密钥 ID。

7.    选择密钥 ID。

8.    在 Description(描述)下的 General configuration(常规配置)中,记下 KMS 密钥类型。

将 IAM 策略附加到 IAM 实体,如下所示:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "kms:CreateGrant"
      ],
      "Resource": [
        "arn:aws:kms:eu-west-1:123456789012:key/8e3426b8-87b4-434c-ae74-8e63dadf354a"
      ],
      "Condition": {
        "Bool": {
          "kms:GrantIsForAWSResource": true
        }
      }
    }
  ]
}

kms:GrantIsForAWSResource 条件密钥确保 IAM 实体只能使用 EC2 实例等 AWS 资源为 KMS 密钥创建授权。此策略不允许 IAM 实体为其他 IAM 实体创建授权。

(可选)允许 AWS 账户根用户账户完全访问 KMS 密钥,如下所示:

{
  "Sid": "Enable IAM User Permissions",
  "Effect": "Allow",
  "Principal": {"AWS": "arn:aws:iam::123456789012:root"},
  "Action": "kms:*",
  "Resource": "*"
}

您还可以在 KMS 密钥策略中添加 IAM 实体,以允许 CreateGrant API 操作。

注意:


相关信息

EBS 加密的工作原理

实例立即终止

AWS 官方
AWS 官方已更新 2 年前