Saltar al contenido

¿Por qué mi usuario o rol de IAM no puede iniciar una instancia de EC2 si tengo todos los permisos de Amazon EC2 ?

5 minutos de lectura
0

Mi entidad de AWS Identity and Access Management (IAM) tiene permisos para acceder a una instancia de Amazon Elastic Compute Cloud (Amazon EC2). Intenté iniciar la instancia, pero pasó del estado Pendiente a Detenida.

Resolución

Determinación de la causa del estado de detención de tu instancia de EC2

Nota: Si se muestran errores al ejecutar comandos de la Interfaz de la línea de comandos de AWS (AWS CLI), consulta Solución de problemas de AWS CLI. Además, asegúrate de utilizar la versión más reciente de AWS CLI.

Si adjuntaste un volumen de Amazon Elastic Block Store (Amazon EBS) a tu instancia de EC2, comprueba el cifrado del volumen. Si cifraste el volumen de EBS con una clave de AWS Key Management Service (AWS KMS), es posible que haya un problema de permisos. La entidad principal de IAM que llama a la acción de la API StartInstances debe tener los permisos kms:CreateGrant para crear una concesión para Amazon EC2. La concesión permite a Amazon EC2 descifrar la clave de datos del volumen con tu clave de AWS KMS.

Los volúmenes de EBS envían una llamada a la API GenerateDataKeyWithoutPlaintext a AWS KMS que crea una nueva clave de datos y la cifra en la clave de AWS KMS. AWS KMS envía la clave de datos cifrada al volumen de EBS. A continuación, el volumen adjunta la clave de datos a la instancia. La clave de datos está presente en la misma cuenta de AWS que la instancia y la clave de AWS KMS.

Para determinar por qué la instancia está detenida, ejecuta el comando describe-instances de AWS CLI:

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

Nota: Sustituye your-instance-id por el id. de tu instancia.

Resultado de ejemplo:

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

El error anterior puede indicar que has cifrado el volumen raíz o los volúmenes adjuntos adicionales. No tienes permiso para acceder a la clave de AWS KMS para descifrarla.

También puedes filtrar los eventos de AWS CloudTrail por el nombre del evento CreateGrant.

Resultado de ejemplo:

"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"

El error anterior significa que la entidad principal de IAM no tiene el permiso CreateGrant para que Amazon EC2 descifre la clave de datos. Por lo tanto, la instancia no puede iniciarse.

Nota: Si utilizas una clave administrada de AWS, este error solo se produce si hay una denegación explícita en las políticas de IAM o en la política de control de servicio (SCP) de la entidad principal. No necesitas permisos de IAM adicionales para usar las claves administradas de AWS.

Búsqueda del tipo de clave de AWS KMS

Sigue estos pasos:

  1. Abre la consola de Amazon EC2.
  2. En el panel de navegación, selecciona Instancias.
  3. Selecciona el id. de la instancia y, a continuación, elige Almacenamiento.
  4. En Id. de volumen, selecciona el id. de volumen del volumen cifrado.
  5. En Id. de clave de KMS, copia el id. de clave de AWS KMS.
  6. Abre la consola de AWS KMS en la misma región de AWS.
  7. En el panel de navegación, selecciona Claves administradas por el cliente. A continuación, busca el id. de clave de AWS KMS en el paso 4.
  8. Selecciona el id. de clave de AWS KMS.
  9. En la sección Descripción, busca Configuración general y anota el tipo de clave de AWS KMS.

Incorporación de una política de IAM

Adjunta una política de IAM a la entidad principal de IAM que sea similar a la del siguiente ejemplo:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "kms:CreateGrant"
      ],
      "Resource": [
        "arn:aws:kms:region:123456789012:key/ExampleKey"
      ],
      "Condition": {
        "Bool": {
          "kms:GrantIsForAWSResource": true
        }
      }
    }
  ]
}

La clave de condición kms:GrantIsForAWSResource garantiza que la entidad principal de IAM solo cree concesiones para la clave de AWS KMS con recursos de AWS. Esta política no permite que la entidad principal de IAM cree concesiones para otra entidad principal de IAM. Para restringir el acceso a Amazon EC2, usa la clave de condición kms:ViaService.

Debes activar los permisos de IAM que añadas a la entidad principal de IAM mediante la política de claves de tu cuenta, tal como se muestra en el siguiente ejemplo:

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

También puedes añadir la entidad principal de IAM en la política de claves para permitir la acción de la API CreateGrant.

Si la clave de AWS KMS y la entidad principal de IAM están en la misma cuenta, puedes incluir la entidad principal de forma explícita en la política de claves. No necesitas permisos de IAM para acceder a la clave de AWS KMS.

Para conceder permisos explícitos a través de la política de claves, agrega la siguiente declaración a tu política de claves:

{
  "Principal": {
    "AWS": "arn:aws:iam::123456789012:role/Role_Name"
  },
  "Effect": "Allow",
  "Action": [
    "kms:CreateGrant"
  ],
  "Resource": [
    "*"
  ],
  "Condition": {
    "Bool": {
      "kms:GrantIsForAWSResource": true
    }
  }
}

Se recomienda conceder el privilegio mínimo a los permisos necesarios para realizar una tarea.

Si usas grupos de escalamiento automático de Amazon EC2 para crear tus instancias, consulta Política de claves obligatoria de AWS KMS para su uso con volúmenes cifrados.

Información relacionada

Cifrado de Amazon EBS

La instancia termina inmediatamente

OFICIAL DE AWSActualizada hace 9 meses