Amazon S3: Restringir el acceso de un bucket a un solo usuario

Hoy estaba implementando la funcionalidad de subir un logo para las facturas de mi aplicación de facturación por lo que he tenido que crear un bucket en Amazon S3 para guardar todos los logos de los diferentes usuarios. Ya tengo otro bucket para guardar las imágenes de este blog por lo que me he preguntado: ¿A nivel de seguridad, cómo lo hago para que si por lo que fuera alguien hiciese una petición a la API de la aplicación de facturación intentando eliminar un fichero del bucket del blog, no pudiera hacerlo?

 

Entendiendo S3 y IAM en AWS.

Amazon Web Services es un conjunto de herramientas basadas en la nube por parte de Amazon. La herramienta que nos ocupa esta vez es S3 (Simple Storage Service), la cual nos permite almacenar ficheros estáticos a través de servicios REST, entre otros. Pues bien, para tener este servico simplemente tenéis que abrir una cuenta en AWS y empezar a crear buckets.

Lo interesante de S3 es que permite acceso programático a través de REST con un conjunto de API keys, facilitando la integración con las aplicaciones que desarrollemos. El problema es que si no nos encargamos de cuidar los permisos sobre nuestros diferentes buckets, por defecto, con un solo conjunto de API Keys podríamos acceder a cualquier bucket.

Como analogía: es como si nuestra aplicación accediera a la base de datos con el usuario root y pudiera ver todas las base de datos del servidor. ¡Mal asunto!

Para conseguir unas API keys que únicamente tengan acceso a un bucket crearemos un usuario en el servicio IAM y luego le otorgaremos una policy para que pueda acceder a nuestro bucket de S3. El servicio IAM nos permite crear tantos usuarios como necesitemos y darles acceso programático a los diferentes servicios de AWS o incluso darles la opción de hacer login en la interfaz web.

 

Restringiendo el Acceso

Veréis que el concepto para restringir el acceso al bucket es muy parecido en como se hace con una base de datos.

Primero creamos el bucket:

amazon s3 crear bucket

Saltamos el paso Set Properties y en Set Permissions podemos dejar el usuario principal de AWS o quitarlo, según convenga.

amazon s3 bucket set permissions

Una vez en review hacemos click en Create Bucket. ¡Ya tenemos nuestro nuevo bucket!, ahora vamos a crear un usuario para que pueda acceder programáticamente.

Nos vamos al servicio IAM de AWS y clickamos en la pestaña Users una vez allí pulsamos el botón add user, nos saldrá una pantalla pidéndonos el nombre del usuario y qué tipo de acceso le queremos dar, en este caso no me interesa que pueda hacer login a la consola de AWS.

amazon iam crear usuario

Al pulsar Next: Permissions vamos a poder añadir el usuario a un grupo, en mi caso voy a crear un grupo llamado autonomos.

amazon iam crear grupo

Una vez creado y asignado el grupo podemos pasar al paso final, donde veremos el par de API keys que necesitaremos en nuestra aplicación para usar S3 de forma programática. ¡Copiad la Secret access key, no podréis volver acceder a ella y tendréis que volver a crear API keys para este usuario!

amazon iam crear usuario api keys

¡Perfecto! Ya tenemos nuestro usuario y sus API keys, ahora vamos a darle acceso al bucket de S3 creando una policy, cuando creemos una policy nos va a pedir el amazon arn del bucket de S3, por tanto vamos a copiarlo en el portapapeles, lo podéis encontrar en el listado principal de buckets, pulsando en la fila del bucket en cuestión nos saldrá un pequeño menu a la derecha con un botón que ponde Copy Bucket ARN.

amazon s3 bucket arn

De vuelta en el menú de IAM, nos vamos a la pestaña Policies y pulsamos en Create Policy. Nos saldrá una pantalla con varias opciones para crear la policy, en este caso yo voy a utilizar el generador. A continuación deberemos rellenar un formulario para determinar si queremos permitir o denegar una acción determinada sobre el recurso de un servicio, este caso, quiero permitir a los usuarios de esta policy todas las acciones que se puedan realizar sobre el bucket autonomos del servicio S3. Una vez tengamos el permiso definido, pulsamos en Add Statement, en el caso de que queramos darle más permisos a esta policy, podemos ir añadiendolos cambiando los valores del formulario y pulsando Add Statement tantas veces como sea necesario. Cuando hayamos terminado de dar permisos, pulsamos en Next Step.

amazon iam crear policy

En el último paso de la creación de la policy podemos darle un nombre y ver el código generado con el formulario. Para finalizar la creación de la policy, pulsamos Create Policy.

amazon iam policy name 

¡Ya llegamos al paso final!, asignar esta policy al usuario que hemos creado al principio. Vamos una vez más al menú principal de IAM y pulsamos en Groups, pulsamos en la fila del grupo que hemos creado anteriormente.

iam grupo

amazon iam detalle grupo

Pulsamos en Attach Policy. Nos saldrá un listado de todas las policies que tiene IAM por defecto y las que hayamos creado nosotros, usando el buscador localizamos la nuestra y la asignamos.

amazon iam grupo attach policy

¡Listo, ya tenemos acceso al bucket de S3 con las API keys de nuestro usuario!

 

¡Saludos!

¿Te ha gustado el artículo? ¿Quieres que te avise de mis próximas publicaciones?

¿Quieres seguir aprendiendo?