¿Por qué aparecen errores «403 Access Denied» cuando uso un punto de enlace de la API de REST de S3 como origen de mi distribución de CloudFront?
Quiero solucionar los errores «403 Access Denied» que Amazon CloudFront devuelve de Amazon Simple Storage Service (Amazon S3).
Descripción corta
Para evitar errores «Access Denied», utiliza las siguientes configuraciones:
- Haz que los objetos de S3 sean de acceso público.
- Utiliza el control de acceso de origen (OAC) para los buckets de S3 que contienen objetos cifrados en el servidor con AWS Key Management Service (AWS KMS).
Nota: Debes usar OAC en lugar de la identidad de acceso de origen (OAI), ya que OAI no sirve objetos cifrados de AWS KMS. - Modifica la política de bucket de S3 para que permita el acceso a s3:GetObject.
- Asegúrate de que la cuenta de AWS que posee el bucket de S3 también sea propietaria del objeto.
- Confirma que los objetos solicitados existen en el bucket de S3.
- Define un objeto raíz predeterminado para que los clientes puedan solicitar la raíz de tu distribución.
- Para una configuración de OAI, debes incluir el OAI en la política de bucket de S3. Para una configuración de OAC, debes incluir la entidad principal del servicio de CloudFront en la política de bucket de S3.
Resolución
Nota: Si se muestran errores al ejecutar comandos de la Interfaz de la línea de comandos de AWS (AWS CLI), consulta Solución de problemas de AWS CLI. Además, asegúrate de utilizar la versión más reciente de la AWS CLI.
Hacer que los objetos de S3 sean de acceso público
Para determinar si los objetos de tu bucket de S3 son de acceso público, abre la URL del objeto de S3 en un navegador web. Como alternativa, ejecuta 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 «Access Denied», significa que el objeto no es de acceso público.
Para que el objeto sea de acceso público, realiza una de las siguientes acciones:
- Crea una política de bucket que conceda permisos de solo lectura para el bucket.
- Utiliza la consola de S3 para permitir el acceso de lectura público para el objeto.
- Usa el punto de enlace de la API de REST para configurar OAC u OAI para la distribución.
- Utiliza la versión 4 de AWS Signature para autenticar las solicitudes en S3.
Uso de OAC para objetos cifrados con AWS KMS
Para usar OAC, agrega 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. También puedes usar Lambda@Edge en lugar de OAC. Para obtener más información, consulta Servir contenido cifrado con SSE-KMS desde S3 mediante CloudFront.
Para confirmar que has cifrado el objeto con AWS KMS, lleva a cabo una de las siguientes acciones:
- Utiliza la consola de S3 para ver las propiedades del objeto. Revisa el cuadro de diálogo Cifrado. Si se ha marcado AWS KMS, el objeto está cifrado con AWS KMS.
- Ejecuta el comando head-object. Si el comando devuelve ServerSideEncryption como aws:kms, el objeto estará cifrado con AWS KMS.
Permitir el acceso a s3:GetObject
Aunque tengas una instrucción Allow explícita para s3:GetObject en la política de bucket, confirma que no haya conflictos con una instrucción Deny explícita. Una instrucción Deny explícita tiene preferencia sobre una instrucción Allow explícita. Para obtener más información sobre las instrucciones Deny y Allow, consulta Lógica de evaluación de políticas.
Para confirmar que tu política de bucket permite s3:GetObject e instrucciones Deny no explícitas, sigue estos pasos:
-
Abre la consola de Amazon S3.
-
Selecciona tu bucket.
-
Selecciona la pestaña Permisos.
-
Elige Política de bucket.
-
Comprueba si hay instrucciones con «Action»: «s3:GetObject» o «Action»: «s3:*».
El siguiente ejemplo de política incluye instrucciones Allow que conceden a la OAC de CloudFront y la OAI de CloudFront acceso a s3:GetObject. También incluye una instrucción Allow que otorga 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" } } } ] } -
Modifica la política de bucket para quitar o editar las instrucciones que bloqueen el acceso de la OAI de CloudFront, la OAC de CloudFront o el acceso público a s3:GetObject.
Nota: CloudFront almacena en caché los resultados de un error «Access Denied» durante un máximo de 5 minutos. Tras eliminar una instrucción Deny de la política de bucket, puedes ejecutar una anulación de la validez en tu distribución para eliminar el objeto de la caché.
Concesión de titularidad de los objetos y buckets de S3
Comprueba que la cuenta de la identidad de AWS Identity and Access Management (IAM) que creó el bucket u objeto es propietaria del bucket o del objeto.
Nota: El requisito de propiedad del objeto solo se aplica al acceso concedido por una política de bucket. No se aplica al acceso que concede la lista de control de acceso (ACL) del objeto.
Para comprobar si el bucket y los objetos tienen el mismo propietario, sigue estos pasos:
-
Ejecuta el comando list-buckets para obtener el ID canónico de S3 del propietario del bucket:
aws s3api list-buckets --query Owner.ID -
Ejecuta el comando list-objects para obtener el ID canónico de S3 del propietario del objeto:
aws s3api list-objects --bucket DOC-EXAMPLE-BUCKET --prefix index.htmlNota: El comando del ejemplo anterior muestra un único objeto, pero puedes ejecutar el comando list-objects para comprobar varios objetos.
Si los ID canónicos no coinciden, significa que el bucket y el objeto tienen propietarios diferentes.
Nota: También puedes usar la consola de Amazon S3 para comprobar los propietarios del bucket y del objeto. Encontrarás los propietarios en la pestaña Permisos del objeto o el bucket.
Para cambiar el propietario del objeto por el propietario del bucket, sigue estos pasos:
-
Desde la cuenta del propietario del objeto, ejecuta el comando get-object-acl para recuperar los permisos de la ACL:
aws s3api get-object-acl --bucket DOC-EXAMPLE-BUCKET --key object-name -
Si el objeto tiene permisos de ACL bucket-owner-full-control, continúa con el paso 3. Si el objeto no tiene permisos de ACL bucket-owner-full-control, ejecuta el comando put-object-acl desde la cuenta del propietario del objeto:
aws s3api put-object-acl --bucket DOC-EXAMPLE-BUCKET --key object-name --acl bucket-owner-full-control -
Desde la cuenta del propietario del bucket, ejecuta el siguiente comando para copiar el objeto sobre sí mismo y cambiar el propietario del objeto:
aws s3 cp s3://DOC-EXAMPLE-BUCKET/index.html s3://DOC-EXAMPLE-BUCKET/index.html --storage-class STANDARDNota: Sustituye --storage-class por tu clase de almacenamiento.
Traslado de los objetos al bucket
Para comprobar si un objeto existe en el bucket, ejecuta el comando head-object.
Nota: Los nombres de los objetos de S3 distinguen entre mayúsculas y minúsculas. Confirma que la solicitud de objeto enviada a CloudFront coincida con el nombre del objeto de S3. Si la solicitud no tiene el nombre de objeto correcto, Amazon S3 responderá como si faltara el objeto. Para identificar el objeto que CloudFront solicita a Amazon S3, utiliza el registro de acceso al servidor.
Si el objeto existe en el bucket, el error «Access Denied» no enmascara un «404 Not Found». Comprueba otros requisitos de configuración para solucionar el error «Access Denied».
Si el objeto no está en el bucket, el error «Access Denied» estará enmascarando un error «404 Not Found». Debes solucionar el problema relacionado con el objeto que falta.
Definición de un objeto raíz predeterminado
Para definir un objeto raíz predeterminado, consulta Especificación de un objeto raíz predeterminado.
Nota: Es una práctica recomendada de seguridad denegar el acceso público a s3:ListBucket. Si permites el acceso público a s3:ListBucket, los usuarios pueden ver y enumerar todos los objetos de un bucket. Esto expone los detalles de los metadatos del objeto, como la clave y el tamaño, a todos los usuarios.
Adición de los permisos de la entidad principal del servicio de OAI o CloudFront a la política de bucket de S3
Para comprobar si tu política de bucket permite la OAI, abre la consola de Amazon S3. Busca tu bucket y, a continuación, en la pestaña Permisos, elige Política de bucket.
El siguiente ejemplo de política incluye una instrucción Allow para la entidad principal del servicio de CloudFront al configurar OAC:
{ "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" } } }
El siguiente ejemplo de política incluye una instrucción Allow para OAI:
{ "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 tu política de bucket en la consola de CloudFront, sigue estos pasos:
- Abre la consola de CloudFront.
- Selecciona tu distribución.
- Selecciona la pestaña Orígenes y grupos de orígenes.
- Selecciona el origen de S3 y, a continuación, elige Editar.
- En Restringir el acceso al bucket, selecciona Sí.
- En Identidad de acceso de origen, elija una identidad existente o crea una nueva.
- En Conceder permisos de lectura en el bucket, selecciona Sí, actualizar la política de bucket.
- Selecciona Sí, editar.
Información relacionada
Solución de problemas de códigos de estado de respuesta a errores en CloudFront
¿Cómo puedo solucionar los errores 403 Access Denied de Amazon S3?
- Etiquetas
- Amazon CloudFront
- Idioma
- Español
Vídeos relacionados


Contenido relevante
- preguntada hace 4 meses
- preguntada hace 7 meses
- Como solucionar el error: Supplied Policy document is breaching Cloudwatch Logs policy length limit.Respuesta aceptadapreguntada hace 10 meses