Escenario
Una de nuestra aplicaciones web usa el servicio de almacenaje del webservice s3 de Amazon para guardar los ficheros que se suben a la web. Para ello el usuario dispone de un formulario y, una vez enviado, la aplicación utiliza el API de AWS para guardarlo en su bucket de s3.Problema
En ningún momento se expone la dirección de s3, del tipo https://s3.eu-central-1.amazonaws.com/acme-documents/4e8c61c7ca8ca26ed8a3d4eac6123226, porque las peticiones de descarga de la aplicación pasan por un controlador, accesible desde https://acme.com/file/3/download, que de manera interna invoca un servicio que se encarga de solicitar el fichero a AWS para que lo devuelva el controlador. Ahora bien, el bucket de s3 es público y no dispone de ninguna restricción por ACL, de modo que si alguien se hiciera con la URL podría descargarse el fichero. Una manera de solucionarlo sería definiendo los controles de acceso, pero para ello habría que actualizar el código que ya está desplegado en producción.Solución
A parte de definir una política de acceso al bucket con ACL, s3 también permite restringir el acceso a cualquier dirección que no haya sido especificada. Para ello basta con entrar en la consola de AWS de s3 y sustituir el bucket policy por un JSON de este tipo:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
{ "Version": "2012-10-17", "Statement": [ { "Sid": "Statement1", "Effect": "Deny", "Principal": "*", "Action": "s3:*", "Resource": [ "arn:aws:s3:::acme-documents", "arn:aws:s3:::acme-documents/*" ], "Condition": { "NotIpAddress": { "aws:SourceIp": [ "111.111.111.111/32", "222.222.222.222/32" ] } } } } |