¿Por qué recibí el error de «Acceso denegado» cuando usé el punto de enlace de alojamiento de sitios web estáticos de Amazon S3?

7 minutos de lectura
0

He utilizado un bucket de Amazon Simple Storage Service (Amazon S3) para alojar un sitio web estático con el punto de enlace de alojamiento de sitios web estáticos de S3. Quiero solucionar el error de «Acceso denegado» que recibí del punto de enlace de alojamiento de sitios web estáticos de S3.

Solución

Nota: Si se muestran errores al ejecutar comandos de la Interfaz de la línea de comandos de AWS (AWS CLI), consulte Solución de problemas de AWS CLI. Además, asegúrese de utilizar la versión más reciente de la AWS CLI.

Los objetos del bucket deben ser de acceso público

Un punto de enlace del sitio web estático de S3 solo admite contenido de acceso público. Para comprobar si un objeto de su bucket de S3 es de acceso público, abra la URL del objeto en un navegador web. Como alternativa, puede usar un comando curl en la URL.

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

http://doc-example-bucket.s3-website-us-east-1.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. Para resolver este problema, cree una política de bucket que permita el acceso público de lectura para todos los objetos en el bucket.

La política de bucket de S3 debe permitir el acceso a la acción s3:GetObject

Compruebe si la política de bucket contiene instrucciones Deny que bloquean el acceso público de lectura a la acción s3:GetObject. Incluso si tiene una instrucción Allow explícita para s3:GetObject en su política de bucket, una instrucción de denegación explícita siempre anula una instrucción de permiso explícita.

Para comprobar la política de bucket, siga estos pasos:

  1. Abra la consola de Amazon S3 y, a continuación, seleccione su bucket.
  2. Seleccione la pestaña Permisos.
  3. Revise la política de bucket en busca de instrucciones con "Action": "s3:GetObject" o "Action": "s3:*".
  4. Si una instrucción bloquea el acceso público de lectura a s3:GetObjectmodifique la política de bucket.

La cuenta de AWS propietaria del bucket también debe ser la propietaria del objeto

Para permitir el acceso público de lectura a los objetos, la cuenta de AWS propietaria del bucket también debe ser la propietaria de los objetos. 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: La propiedad del objeto de S3 no se aplica al acceso público de lectura que concede la lista de control de acceso (ACL) del objeto.

Puede utilizar la consola de Amazon S3 para comprobar los propietarios del objeto y el bucket. Encontrará los propietarios en la pestaña Permisos del objeto o el bucket.

Para usar la AWS CLI para comprobar si la misma cuenta es propietaria del bucket y los objetos de Amazon S3, siga estos pasos:

  1. Para recuperar el ID canónico de S3 del propietario del bucket, ejecute el comando list-buckets:

    aws s3api list-buckets --query Owner.ID
    
  2. Para recuperar el ID canónico de S3 del propietario del objeto, ejecute el comando list-objects:

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

    Nota: El comando anterior devuelve un único objeto. Para revisar varios objetos, ejecute el comando list.

  3. Si los ID canónicos del propietario del bucket y del objeto no coinciden, cambie el propietario del objeto por el propietario del bucket. Desde la cuenta del propietario del objeto, ejecute el comando get-object-acl para recuperar los permisos de ACL asignados al objeto:

    aws s3api get-object-acl --bucket DOC-EXAMPLE-BUCKET --key object-name
    
  4. Si el objeto no tiene permisos de ACL bucket-owner-full-control, ejecute 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
    
  5. Si el objeto tiene permisos de ACL bucket-owner-full-control, ejecute el siguiente comando desde la cuenta del propietario del bucket:

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

    Nota: El comando anterior copia el objeto sobre sí mismo y cambia el propietario del objeto.

También puede usar la propiedad del objeto de S3 para conceder al propietario del bucket la propiedad automática de cualquier objeto cargado por usuarios anónimos u otras cuentas.

No puede usar el cifrado de AWS KMS para los objetos

AWS Key Management Service (AWS KMS) no admite solicitudes anónimas. Como resultado, los buckets de Amazon S3 que permiten el acceso anónimo o público no aplican este acceso a los objetos cifrados con AWS KMS. Para eliminar el cifrado de AWS KMS de los objetos, debe utilizar el punto de enlace del sitio web estático de Amazon S3.

Nota: En lugar del cifrado de AWS KMS, utilice el cifrado del lado del servidor con las claves administradas de Amazon S3 para cifrar los objetos.

Para comprobar si ha utilizado el cifrado de KMS en sus objetos, puede utilizar la consola Amazon S3. En la página de descripción general del objeto, compruebe si AWS-KMS está seleccionado en el cuadro de diálogo Cifrado. También puede ejecutar el comando head-object de la AWS CLI. Si el comando devuelve el cifrado del lado del servidor como aws:kms, el objeto estará cifrado con AWS KMS.

Para usar la consola de Amazon S3 para cambiar la configuración de cifrado del objeto, consulte Especificación del cifrado del lado del servidor con claves administradas de Amazon S3 (SSE-S3).

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

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

Advertencia: Amazon S3 elimina la configuración de storage-class y website-redirect-location al copiar el objeto sobre sí mismo. Para mantener esta configuración en el nuevo objeto, asegúrese de especificar explícitamente los valores de storage-class o website-redirect-locationen la solicitud de copia.

Si ha activado el control de versiones en su bucket, el cifrado predeterminado crea una nueva versión del objeto cuando cambia el cifrado.

Los objetos solicitados deben existir en el bucket de S3

Si el usuario que realiza la solicitud no tiene los permisos s3:ListBucket, recibirá un error de Acceso denegado para los objetos que faltan.

Para comprobar si elobjeto existe en el bucket, ejecute el comando head-object de la AWS CLI.

Nota: Los nombres de los objetos de S3 distinguen entre mayúsculas y minúsculas. Si la solicitud no tiene un nombre de objeto válido, Amazon S3 indica que falta el objeto.

Si el objeto existe en el bucket, el error de Acceso denegado no enmascara un error 404, que indicaría que no se ha encontrado el objeto. Para solucionar el error de Acceso denegado, compruebe otros requisitos de configuración.

Si el objeto no está en el bucket, el error de Acceso denegado enmascara un error 404. Solucione el problema relacionado con el objeto que falta.

Nota: Es una práctica recomendada de seguridad no activar el acceso público a s3:ListBucket. El acceso público a s3:ListBucket permite que los usuarios vean todos los objetos del bucket y generen un listado de estos. Este acceso 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.

Desactivación del bloqueo del acceso público de Amazon S3 en el bucket

El bloqueo del acceso público de Amazon S3 puede anular los permisos que permiten el acceso público de lectura. Confirme que no ha configurado los ajustes de bloqueo del acceso público de Amazon S3 en su bucket o cuenta de S3

Información relacionada

Alojamiento de sitios web estáticos HTTPS internos con el equilibrador de carga de aplicación, S3 y AWS PrivateLink