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

Última actualización: 13/05/2022

Estoy utilizando un bucket de Amazon Simple Storage Service (Amazon S3) como origen de mi distribución de Amazon CloudFront. ¿Cómo puedo solucionar los errores 403 Access Denied (Acceso denegado)?

Descripción corta

Para solucionar errores de acceso denegado, determine si el nombre de dominio de origen de su distribución es un punto de conexión de sitio web de S3 o un punto de conexión de API REST de S3. A continuación, si su distribución utiliza un punto de conexión de sitio web, revise las secciones de solución de problemas.

Resolución

Determine el tipo de punto de conexión de su nombre de dominio de origen

  1. Abra la consola de CloudFront.
  2. Elija su distribución de CloudFront. A continuación, elija 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 y ruta de dominio de origen). Determine el tipo de punto de conexión en función del formato del nombre de dominio:

Los punto de conexión de la API Rest utilizan el siguiente formato:

DOC-EXAMPLE-BUCKET.s3.amazonaws.com

Los punto de conexión del sitio web utilizan el siguiente formato:

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

Nota: Según la región de AWS, el formato de punto de conexión puede estar en el formato de guion (s3-website-Region) o en el formato de punto (s3-website.Region). Si la distribución utiliza un punto de conexión de API REST, consulte Estoy utilizando un punto de conexión de API REST de S3 como origen de mi distribución de CloudFront. ¿Por qué obtengo errores 403 Access Denied (Acceso denegado)?

Si su distribución utiliza un punto de conexión de sitio web, compruebe los requisitos en las siguientes secciones para evitar errores de acceso denegado.

Confirmar que los objetos del bucket no se encuentren cifrados por AWS Key Management Service (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 entregar con la distribución. En lugar de utilizar el cifrado de AWS KMS, utilice AES-256 para cifrar los objetos.

Determinar si los objetos se encuentran cifrados con AWS KMS

Para comprobar si los objetos de su bucket se encuentran cifrados con KMS:

Utilice la consola de Amazon S3 para ver las propiedades del objeto. Revise el cuadro de diálogo Encryption (Cifrado). Si se encuentra seleccionada la opción AWS-KMS, significa que el objeto está cifrado por KMS.

De forma alternativa, realice lo siguiente:

Ejecute el comando head-object mediante AWS Command Line Interface (AWS CLI). Si el comando devuelve ServerSideEncryption como aws:kms, significa que el objeto está cifrado por KMS.
Nota: Si recibe errores al ejecutar los comandos de la AWS CLI, asegúrese de utilizar la versión más reciente de la AWS CLI.

Cambiar la configuración de cifrado de un objeto

Para cambiar la configuración de cifrado del objeto mediante la consola de Amazon S3, consulte Especificación de cifrado del lado del servidor con AWS KMS (SSE-KMS).

Para cambiar la configuración de cifrado del objeto mediante la AWS CLI, compruebe que el bucket del objeto no cuenta con cifrado predeterminado. Si el bucket no tiene cifrado predeterminado, ejecute el siguiente comando para eliminar el cifrado del objeto al copiarlo sobre sí mismo. Reemplace DOC-EXAMPLE-BUCKET por el nombre de su bucket:

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

Advertencia: Al copiar el objeto sobre sí mismo, se eliminan los ajustes de storage-class y website-redirect-location. Para mantener esta configuración en el objeto nuevo, asegúrese de especificar de forma explícita estos valores en la solicitud de copia.

Confirmar que no haya una “Denegación” explícita en la política de bucket para la acción s3:GetObject

Su política de bucket no debe tener una instrucción de denegación que bloquee el acceso de lectura público a la acción s3:GetObject.

Si tiene una instrucción de permiso explícita para s3:GetObject en su política de bucket, confirme que no haya una instrucción de denegación explícita conflictiva. Una instrucción de denegación explícita siempre anula una instrucción de permiso explícita.

A fin de revisar su política de bucket para s3:GetObject:

  1. Abra el bucket de S3 desde la consola de Amazon S3.
  2. Haga clic en la pestaña Permissions (Permisos).
  3. Elija Bucket Policy (Política de bucket).
  4. Revise la política de bucket para las instrucciones con “Action”: “s3:GetObject” o “Action”: “s3:*”.
  5. Modifique la política de bucket para eliminar o editar las instrucciones que bloquean el acceso público de lectura a s3:GetObject.

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

{
  "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"
        }
      }
    }
  ]
}

Si la política de bucket concede acceso de lectura público, confirme que la cuenta de AWS propietaria del bucket también sea 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. Para los buckets de Amazon S3 existentes con la configuración de propiedad de objetos predeterminada, el propietario del objeto es la cuenta de AWS Identity and Access Management (IAM) que cargó el objeto en el bucket.

Nota: El requisito de propiedad del objeto se aplica al acceso de lectura público otorgado 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.

Confirmar que el bucket y los objetos tengan el mismo propietario

Utilice los pasos siguientes para comprobar si el bucket y los objetos tienen el mismo propietario. También puede utilizar la consola de Amazon S3 para comprobar los propietarios del bucket y los objetos. Los propietarios se encuentran en la pestaña Permissions (Permisos) del respectivo bucket u objeto.

  1. Ejecute el siguiente comando de la AWS CLI para obtener el ID canónico de S3 del propietario del bucket:
aws s3api list-buckets --query Owner.ID
  • Ejecute el siguiente comando para obtener el ID canónico de S3 del propietario del objeto:
  • aws s3api list-objects --bucket DOC-EXAMPLE-BUCKET --prefix index.html
    En este ejemplo se muestra un solo objeto, pero puede utilizar el comando list para comprobar varios objetos.
  • Si los ID canónicos no coinciden, entonces el bucket y el objeto tienen diferentes propietarios.
  • Actualizar la propiedad del objeto

    Los propietarios del bucket pueden administrar la propiedad de los objetos con la propiedad de objetos de S3. Todos los buckets de S3 nuevos tienen la configuración impuesta por el propietario del bucket activada de forma predeterminada. Para actualizar un bucket existente, consulte Establecer la propiedad del objeto en un bucket existente. Cuando se encuentra activada la configuración impuesta por el propietario del bucket, los propietarios del bucket son los propietarios de todos los objetos dentro del bucket. Además, cuando se activa la configuración impuesta por el propietario del bucket, se desactivan todas las ACL de un bucket y sus objetos.

    Se recomienda que los propietarios de bucket utilicen la configuración impuesta por el propietario del bucket en todos ellos y administren los permisos a través de políticas de IAM y bucket.

    Para eliminar las ACL de su bucket y apropiarse de todos los objetos del bucket, ejecute el siguiente comando:

    aws s3api put-bucket-ownership-controls --bucket example-bucket --ownership-controls 'Rules=[{ObjectOwnership=BucketOwnerEnforced}]'
    Si no quiere desactivar las ACL en su bucket de S3, también puede cambiar el propietario del objeto por el propietario del bucket con estos pasos:
    1. Desde la cuenta del propietario del objeto, ejecute este comando para recuperar los permisos de ACL asignados al objeto:
    aws s3api get-object-acl --bucket DOC-EXAMPLE-BUCKET --key object-name
  • Si el objeto tiene permisos de ACL de control total y propietario del bucket, vaya al paso 3. Si el objeto no tiene permisos de ACL de control total del propietario del bucket, ejecute el siguiente comando desde la cuenta del propietario del objeto. Reemplace DOC-EXAMPLE-BUCKET por el nombre de su bucket.
  • aws s3api put-object-acl --bucket DOC-EXAMPLE-BUCKET --key object-name --acl bucket-owner-full-control
  • Desde la cuenta del propietario del bucket, ejecute el siguiente comando para cambiar el propietario del objeto al copiarlo sobre sí mismo. Reemplace DOC-EXAMPLE-BUCKET por el nombre de su bucket.
  • aws s3 cp s3://DOC-EXAMPLE-BUCKET/index.html s3://DOC-EXAMPLE-BUCKET/index.html

    Confirmar que los objetos solicitados existan en el bucket

    Si el usuario no tiene permisos S3:ListBucket, recibe los errores de Accessed Denied (Acceso denegado) para los objetos que faltan en lugar de los errores 404 Not Found (No encontrado). Ejecute el comando head-object de la AWS CLI 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 de S3 distinguen mayúsculas de 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 solicita 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). Compruebe 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) oculta 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 activar 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.

    Confirmar que Amazon S3 Block Public Access se encuentre desactivado para el bucket

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

    Confirmar que los objetos del bucket sean de acceso público

    Una distribución que utiliza un punto de conexión del sitio web solo admite contenido de acceso público. Para determinar si un objeto del 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.

    Por ejemplo:

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

    Si el navegador web o el comando curl devuelven un error Access Denied (Acceso denegado), el objeto no es de acceso público.

    Para permitir el acceso de lectura público:

    Cree una política de bucket que permita el acceso de lectura público para todos los objetos del bucket.

    De forma alternativa, realice lo siguiente:

    Utilice la consola de Amazon S3 para permitir el acceso de lectura público del objeto.

    Si se encuentra activado el pago por solicitante, confirme que la solicitud incluya el parámetro request-payer

    Si se encuentra activado el pago por solicitante para un bucket, no se permite el acceso anónimo al bucket. Los usuarios de otras cuentas deben especificar el parámetro request-payer cuando envían solicitudes al bucket. De lo contrario, esos usuarios reciben 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 conexión 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 token coincide 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 del bucket, confirme que también hay una declaración de permiso que permite el acceso basado en el encabezado Referer. No se puede conceder acceso únicamente con una instrucción de denegación explícita.

    Por ejemplo, la siguiente política de bucket concede acceso al origen de S3 cuando la solicitud contiene la cadena "aws:Referer":"MY_SECRET_TOKEN_CONFIGURED_ON_CLOUDFRONT_ORIGIN_CUSTOM_HEADER."
    El encabezado personalizado de origen de CloudFront debe ser:

    • Encabezado: Referer
    • Valor: 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"}
          }
        }
      ]
    }

    Nota: La política de bucket de ejemplo otorga acceso público (anónimo) al bucket porque el principal es un valor comodín (“Principal”:“*”). Sin embargo, debido a la instrucción de 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 del bucket.

    Confirme que no haya políticas de control de servicios (SCP) de “Denegación” explícitas asociadas a la cuenta de administración de su organización

    Las políticas de control de servicios (SCP) son un tipo de política de la organización que puede utilizar para administrar los permisos en su organización. Utilice la cuenta de administración de su organización en AWS Organizations para comprobar si hay una política de denegación (para la acción s3:GetObject) asociada a la raíz de la organización, a la unidad organizativa (OU) o directamente a su cuenta de AWS.