URLs Firmadas en S3: Cómo Dar Acceso Sin Abrir Tu Bucket Al Público

Introducción

En el artículo anterior de esta serie te estuve mostrando como puedes usar los ‘bucket policies’ para manejar los accesos a tus buckets S3. En este artículo estaremos hablando sobre como proceder cuando debemos dar acceso a un fichero y aún así queremos bloquear el acceso público en nuestro bucket S3. Este es uno de los temas avanzandos relacionados a los bucket S3.

Contexto

Supongamos que un servicio externo necesita acceder a un objeto que tienes almacenado en un bucket S3, por ejemplo, todos los días un servicio tiene que leer un mismo objeto para procesar la información que contiene. Con lo que conocemos hasta ahora, hay ciertas formas de lograr esto, una de ellas es permitiendo el acceso público al bucket y a través de las políticas del bucket (bucket policies), podemos permitir el acceso basado en direcciones IP y además en tags específicos que se le otorgen al objeto. Sin embargo, este método tiene varios inconvenientes, el primero es que, a pesar de que esamos limitando el acceso a través de las políticas del bucket, el hecho de que el bucket tenga acceso público no es la mejor opción desde el punto de vista de seguridad, más si los datos del bucket, por su naturaleza, deben ser privados. Precisamente con lo que aprenderás en este artículo, podremos darle solución a este problema sin depender de que el bucket tenga acceso público.

URL firmada (Presigned URL)

Una URL firmada es básicamente un token de seguridad generado por una entidad (usuario o rol IAM) que ya tiene permisos para ejecutar dicha acción. La URL contiene la firma de quien la creó y AWS solo verifica si dicha entidad aún tiene permisos para ejecutar la acción y si la firma aún es válida. De esta forma, podemos generar una URL firmada para obtener un objeto específico de un bucket S3 sin necesidad de otorgar acceso público al bucket.

Anatomía de una URL firmada

Esto es un ejemplo de una URL firmada para obtener un objeto específico de un bucket S3:

https://compacompia-test.s3.us-east-1.amazonaws.com/avatar.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=ASIAQSOI4GGCSHG5NDCO%2F20260517%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20260517T120057Z&X-Amz-Expires=300&X-Amz-Security-Token=IQoJb3JpZ2luX2VjENz%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FwEaCXVzLWVhc3QtMSJIMEYCIQC3Ww4rsAvnrog2KcQYLXnNbiUd%2B0JWbtkcBpqXTWUSxgIhAMdxnzi18BKc7k6PtabVOJur%2FrbW0RMlBQv7x7Q2tCrHKvwCCKX%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FwEQABoMMDM5NjEyODU0NjYxIgyTKhivXu7AHfhM0YQq0AKn6GuFk9N0drJ3bqxL2IrD1djDtFPUL8K4ZOcGPeOClSDZgi2sV8GCiuFvvhVikRMEeT7F3agNKNE7H7jp3qltinuGX3Av65hKgEowqlkenzY3yrCO5EhJqA0VRCOAZ%2BKcr6aIGOKRo7WS8DEJGHvPHu5AXl4pFCp4hLWAzeJVKgLwjtziUYdXHSpxjeR%2FTxSwGF1I5fZawcibkObucgyooouTx6JeXnAxTINMEJzNeTGY%2BHcKcZIMUhaq%2FF%2B%2Bqw60MU9qhsUQ4prvuu2APv8FhDI7U%2FDjYAtGCKhVTbydOvFrdV6vwYPKTYnAdln2fhsLKI%2B4wyb0S8qe13nsTubdPQurkDbJnN1VwFx5xM12wznmaR2qDTEFv0XQ3SAlxUXzVCBDLLHXVs%2Fwc8oUqpB4Ge51fdcSKJV1hHoAzQ%2FhaXaCydqSBuAGfJWfK%2BmSH6MwhNum0AY6rALPrqvfxVTrkjq0Fu6DD1j6jQPO7C6k4mhn3dgzyZJmwRNPLaHl2brlGkJSM127V60d5jh0l3vmE94DG1cG98H01OA%2By8H1BdkD8cCGwq%2BgWWiAHGf2k1lGLAo2anVjlGxuUI0XVeIQoZmRxFcq9h6pLvQnn3N49KKBOF3K9eGe1E3D68Mg4j3UCakrPwt6MEa5vK%2FKsLRLNqG%2BWVsciD5IVEcaWfy5HOyegmUMMjSd2lkZwDlqQOXG6%2BJMb4jnpHQYdf83f4JPfRxH2uAXoD7zeA5k7awPaxvi47Q4sFbB3SSOBkp2bqIh3IMV%2FjcugYg1RkwIujHelldyG2k0VrxSqSXM9cKConIyaKST8gDHRAUI91u4RCjlj0W7q6qyXdgw%2BA3%2BP%2FdZiIcbDhY%3D&X-Amz-Signature=73a84c003b8eadbfaab606fe69b00d20cdae8c96089fd1365f9b6a1b7ef3cdc8&X-Amz-SignedHeaders=host&response-content-disposition=inline

ParámetroDescripciónValor
EndpointDirección base del objeto en S3https://compacompia-test.s3.us-east-1.amazonaws.com/avatar.png
X-Amz-AlgorithmAlgoritmo de cifrado utilizado para la firmaAWS4-HMAC-SHA256
X-Amz-CredentialQuien firma, cuando y en que region/servicioASIAQSOI4GGCSHG5NDCO%2F20260517%2Fus-east-1%2Fs3%2Faws4_request
X-Amz-ContentPayload utilizado, vacío con peticiones GETUNSIGNED-PAYLOAD
X-Amz-DateFecha y hora UTC de la creación de la URL20260517T120057Z
X-Amz-ExpiresTiempo de validez en segundos300
X-Amz-Security-TokenToken necesario al usar credenciales temporales (STS)IQoJb3JpZ2luX2VjENz….
X-Amz-SignedHeadersCabeceras HTTP que AWS validará en la peticiónhost
X-Amz-SignatureFirma criptográfica que valida la identidad73a84c003b8eadbfaab…7ef3cdc8

Con esta información serás capaz de entender la estructura de una URL firmada y como se compone cada uno de sus parámetros.

Cuando usar una URL firmada

Ahora, luego de entender esto, seguro te estés preguntando si siempre que necesites dar acceso a un objeto específico en un bucket S3 deberías usar URLs firmadas. La respuesta es no, esto dependerá de tu caso de uso específico. Si el acceso al objeto es algo que se va a dar de forma frecuente y a un gran número de usuarios, entonces probablemente no sea la mejor opción usar URLs firmadas, ya que tendrías que generar una URL para cada usuario y mantenerlas actualizadas. Sin embargo, si el acceso al objeto es algo que se va a dar de forma ocasional o a un número limitado de usuarios, entonces las URLs firmadas pueden ser una excelente opción para mantener la seguridad de tu bucket S3 sin necesidad de otorgar acceso público. La forma de resumirlo, para mi, es la siguiente:

  • Si son accesos estáticos y permanentes, entonces debes usar los bucket policies para otorgar acceso a los objetos.
  • Si son accesos dinámicos y temporales, entonces las URLs firmadas son la mejor opción para otorgar acceso a los objetos.

Nos vemos pronto

Esto es todo por ahora relacionado al sexto artículo de esta serie donde estaré brindándote una guía completa sobre los buckets de S3. En el próximo artículo estaremos hablando sobre las replicación en los bucket S3. Nos vemos pronto.


Contenido relacionado

Recibe las últimas publicaciones en tu correo
0%