Restringir acceso a un bucket de AWS s3 por IP

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: Como se puede leer, el efecto de esta regla es denegar el acceso a los recursos especificados para las direcciones IPS que no hayan sido autorizadas. En la clave Resource se listan los buckets afectados, con el formato nombre-del-bucket precedido por arn:aws:s3::: En la clave aws:SoruceIp de la condición NotIpAddress hay que listar las direcciones IPS en formato CIDR

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *