Estoy utilizando un punto de enlace de un sitio web de S3 como origen de mi distribución de CloudFront. ¿Por qué obtengo errores de tipo 403 Access Denied (Acceso denegado)?

Última actualización: 17-02-2021

Estoy utilizando un bucket de Amazon Simple Storage Service (Amazon S3) como origen de mi distribución de Amazon CloudFront. Estoy utilizando el punto de enlace del sitio web estático de S3 como nombre de dominio de origen. ¿Por qué CloudFront devuelve errores 403 Access Denied (Acceso denegado) de Amazon S3?

Descripción corta

Para solucionar los errores Access Denied (Acceso denegado), determine si el nombre de dominio de origen de su distribución es un punto de enlace del sitio web de S3 o un punto de enlace de la API de REST de S3. Siga estos pasos para determinar el tipo de punto de enlace:

  1. Abra la consola de CloudFront.
  2. Elija su distribución de CloudFront y, a continuación, Distribution Settings (Configuración de la distribución).
  3. Elija la pestaña Origins and Origin Groups (Orígenes y grupos de orígenes).
  4. Revise el nombre de dominio en Origin Domain Name and Path (Nombre de dominio y ruta de acceso de origen) y, a continuación, determine el tipo de punto de enlace en función del formato del nombre de dominio.

Los puntos de enlace de la API de REST utilizan este formato:

DOC-EXAMPLE-BUCKET.s3.amazonaws.com

Nota: Asegúrese de seguir las reglas para nombrar los buckets de Amazon S3.

Los puntos de enlace del sitio web utilizan este formato:

DOC-EXAMPLE-BUCKET.s3-website-us-east-1.amazonaws.com

Nota: En función de la región de AWS, el formato del punto de enlace puede utilizar el formato de guion (s3-website-Region) o el formato de punto (s3-website.Region).

Si su distribución utiliza un punto de enlace de API de REST, consulte Estoy utilizando un punto de enlace de API de REST de S3 como origen de mi distribución de CloudFront. ¿Por qué recibo errores 403 Access Denied (Acceso denegado)?

Si su distribución utiliza un punto de enlace de sitio web, verifique los siguientes requisitos para evitar errores Access Denied (Acceso denegado):

  • Los objetos del bucket deben ser accesibles públicamente.
  • Los objetos del bucket no pueden estar cifrados por AWS Key Management Service (AWS KMS).
  • La política del bucket debe permitir el acceso a s3:GetObject.
  • Si la política del bucket concede acceso de lectura público, la cuenta de AWS propietaria del bucket también debe ser propietaria del objeto.
  • Los objetos solicitados deben existir en el bucket.
  • Amazon S3 Block Public Access debe estar desactivado en el bucket.
  • Si Pago por solicitante está habilitado, la solicitud debe incluir el parámetro request-payer.
  • Si está utilizando un encabezado Referer para restringir el acceso de CloudFront a su origen de S3, revise el encabezado personalizado.

Nota: Si no desea permitir el acceso público (anónimo) a sus objetos de S3, cambie su configuración para utilizar el punto de enlace de la API de REST de S3 como origen de su distribución. A continuación, configure su distribución y su bucket de S3 para restringir el acceso con una identidad de acceso de origen (OAI). Para obtener instrucciones, consulte Uso de un punto de enlace de API de REST como origen con acceso restringido por una OAI en ¿Cómo utilizo CloudFront para actuar como servidor de un sitio web estático alojado en Amazon S3?

Resolución

Los objetos del bucket deben ser de acceso público

Una distribución que utiliza un punto de enlace del sitio web solo admite contenido de acceso público. Para determinar si un objeto de su bucket de S3 es de acceso público, abra la URL del objeto en un navegador web. O bien, puede ejecutar un comando curl en la URL.

El siguiente es un ejemplo de URL de un objeto S3:

http://DOC-EXAMPLE-BUCKET.s3-website-us-east-1.amazonaws.com/index.html

Si el navegador web o el comando curl devuelve un error Access Denied (Acceso denegado), el objeto no es accesible públicamente.

Permita el acceso público de lectura al objeto de una de las siguientes maneras:

Los objetos del bucket no pueden estar cifrados por AWS KMS

Las distribuciones de CloudFront no son compatibles con los objetos cifrados de AWS KMS. Debe eliminar el cifrado de KMS de los objetos de S3 que desee atender con la distribución.

Nota: En lugar de utilizar el cifrado de AWS KMS, utilice AES-256 para cifrar sus objetos.

Utilice una de las siguientes formas para verificar si un objeto de su bucket está cifrado por KMS:

Para cambiar la configuración de cifrado del objeto mediante la consola de Amazon S3, consulte ¿Cómo agrego el cifrado a un objeto de S3?

Para cambiar la configuración de cifrado del objeto mediante AWS CLI, verifique primero que el bucket del objeto no tenga cifrado predeterminado. Si el bucket no tiene cifrado predeterminado, ejecute el siguiente comando para eliminar el cifrado del objeto copiando el objeto sobre sí mismo:

aws s3 cp s3://DOC-EXAMPLE-BUCKET/index.html s3://DOC-EXAMPLE-BUCKET/index.html

Atención: Al copiar el objeto sobre sí mismo, se eliminan las configuraciones de storage-class y website-redirect-location. Para mantener esta configuración en el nuevo objeto, asegúrese de especificar explícitamente los valores de storage-class o website-redirect-location en la solicitud de copia.

La política de bucket debe permitir el acceso a s3:GetObject

Para utilizar una distribución con un punto de enlace de sitio web de S3, la política de su bucket no debe tener una declaración de denegación que bloquee el acceso de lectura público a la acción s3:GetObject.

Incluso si tiene una declaración de permiso explícita para s3:GetObject en su política de bucket, confirme que no haya ninguna declaración de denegación explícita en conflicto. Una declaración de denegación explícita siempre anula una declaración explícita de permiso.

Siga estos pasos para revisar su política de bucket para s3:GetObject:

1.    Abra su bucket S3 desde la consola de Amazon S3.

2.    Elija la pestaña Permissions (Permisos).

3.    Elija Bucket Policy (Política de bucket).

4.    Revise la política de bucket en busca de declaraciones con “Action”: “s3:GetObject” o “Action”: “s3:*”.

La siguiente política de ejemplo contiene una declaración explícita para permitir el acceso público a s3:GetObject. Sin embargo, también hay una declaración de denegación explícita para s3:GetObject que bloquea el acceso a menos que la solicitud provenga de una Amazon Virtual Private Cloud (Amazon VPC) específica.

{
    "Version": "2008-10-17",
    "Id": "PolicyForCloudFrontPrivateContent",
    "Statement": [
        {
            "Sid": "Allow-OAI-Access-To-Bucket",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity EAF5XXXXXXXXX"
            },
            "Action": "s3:GetObject",
            "Resource": [
                "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*"
            ]
        },
        {
            "Sid": "Allow-Public-Access-To-Bucket",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": [
                "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*"
            ]
        },
        {
            "Sid": "Access-to-specific-VPCE-only",
            "Effect": "Deny",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": [
                "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*"
            ],
            "Condition": {
                "StringNotEquals": {
                    "aws:sourceVpce": "vpce-1a2b3c4d"
                }
            }
        }
    ]
  }

5.    Modifique la política del bucket para eliminar o editar las declaraciones que bloquean el acceso de lectura público a s3:GetObject.

Nota: CloudFront almacena en caché los resultados de un error Access Denied (Acceso denegado) durante el tiempo especificado en el TTL mínimo de almacenamiento en caché de errores. El valor predeterminado es un minuto. Después de eliminar una declaración de denegación de la política de bucket, puede ejecutar una invalidación en su distribución para eliminar el objeto de la caché.

Si la política de bucket concede acceso de lectura público, la cuenta de AWS propietaria del bucket debe ser también propietaria del objeto.

Para que una política de bucket permita el acceso público de lectura a los objetos, la cuenta de AWS propietaria del bucket también debe ser propietaria de los objetos. Un bucket u objeto es propiedad de la cuenta de la identidad de AWS Identity and Access Management (IAM) que creó el bucket o el objeto.

Nota: El requisito de propiedad del objeto se aplica al acceso de lectura público concedido por una política de bucket. No se aplica al acceso público de lectura concedido por la lista de control de acceso (ACL) del objeto.

Siga estos pasos para verificar si el bucket y los objetos tienen el mismo propietario:

1.    Ejecute este comando de AWS CLI para obtener el ID canónico de S3 del propietario del bucket:

aws s3api list-buckets --query Owner.ID

2.    Ejecute este comando para obtener el ID canónico S3 del propietario del objeto:

Nota: Este ejemplo muestra un solo objeto, pero puede utilizar el comando de lista para verificar varios objetos.

aws s3api list-objects --bucket DOC-EXAMPLE-BUCKET --prefix index.html

3.    Si los ID canónicos no coinciden, el bucket y el objeto tienen diferentes propietarios.

Nota: También puede utilizar la consola de Amazon S3 para verificar los propietarios del bucket y del objeto. Los propietarios se encuentran en la pestaña Permisos del bucket u objeto respectivo.

Siga estos pasos para cambiar el propietario del objeto por el propietario del bucket:

1.    Desde la cuenta del propietario del objeto, ejecute este comando para recuperar los permisos ACL asignados al objeto:

aws s3api get-object-acl --bucket DOC-EXAMPLE-BUCKET --key object-name

2.    Si el objeto tiene permisos ACL de bucket-owner-full-control, vaya al paso 3. Si el objeto no tiene permisos ACL de bucket-owner-full-control, ejecute este comando desde la cuenta del propietario del objeto:

aws s3api put-object-acl --bucket DOC-EXAMPLE-BUCKET --key object-name --acl bucket-owner-full-control

3.    Desde la cuenta del propietario del bucket, ejecute este comando para cambiar el propietario del objeto copiando el objeto sobre sí mismo:

aws s3 cp s3://DOC-EXAMPLE-BUCKET/index.html s3://DOC-EXAMPLE-BUCKET/index.html

Los objetos solicitados deben existir en el bucket

Si un usuario no tiene permisos de s3:ListBucket, el usuario obtiene errores Access Denied (Acceso denegado) para los objetos que faltan en lugar de errores 404 Not Found (No encontrado). Ejecute el comando de AWS CLI head-object para verificar si existe un objeto en el bucket.

Nota: Confirme que la solicitud de objeto enviada a CloudFront coincida exactamente con el nombre del objeto de S3. Los nombres de los objetos S3 distinguen entre mayúsculas y minúsculas. Si la solicitud no tiene el nombre de objeto correcto, Amazon S3 responde como si el objeto no existiera. Para identificar qué objeto está solicitando CloudFront a Amazon S3, utilice el registro de acceso al servidor.

Si el objeto existe en el bucket, el error Access Denied (Acceso denegado) no está enmascarando ningún error 404 Not Found (No encontrado). Verifique otros requisitos de configuración para resolver el error Access Denied (Acceso denegado).

Si el objeto no está en el bucket, el error Access Denied (Acceso denegado) está enmascarando un error 404 Not Found (No encontrado). Resuelva el problema relacionado con el objeto que falta.

Nota: No es una práctica recomendada de seguridad habilitar el acceso público a s3:ListBucket. Habilitar el acceso público a s3:ListBucket permite a los usuarios ver y publicar todos los objetos de un bucket. Esto expone los detalles de los metadatos del objeto (por ejemplo, la clave y el tamaño) a los usuarios, incluso si no tienen permisos para descargar el objeto.

Amazon S3 Block Public Access debe estar desactivado en el bucket

Confirme que no haya ninguna configuración Amazon S3 Block Public Access aplicada al bucket. Esta configuración puede anular los permisos de acceso público de lectura. La configuración de Amazon S3 Block Public Access puede aplicarse a buckets individuales o a cuentas de AWS.

Si Pago por solicitante está habilitado, la solicitud debe incluir el parámetro request-payer.

Si Pago por solicitante está habilitado en un bucket, no se permite el acceso anónimo. Los usuarios de otras cuentas deben especificar el parámetro request-payer cuando envíen solicitudes al bucket. De lo contrario, esos usuarios obtienen un error Access Denied (Acceso denegado).

Si está utilizando un encabezado Referer para restringir el acceso desde CloudFront a su origen S3, revise el encabezado personalizado.

Si está utilizando el encabezado Referer para restringir el acceso desde CloudFront a su origen de punto de enlace del sitio web de S3, verifique el valor secreto o el token establecido en la política del bucket de S3. A continuación, confirme que el valor secreto o el token coincidan con el valor del encabezado personalizado de origen de CloudFront.

Si está utilizando una declaración de denegación explícita en la política de bucket, confirme que también haya una declaración de permiso que conceda el acceso según el encabezado Referer. No se puede conceder el acceso solo con una declaración de denegación explícita.

Por ejemplo, la siguiente política de bucket concede el acceso al origen S3 cuando la solicitud contiene la cadena “aws:Referer”: “MY_SECRET_TOKEN_CONFIGURED_ON_CLOUDFRONT_ORIGIN_CUSTOM_HEADER”:

{
  "Version":"2012-10-17",
  "Id":"http referer policy example",
  "Statement":[
    {
      "Sid":"Allow get requests originating from my CloudFront with referer header",
      "Effect":"Allow",
      "Principal":"*",
      "Action":"s3:GetObject",
      "Resource":"arn:aws:s3:::DOC-EXAMPLE-BUCKET/*",
      "Condition":{
        "StringLike":{"aws:Referer":"MY_SECRET_TOKEN_CONFIGURED_ON_CLOUDFRONT_ORIGIN_CUSTOM_HEADER"}
      }
    }
  ]
}

Con este ejemplo de política de bucket, el encabezado personalizado de origen de CloudFront debe ser:

  • Cabecera: Referer
  • Valor: MY_SECRET_TOKEN_CONFIGURED_ON_CLOUDFRONT_ORIGIN_CUSTOM_HEADER

Nota: La política de bucket de ejemplo concede acceso público (anónimo) al bucket porque el principal es un valor comodín (“Principal”: “*”). Sin embargo, debido a la declaración de la condición, el acceso al origen de S3 se concede solo si la solicitud incluye el encabezado Referer y el valor del encabezado coincide con el valor de la política de bucket.


¿Le resultó útil este artículo?


¿Necesita asistencia técnica o con la facturación?