¿Te resulta más fácil leer con fondo crema, un tono de color, más contraste o un texto más grande? Elige tus colores y tu texto una sola vez, para todas las páginas.

Lección gratuita

Políticas de IAM: quién puede qué

Después de esta lección: Puedo leer una política y decir si una llamada se permite.

Lección de 55 minSin comandos

¿Quién decide qué puerta se abre?

El carné de estudiante abre la puerta de la biblioteca, pero no la sala de profesores. Alguien anotó qué puertas abre cada carné.

En la nube pasa igual. Una política de IAM es la lista escrita de lo que una persona o un programa puede hacer. Esta lección enseña a leer una política y a decir si una llamada se permite.

Al final de esta lección

Nota

Puedo leer una política y decir si una llamada se permite.

Palabras clave

PalabraQué significaEjemplo
Políticaun documento que lista lo que se puede y no se puede hacer
Declaraciónuna regla dentro de una políticaStatement
Efectosi una declaración permite o deniegaAllow
Acciónla llamada que se haces3:GetObject
Recursoaquello sobre lo que se hace la llamada
Mínimo privilegiodar solo el acceso que necesita una tarea

Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.

Una política es una lista de declaraciones

Una política es un documento JSON. Tiene una Version y una lista llamada Statement. Cada declaración dice tres cosas: el efecto, la acción y el recurso.

El efecto es Allow o Deny. La acción es la llamada, como s3:GetObject, que lee un archivo. El recurso es aquello sobre lo que se hace la llamada, y se nombra con un texto largo llamado ARN. Estas políticas son inventadas. Aquí no hace falta ninguna cuenta.

Pruébalo: lee una política

Código: python
policy = {
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": ["s3:GetObject", "s3:PutObject"],
            "Resource": "arn:aws:s3:::fotos-demo/*",
        },
        {
            "Effect": "Deny",
            "Action": "s3:*",
            "Resource": "arn:aws:s3:::fotos-demo/privado/*",
        },
    ],
}

for statement in policy["Statement"]:
    print(statement["Effect"], statement["Action"], statement["Resource"])
# Cambia "Deny" por "Allow". El programa sigue leyéndola. ¿Cambia el significado?

Un asterisco coincide con cualquier tramo

Escribir cada nombre de archivo llevaría una eternidad. Por eso un patrón puede llevar un asterisco. Un asterisco coincide con cualquier tramo de caracteres, incluso con ninguno.

El recurso "arn:aws:s3:::fotos-demo/" coincide con todos los objetos de ese bucket. La acción "s3:" coincide con todas las llamadas de S3. Un patrón sin asterisco debe coincidir exactamente con el texto.

Ejemplo resuelto: con qué textos coincide un patrón

PatrónTexto¿Coincide?
s3:*s3:GetObjectSí
s3:*sqs:SendMessageNo, no empieza por s3:
s3:Get*s3:GetObjectSí
s3:Get*s3:PutObjectNo
fotos/*fotos/Sí, el asterisco no coincide con nada
*.jpggato.jpgSí
s3:GetObjects3:GetObjectAclNo, sin asterisco es exacto

Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.

Un deny siempre gana

Para decidir una llamada, busca las declaraciones cuya acción y cuyo recurso coinciden con ella. Después aplica tres reglas.

Si alguna declaración que coincide dice Deny, la llamada se rechaza. Es un deny explícito y gana a todos los Allow. Si ninguna deniega pero una permite, la llamada se permite. Si no coincide nada, la llamada se rechaza igualmente. Es un deny implícito.

Ejemplo resuelto: tres llamadas a la política

LlamadaDeclaraciones que coincidenResultado
s3:GetObject sobre fotos-demo/gato.jpgSolo AllowPermitida
s3:GetObject sobre fotos-demo/privado/dni.jpgAllow y DenyRechazada: gana el deny explícito
sqs:SendMessage sobre una colaNingunaRechazada: deny implícito

Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.

Un error frecuente

Advertencia

Mucha gente cree que una llamada se permite salvo que una política la prohíba. Es al revés. Una llamada se rechaza salvo que una declaración la permita, y un Deny gana a cualquier Allow.

Pruébalo: las tres reglas en código

Código: python
matched = ["Allow", "Deny"]

if "Deny" in matched:
    result = "rechazada: deny explícito"
elif "Allow" in matched:
    result = "permitida"
else:
    result = "rechazada: deny implícito"
print(result)
# Cambia matched a ["Allow"] y después a []. ¿Qué muestra cada uno?

Da lo mínimo que funciona

Un sitio de fotos necesita leer y añadir fotos. No necesita borrarlas ni tocar las colas. Por eso su política nombra solo esas dos acciones, y solo sobre ese bucket.

Esto es el mínimo privilegio. Si alguien usa mal el sitio, el daño se detiene en lo que la política permitía.

¿Enseñas a una clase? Asigna este módulo a tus alumnos con guía del profesor, tareas con corrección automática y un laboratorio para cada alumno.