amazon web services - Política mínima de IAM para ec2: RunInstances
amazon-web-services amazon-ec2 (1)
Estoy tratando de reducir la política mínima para ejecutar una imagen de máquina predefinida. La imagen se basa en dos instantáneas y solo quiero que se inicien los tipos de instancia "m1.medium".
Basándome en eso y con la ayuda de esta página y este artículo , elaboré la siguiente política:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Stmt1385026304010",
"Effect": "Allow",
"Action": [
"ec2:RunInstances"
],
"Condition": {
"StringEquals": {
"ec2:InstanceType": "m1.medium"
}
},
"Resource": [
"arn:aws:ec2:us-east-1::instance/*",
"arn:aws:ec2:us-east-1::image/ami-f1c3e498",
"arn:aws:ec2:us-east-1::snapshot/snap-e2f51ffa",
"arn:aws:ec2:us-east-1::snapshot/snap-18ca2000",
"arn:aws:ec2:us-east-1::key-pair/shenton",
"arn:aws:ec2:us-east-1::security-group/sg-6af56d02",
"arn:aws:ec2:us-east-1::volume/*"
]
}
]
}
La política reduce la imagen exacta, las instantáneas, el grupo de seguridad y el par de claves, dejando abierta la instancia específica y el volumen.
Estoy usando las herramientas CLI de la siguiente manera, como se describe here :
aws ec2 run-instances --dry-run /
--image-id ami-f1c3e498 /
--key-name shenton /
--security-group-ids sg-6af56d02 /
--instance-type m1.medium
El ~/.aws/config
es el siguiente:
[default]
output = json
region = us-east-1
aws_access_key_id = ...
aws_secret_access_key = ...
El comando da como resultado un mensaje genérico. You are not authorized to perform this operation
mensaje de You are not authorized to perform this operation
y el mensaje de error de autorización codificado indica que ninguna de mis declaraciones coincidió y, por lo tanto, rechaza la acción.
Cambiar a "Resource": "*"
resuelve el problema obviamente, pero quiero comprender mejor por qué lo anterior no funciona. Me doy cuenta de que esto implica cierto grado de trabajo de adivinación, por lo que doy la bienvenida a cualquier idea
Jeff Barr me contactó de Amazon Web Services y él me ayudó amablemente a descubrir cuál era el problema.
Primero debe decodificar el mensaje de error de autorización utilizando la siguiente declaración:
$ aws sts decode-authorization-message --encoded-message 6gO3mM3p....IkgLj8ekf
Asegúrese de que el usuario / rol IAM tenga permiso para la acción sts:DecodeAuthorizationMessage
.
La respuesta contiene una clave DecodedMessage
comprende otro cuerpo codificado JSON:
{
"allowed": false,
"explicitDeny": false,
"matchedStatements": {
"items": []
},
"failures": {
"items": []
},
"context": {
"principal": {
"id": "accesskey",
"name": "testuser",
"arn": "arn:aws:iam::account:user/testuser"
},
"action": "ec2:RunInstances",
"resource": "arn:aws:ec2:us-east-1:account:instance/*",
"conditions": { ... }
}
}
Bajo context => resource
mostrará el recurso que estaba intentando hacer coincidir con la política; Como puedes ver, espera un número de cuenta. Por lo tanto, la documentación de arn debe leerse como:
A menos que se especifique lo contrario, la región y la cuenta son obligatorias.
Agregar el número de cuenta o *
en los ARN afectados solucionó el problema:
"Resource": [
"arn:aws:ec2:us-east-1:*:instance/*",
"arn:aws:ec2:us-east-1:*:image/ami-f1c3e498",
"arn:aws:ec2:us-east-1:*:snapshot/snap-e2f51ffa",
"arn:aws:ec2:us-east-1:*:snapshot/snap-18ca2000",
"arn:aws:ec2:us-east-1:*:key-pair/shenton",
"arn:aws:ec2:us-east-1:*:security-group/sg-6af56d02",
"arn:aws:ec2:us-east-1:*:volume/*"
]