¿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
| Palabra | Qué significa | Ejemplo |
|---|---|---|
| Política | un documento que lista lo que se puede y no se puede hacer | |
| Declaración | una regla dentro de una política | Statement |
| Efecto | si una declaración permite o deniega | Allow |
| Acción | la llamada que se hace | s3:GetObject |
| Recurso | aquello sobre lo que se hace la llamada | |
| Mínimo privilegio | dar 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
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ón | Texto | ¿Coincide? |
|---|---|---|
| s3:* | s3:GetObject | Sí |
| s3:* | sqs:SendMessage | No, no empieza por s3: |
| s3:Get* | s3:GetObject | Sí |
| s3:Get* | s3:PutObject | No |
| fotos/* | fotos/ | Sí, el asterisco no coincide con nada |
| *.jpg | gato.jpg | Sí |
| s3:GetObject | s3:GetObjectAcl | No, 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
| Llamada | Declaraciones que coinciden | Resultado |
|---|---|---|
| s3:GetObject sobre fotos-demo/gato.jpg | Solo Allow | Permitida |
| s3:GetObject sobre fotos-demo/privado/dni.jpg | Allow y Deny | Rechazada: gana el deny explícito |
| sqs:SendMessage sobre una cola | Ninguna | Rechazada: 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
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.