¿Cómo puedo usar las etiquetas de políticas de IAM para restringir la forma en que se puede crear una instancia de EC2 o un volumen de EBS?

5 minutos de lectura
0

Quiero conceder acceso a usuarios o grupos de AWS Identity and Access Management (IAM) para que lancen nuevas instancias de Amazon Elastic Compute Cloud (Amazon EC2). También quiero conceder acceso a usuarios de IAM para que creen nuevos volúmenes de Amazon Elastic Block Store (Amazon EBS), pero solo cuando apliquen etiquetas específicas.

Breve descripción

Especifique etiquetas para las instancias de EC2 y los volúmenes de EBS como parte de la llamada a la API con la que se crearán los recursos. De este modo, puede exigir a los usuarios de IAM que etiqueten recursos concretos mediante la aplicación de condiciones a su política de IAM. En los siguientes ejemplos de políticas no se permite que los usuarios creen grupos de seguridad ni pares de claves, por lo que deberán seleccionar grupos de seguridad y pares de claves preexistentes.

En los siguientes ejemplos de políticas de IAM se permite que los usuarios lleven a cabo las siguientes acciones:

  • Lanzamiento de instancias de EC2 que tengan valores y claves de etiqueta coincidentes
  • Lanzamiento de instancias de EC2 que tengan al menos una etiqueta y un valor coincidentes
  • Inicio de instancias de EC2 que tengan al menos una clave de etiqueta coincidente
  • Inicio de instancias de EC2 que solo tengan la lista de etiquetas especificada

Solución

Lanzamiento de instancias de EC2 que tengan valores y claves de etiqueta coincidentes

En el siguiente ejemplo de política se permite que un usuario lance una instancia de EC2 y cree un volumen de EBS solo si el usuario aplica todas las etiquetas definidas en la política mediante el calificador ForAllValues. Si el usuario aplica una etiqueta que no está incluida en la política, se le denegará la acción. Para imponer la distinción entre mayúsculas y minúsculas, utilice la condición aws:TagKeys.

Nota: Modifique key1 y value1 en las políticas de ejemplo para incluir las etiquetas y valores aplicables a sus recursos:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "AllowToDescribeAll",
      "Effect": "Allow",
      "Action": [
        "ec2:Describe*"
      ],
      "Resource": "*"
    },
    {
      "Sid": "AllowRunInstances",
      "Effect": "Allow",
      "Action": "ec2:RunInstances",
      "Resource": [
        "arn:aws:ec2:*::image/*",
        "arn:aws:ec2:*::snapshot/*",
        "arn:aws:ec2:*:*:subnet/*",
        "arn:aws:ec2:*:*:network-interface/*",
        "arn:aws:ec2:*:*:security-group/*",
        "arn:aws:ec2:*:*:key-pair/*"
      ]
    },
    {
      "Sid": "AllowRunInstancesWithRestrictions",
      "Effect": "Allow",
      "Action": [
        "ec2:CreateVolume",
        "ec2:RunInstances"
      ],
      "Resource": [
        "arn:aws:ec2:*:*:volume/*",
        "arn:aws:ec2:*:*:instance/*",
        "arn:aws:ec2:*:*:network-interface/*"
      ],
      "Condition": {
        "StringEquals": {
          "aws:RequestTag/key1": "value1",
          "aws:RequestTag/key2": "value2"
        },
        "ForAllValues:StringEquals": {
          "aws:TagKeys": [
            "key1",
            "key2"
          ]
        }
      }
    },
    {
      "Sid": "AllowCreateTagsOnlyLaunching",
      "Effect": "Allow",
      "Action": [
        "ec2:CreateTags"
      ],
      "Resource": [
        "arn:aws:ec2:*:*:volume/*",
        "arn:aws:ec2:*:*:instance/*",
        "arn:aws:ec2:*:*:network-interface/*"
      ],
      "Condition": {
        "StringEquals": {
          "ec2:CreateAction": [
            "RunInstances",
            "CreateVolume"
          ]
        }
      }
    }
  ]
}

Importante: Para poder lanzar instancias de EC2 correctamente, esta política debe incluir valores y claves de etiqueta que coincidan. Si los pares de claves y valores no coinciden, se mostrará «Launch Failed» o algún otro mensaje de error de API similar.

Resultados del ejemplo

Clave/ValorResultado
key1/value1 y key2/value2allow
key1/value1deny
key1/value2deny
sin claves ni valoresdeny

Lanzamiento de instancias de EC2 que tengan al menos una etiqueta y un valor coincidentes

En el siguiente ejemplo, sustituya el bloque de condiciones AllowRunInstancesWithRestrictions para permitir que un usuario lance una instancia de EC2 y cree volúmenes de EBS cuando al menos una clave de etiqueta se denomine key1 y tenga el valor value1. Se pueden añadir tantas etiquetas como se desee mediante la solicitud RunInstances:

"Condition": {
  "StringEquals": {
    "aws:RequestTag/key1": "value1"
  },
  "ForAnyValue:StringEquals": {
    "aws:TagKeys": [
      "key1"
    ]
  }
}

Resultados del ejemplo

Clave/ValorResultado
key1/value1 y key2/value2allow
key1/value1allow
key1/value2deny
sin claves ni valoresdeny

Inicio de instancias de EC2 que tengan al menos una clave de etiqueta coincidente

En el siguiente ejemplo de política, sustituya el bloque de condiciones AllowRunInstancesWithRestrictions para permitir que un usuario lance una instancia de EC2 y cree volúmenes de EBS cuando al menos una clave de etiqueta se denomine key1. No se requiere ningún valor específico para la etiqueta key1. Se pueden añadir tantas etiquetas como se desee mediante la solicitud RunInstances.

"Condition": {
  "ForAnyValue:StringEquals": {
    "aws:TagKeys": [
      "key1"
    ]
  }
}

Resultados del ejemplo

Clave/ValorResultado
key1/value1 y key2/value2allow
key1/value1allow
key1/value2allow
sin claves ni valoresdeny

Inicio de instancias de EC2 que solo tengan la lista de etiquetas especificada

En el siguiente ejemplo de política, sustituya el bloque de condiciones AllowRunInstancesWithRestrictions para permitir que un usuario lance una instancia de EC2 y cree volúmenes de EBS solo si en la solicitud se han facilitado las claves de etiqueta key1 y key2. No se requiere ningún valor específico para ninguna de las claves de etiqueta; no se pueden añadir etiquetas adicionales mediante la solicitud RunInstances:

"Condition": {
  "StringLike": {
      "aws:RequestTag/key1": "*",
      "aws:RequestTag/key2": "*"
  },
  "ForAllValues:StringEquals": {
    "aws:TagKeys": [
        "key1",
        "key2"
    ]
  }
}

Nota: La condición StringLike es obligatoria a fin de garantizar que todas las etiquetas estén presentes.

Resultados del ejemplo

Clave/ValorResultado
key1/CualquierValor y key2/CualquierValorAllow
key1/CualquierValorDeny
key2/CualquierValorDeny
Sin claves ni valoresDeny
key1/CualquierValor, key2/CualquierValor, key3/CualquierValorDeny

Información relacionada

How do I create an IAM policy to control access to Amazon EC2 resources using tags?

Creación de una condición con varias claves o valores

Ejemplos de políticas basadas en identidad de IAM

Etiquetado de los recursos de Amazon EC2

Acciones, recursos y claves de condición para Amazon EC2

OFICIAL DE AWS
OFICIAL DE AWSActualizada hace un año