Saltar al contenido

¿Cómo puedo conceder acceso público de lectura a algunos de los objetos de mi bucket de Amazon S3?

7 minutos de lectura
0

Quiero que algunos objetos de mi bucket de Amazon Simple Storage Service (Amazon S3) puedan leerse públicamente. Sin embargo, no quiero cambiar los permisos de otros objetos que estén en el mismo bucket.

Descripción breve

Usa una de las siguientes formas de conceder acceso público de lectura a los objetos de tu bucket de S3:

  • Usa la consola de Amazon S3 para actualizar la lista de control de acceso (ACL) del objeto.
  • Usa la Interfaz de la línea de comandos de AWS (AWS CLI) para actualizar la ACL del objeto.
  • Usa una política de bucket que conceda acceso público de lectura a una etiqueta de objeto específica.
  • Usa una política de bucket que conceda acceso público de lectura a un prefijo específico.

Importante: Cuando estableces S3 Object Ownership (Propiedad de objetos de S3) en Bucket owner enforced (Aplicada al propietario del bucket) en el bucket, no puedes usar las ACL de bucket y objeto para conceder acceso público. En la mayoría de los casos, no se necesitan ACL para conceder permisos a objetos y buckets. En su lugar, utiliza políticas de AWS Identity Access and Management (IAM) y políticas de bucket de S3 para conceder permisos.

De forma predeterminada, los nuevos buckets, puntos de acceso y objetos no permiten el acceso público. Si has configurado el bloqueo del acceso público para todos los buckets de tu cuenta de AWS, recibirás el mensaje “Bucket and objects not public”.

Para acceder al bucket público, asegúrate de que la red no tenga firewalls ni configuraciones que bloqueen el tráfico de salida al dominio del bucket.

Resolución

Importante: De forma predeterminada, la configuración del bloqueo del acceso público está definida como True en los buckets nuevos de S3. Antes de empezar, cambia la configuración del bloqueo del acceso público a False a nivel de cuenta o de bucket. 

Uso de la consola de Amazon S3 para actualizar la ACL del objeto

Hacer públicos varios objetos a la vez

Advertencia: Revisa cuidadosamente los objetos antes de hacerlos públicos. Después de hacer públicos varios objetos, no puedes deshacer esta acción para todos los objetos a la vez. En su lugar, debes modificar Acceso público en la pestaña Permisos de cada objeto. 

Para hacer públicos varios objetos a la vez, sigue estos pasos:

  1. Abre la consola de Amazon S3 y, a continuación, selecciona los objetos que deseas hacer públicos.
  2. Selecciona Acciones y, a continuación, elige Hacer público.
  3. En el cuadro de diálogo Hacer público, confirma que la lista de objetos sea correcta.
  4. Selecciona Hacer público.

Hacer público un objeto

Para hacer público un objeto únicamente, repite el proceso anterior o sigue estos pasos:

  1. Abre la consola de Amazon S3 y, a continuación, selecciona el bucket del objeto que quieres hacer público.
  2. En Objetos, selecciona el objeto.
  3. Selecciona la pestaña Permisos y, a continuación, selecciona Editar.
  4. En la sección Todos, elige Objects Read (Objetos leídos).
  5. Selecciona I understand the effects of these changes on this object (Entiendo los efectos de estos cambios en este objeto).
  6. Selecciona Save changes (Guardar cambios).

Uso de la AWS CLI para actualizar la ACL del objeto

Nota: Si se muestran errores al poner en marcha comandos de AWS CLI, consulta Solución de errores de AWS CLI. Además, asegúrate de utilizar la versión más reciente de la AWS CLI.

En el caso de un objeto que ya esté almacenado en Amazon S3, puedes usar el comando put-object-acl para actualizar la ACL del objeto para permitir el acceso público de lectura:

aws s3api put-object-acl --bucket DOC-EXAMPLE-BUCKET --key exampleobject --acl public-read

Nota: Sustituye exampleobject por tu objeto.

Como alternativa, también puedes usar el comando put-object-acl para conceder el control total sobre el objeto al propietario de la cuenta y acceso de lectura a todos los demás:

aws s3api put-object-acl --bucket DOC-EXAMPLE-BUCKET --key exampleobject --grant-full-control id="008exampleA45666666668889999008853" --grant-read uri=http://acs.amazonaws.com/groups/global/AllUsers

Nota: En grant-full-control id, introduce el ID de usuario canónico de la cuenta.

Uso de una política de bucket que conceda acceso público de lectura a una etiqueta de objeto específica

Importante: Antes de empezar, asegúrate de revisar los precios de Amazon S3 para el etiquetado de objetos.

Si quieres usar una política para conceder acceso público de lectura a objetos con una etiqueta específica, sigue estos pasos:

  1. Añade una política de bucket que permita el acceso público de lectura a cualquier objeto con una etiqueta específica. Por ejemplo, la siguiente política permite el acceso público de lectura a cualquier objeto que tenga la etiqueta de par clave-valor public=yes:

    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Allow",
                "Principal": "*",
                "Action": "s3:GetObject",
                "Resource": "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*",
                "Condition": {
                    "StringEquals": {
                        "s3:ExistingObjectTag/public": "yes"
                    }
                }
            }
        ]
    }
  2. Añade la etiqueta a los objetos que deseas que sean de lectura pública.

  3. Para comprobar qué etiquetas tiene un objeto, usa el comando get-object-tagging en la AWS CLI:

    aws s3api get-object-tagging --bucket DOC-EXAMPLE-BUCKET --key exampleobject
  4. Para añadir una etiqueta a un objeto que no tenga ninguna etiqueta, usa el siguiente comando put-object-tagging:

    aws s3api put-object-tagging --bucket DOC-EXAMPLE-BUCKET --key exampleobject --tagging 'TagSet={Key=public,Value=yes}'

    Advertencia: El comando anterior sobrescribe todas las etiquetas que tiene un objeto.

  5. Para añadir una etiqueta nueva a un objeto que ya tenga etiquetas, ejecuta el siguiente comando put-object-tagging:

    aws s3api put-object-tagging --bucket DOC-EXAMPLE-BUCKET --key exampleobject --tagging 'TagSet=[{Key=public,Value=n},{Key=exampletag1,Value=one},{Key=exampletag2,Value=two}]'
    

    Nota: Asegúrate de incluir la nueva etiqueta del objeto y las etiquetas antiguas que desees conservar.

  6. Para verificar las etiquetas del objeto, vuelve a ejecutar el comando get-object-tagging:

    aws s3api get-object-tagging --bucket DOC-EXAMPLE-BUCKET --key exampleobject

Uso de una política de bucket que conceda acceso público de lectura a un prefijo específico

Advertencia: La siguiente política de bucket otorga acceso público de lectura a todos los objetos con un prefijo específico. Antes de usar la política de bucket, confirma que tu caso de uso admita todos los objetos de lectura pública incluidos en el prefijo. La siguiente política no concede acceso a la lista para el prefijo. El usuario solo puede acceder al objeto si conoce la ruta. Si el usuario intenta acceder a un objeto que no existe en el prefijo, recibirá un error 403.

  1. Para conceder acceso público de lectura a un prefijo de objeto específico, añade la siguiente política de bucket:

    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Sid": "AddPerm",
                "Effect": "Allow",
                "Principal": "*",
                "Action": [
                    "s3:GetObject"
                ],
                "Resource": [
                    "arn:aws:s3:::DOC-EXAMPLE-BUCKET/publicprefix/*"
                ]
            }
        ]
    }
  2. Ejecuta el comando cp para copiar un objeto al prefijo con acceso público de lectura:

    aws s3 cp s3://DOC-EXAMPLE-BUCKET/exampleobject s3://DOC-EXAMPLE-BUCKET/publicprefix/exampleobject
    

Nota: Si el objeto ya tiene un prefijo de lectura pública, no es necesario copiar el objeto a un nuevo prefijo.

Acceso a buckets y objetos públicos de S3 desde redes restringidas

Para acceder a buckets u objetos públicos de S3 desde redes restringidas, puedes añadir una política de bucket que permita el acceso desde un intervalo de direcciones IP específico. La política de ejemplo siguiente permite la solicitud GET de los intervalos CIDR 192.0.2.0/24 y 203.0.113.0/24:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*",
            "Condition": {
                "IpAddress": {
                    "aws:SourceIp": [
                        "192.0.2.0/24",
                        "203.0.113.0/24"
                    ]
                }
            }
        }
    ]
}

Información relacionada

Configuración de la ACL

Bloquear el acceso público a su almacenamiento de Amazon S3