Utilizo un punto de enlace de la API de REST de S3 como origen de mi distribución de CloudFront. ¿Por qué aparecen errores 403 de acceso denegado?

13 minutos de lectura
0

Utilizo un bucket de Amazon Simple Storage Service (Amazon S3) como origen de mi distribución de Amazon CloudFront. Uso el punto de enlace de la API de REST de S3 como nombre de dominio de origen. CloudFront devuelve errores 403 de acceso denegado de Amazon S3.

Breve descripción

Para solucionar los errores de acceso denegado, averigüe si el nombre del 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 REST de S3. Siga estos pasos para encontrar el tipo de punto de enlace:

1.    Abra la consola de CloudFront.

2.    Seleccione su distribución de CloudFront. Luego, elija Configuración de distribución.

3.    Seleccione la pestaña Orígenes y grupos de orígenes.

4.    Revise el nombre de dominio en Ruta y nombre del dominio de origen. A continuación, averigüe el tipo de punto de enlace en función del formato del nombre de dominio. Los puntos de enlace de la API REST utilizan estos formatos:

DOC-EXAMPLE-BUCKET.s3.region.amazonaws.com
DOC-EXAMPLE-BUCKET.s3.amazonaws.com

Importante: El formato bucket-name.s3.amazonaws.com no funciona en las regiones lanzadas en 2019 o con posterioridad. Los puntos de enlace del sitio web estático utilizan este formato:

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

Si su distribución utiliza un punto de enlace de sitio web estático de S3, es posible que se muestren errores 403 de acceso denegado. Para obtener más información, consulte Estoy utilizando un punto de enlace de un sitio web de S3 como origen de mi distribución de CloudFront. ¿Por qué aparecen errores 403 de acceso denegado?

Si utiliza un punto de enlace de la API de REST en su distribución, compruebe si las configuraciones cumplen los siguientes requisitos para evitar los errores de acceso denegado:

  • Si no configura el control de acceso de origen (OAC) o la identidad de acceso de origen (OAI), los objetos deberán ser de acceso público. Como alternativa, solicite los objetos con AWS Signature Version 4.
  • Si el bucket de S3 contiene objetos cifrados por AWS Key Management Service (AWS KMS), se debe usar OAC en vez de OAI.
  • La política de bucket de S3 debe permitir el acceso a s3:GetObject.
  • Si la política de bucket concede acceso, la cuenta de AWS propietaria del bucket de S3 también debe ser propietaria del objeto.
  • Los objetos solicitados deben existir en el bucket de S3.
  • Si los clientes solicitan la raíz de la distribución, defina un objeto raíz predeterminado.
  • Si ha configurado una OAI, debe estar incluida en la política de bucket de S3.
  • Si ha configurado un OAC, la entidad principal del servicio de CloudFront debe estar incluida en la política de bucket de S3. Si ha configurado una OAI, debe estar incluida en su política de bucket de S3.
  • Si no configura un OAC ni una OAI, se debe desactivar Bloqueo del acceso público de Amazon S3 en el bucket.

Solución

Si no configura OAC ni OAI, sus objetos deben ser de acceso público o deben solicitarse con AWS Signature Version 4.

Para determinar si los objetos de su bucket de S3 son de acceso público, abra la URL del objeto de S3 en un navegador web. Como alternativa, ejecute un comando curl en la URL.

A continuación se muestra un ejemplo de URL de un objeto de S3:

https://DOC-EXAMPLE-BUCKET.s3.amazonaws.com/index.html

Si el navegador web o el comando curl devuelven un error de acceso denegado, significa que el objeto no es de acceso público. Si el objeto no es de acceso público, utilice una de las siguientes configuraciones:

Objetos cifrados por AWS Key Management Service (AWS SSE-KMS)

Si el bucket de S3 contiene objetos cifrados por AWS Key Management Service (AWS SSE-KMS), se debe usar OAC en lugar de OAI.

Se puede configurar OAC para que CloudFront proporcione los objetos cifrados con AWS KMS. Para ello, añada una instrucción a la política de claves de AWS KMS que conceda el permiso para usar la clave a la entidad principal del servicio de CloudFront. Para proporcionar los objetos cifrados de AWS KMS sin configurar OAC, proporcione la clave de AWS KMS cifrada desde un bucket de S3 mediante Lambda@Edge.

Utilice una de las siguientes maneras de comprobar si un objeto de su bucket está cifrado con AWS KMS:

  • Utilice la consola de Amazon S3 para ver las propiedades del objeto. Revise el cuadro de diálogo Cifrado. Si se ha marcado AWS KMS, el objeto está cifrado con AWS KMS.
  • También puede ejecutar el comando head-object mediante la Interfaz de la línea de comandos de AWS (AWS CLI). Si el comando devuelve ServerSideEncryption como aws:kms, el objeto está cifrado con AWS KMS. Si se muestran errores al ejecutar comandos de la AWS CLI, asegúrese de utilizar la versión más reciente de la AWS CLI.
    Nota: La OAI no permite proporcionar objetos cifrados con AWS KMS.

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

Para usar una distribución con un punto de enlace de la API de REST de S3, su política de bucket debe permitir s3:GetObject a los usuarios públicos o a la OAI de CloudFront. Aunque tenga una instrucción allow explícita para s3:GetObject en la política de bucket, confirme que no haya ninguna instrucción deny explícita que entre en conflicto. Una instrucción deny explícita siempre tiene preferencia sobre una instrucción allow explícita.

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

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

2.    Elija la pestaña Permisos.

3.    Elija Política de bucket.

4.    Busque instrucciones con «Action»: «s3:GetObject» o «Action»: «s3:*» en la política de bucket. La siguiente política de ejemplo incluye una instrucción allow que concede acceso a s3:GetObject a un OAC de CloudFront. También incluye una instrucción que concede acceso a s3:GetObject a una OAI de CloudFront y una instrucción allow que concede acceso público a s3:GetObject. Sin embargo, hay una instrucción deny explícita para s3:GetObject que bloquea el acceso a menos que la solicitud venga de una Amazon Virtual Private Cloud (Amazon VPC) concreta:

{
  "Version": "2012-10-17",
  "Id":
    "PolicyForCloudFrontPrivateContent",
  "Statement": [{
      "Sid": "Allow-OAC-Access-To-Bucket",
        "Effect": "Allow",
        "Principal":
    {
            "Service": "cloudfront.amazonaws.com"
        },
        "Action": "s3:GetObject",

    "Resource": "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*",
        "Condition": {
            "StringEquals": {

    "AWS:SourceArn": "arn:aws:cloudfront::111122223333:distribution/EDFDVBD6EXAMPLE"
            }
        }
      },

    {
      "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 de bucket para quitar o editar las instrucciones que bloqueen el acceso de la OAI de CloudFront o el acceso público a s3:GetObject.

Nota: CloudFront almacena en caché los resultados de un error de acceso denegado durante un máximo de cinco minutos. Tras eliminar una instrucción deny de la política de bucket, puede ejecutar una anulación de la validez en su distribución para eliminar el objeto de la caché.

Titularidad de los objetos y buckets de S3

Para que una política de bucket se aplique a cuentas o servicios externos, la cuenta de AWS propietaria del bucket también debe ser la 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 u objeto.

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

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

1.    Ejecute este comando de la 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 de S3 del propietario del objeto:

Nota: En este ejemplo se muestra un único objeto, pero se puede utilizar el comando list para comprobar varios objetos.

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

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

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

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

1.    Desde la cuenta de AWS del propietario del objeto, ejecute este comando para obtener los permisos de la lista de control de acceso (ACL) asignados al objeto:

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

2.    Si el objeto tiene permisos de ACL para el control total del propietario del bucket, vaya al paso 3. Si el objeto no tiene permisos de ACL para el control total del propietario del bucket, 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; para ello, copie el objeto sobre sí mismo:

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

Nota: Asegúrese de cambiar el valor --storage-class del comando del ejemplo por la clase de almacenamiento aplicable en su caso práctico.

Los objetos solicitados deben existir en el bucket

Si un usuario no tiene permisos s3:ListBucket, se mostrarán errores de acceso denegado por los objetos que falten, en vez de errores 404, que indicarían que no se han encontrado los objetos. Ejecute el comando head-object de la AWS CLI para comprobar si un objeto existe 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 entre mayúsculas y minúsculas. Si la solicitud no tiene el nombre de objeto correcto, Amazon S3 responderá como si faltara el objeto. 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 de acceso denegado no estará enmascarando un error 404, que indicaría que no se ha encontrado el objeto. Compruebe otros requisitos de configuración para solucionar el error de acceso denegado.

Si el objeto no está en el bucket, el error de acceso denegado estará enmascarando un error 404, que indicaría que no se ha encontrado el objeto. Solucione el problema relacionado con el objeto que falta.

Nota: Se desaconseja permitir el acceso público a s3:ListBucket por cuestiones de seguridad. Si se permite el acceso público a s3:ListBucket, los usuarios podrán ver todos los objetos en un bucket y generar un listado de los mismos. Esto expondría a los usuarios detalles de los metadatos del objeto, como la clave y el tamaño, aunque no tengan los permisos para descargar el objeto.

Si los clientes solicitan la raíz de la distribución, defina un objeto raíz predeterminado

Si la distribución no tiene un objeto raíz predeterminado definido y un solicitante no tiene acceso a s3:ListBucket, se mostrará un error de acceso denegado para el solicitante. El solicitante verá este error cuando solicite la raíz de la distribución, en lugar del error 404, que indicaría que no se ha encontrado el objeto.

Para definir un objeto raíz predeterminado, consulte Specifying a default root object.

Nota: Se desaconseja permitir el acceso público a s3:ListBucket por cuestiones de seguridad. Si se permite el acceso público a s3:ListBucket, los usuarios podrán ver todos los objetos en un bucket y generar un listado de los mismos. Esto expondría a los usuarios detalles de los metadatos del objeto, como la clave y el tamaño, aunque no tengan los permisos para descargar el objeto.

Permisos para OAC u OAI

Si ha configurado un OAC, debe haber una entidad principal del servicio de CloudFront incluida en la política de bucket de S3. Si ha configurado una OAI, debe estar incluida en su política de bucket de S3.

Para comprobar si su política de bucket permite la OAI, abra su bucket de S3 en la consola de Amazon S3. A continuación, seleccione la pestaña Permisos y revise la política de bucket. En la política de ejemplo que se muestra a continuación, la primera instrucción es una instrucción allow para la entidad principal del servicio de CloudFront si se ha configurado OAC. La segunda instrucción es una instrucción allow para una OAI:

{
      "Sid": "Allow-OAC-Access-To-Bucket",
        "Effect": "Allow",
        "Principal": {

    "Service": "cloudfront.amazonaws.com"
        },
        "Action": "s3:GetObject",
        "Resource": "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*",

    "Condition": {
            "StringEquals": {
                "AWS:SourceArn": "arn:aws:cloudfront::111122223333:distribution/EDFDVBD6EXAMPLE"

    }
     }
      },

{
  "Sid": "1",
  "Effect": "Allow",
  "Principal": {
    "AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin
    Access Identity EAF5XXXXXXXXX"
  },
  "Action": "s3:GetObject",
  "Resource": "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*"
}

Para actualizar su política de bucket con la consola de CloudFront, siga estos pasos:

1.    Abra la consola de CloudFront y elija su distribución.

2.    Seleccione la pestaña Orígenes y grupos de orígenes.

3.    Elija el origen de S3 y, a continuación, seleccione Editar.

4.    En Restringir el acceso al bucket, seleccione .

5.    En Identidad de acceso de origen, elija la identidad existente o cree otra nueva.

6.    En Conceder permisos de lectura en el bucket, seleccione Sí, actualizar la política de bucket.

7.    Seleccione Sí, editar.

Cómo permitir el acceso público para la distribución sin OAC ni OAI

Si su distribución no utiliza OAC ni OAI y los objetos no se solicitan con AWS Signature Version 4, debe permitir el acceso público a los objetos. Esto se debe a que una distribución con un punto de enlace de la API de REST solo admite objetos de lectura pública. En este caso, debe confirmar que no se haya aplicado al bucket ninguna configuración de Bloqueo del acceso público de Amazon S3. Estas configuraciones pueden anular los permisos que permiten el acceso de lectura público. La configuración de Bloqueo del acceso público de Amazon S3 se puede aplicar a cuentas de AWS o a buckets individuales.


Información relacionada

Troubleshooting error responses from your origin

¿Cómo puedo solucionar los errores 403 de acceso denegado de Amazon S3?

OFICIAL DE AWS
OFICIAL DE AWSActualizada hace un año