Comparte un archivo privado con un enlace temporal

AWSBeginner
Practicar Ahora

Introducción

Un compañero necesita una descarga temporal de un informe privado. Generarás y probarás un enlace firmado, comprobarás sus límites de acceso y limpiarás los recursos de práctica sin hacer público el archivo.

Completa primero Organiza documentos con claves y metadatos para conocer claves, descargas y limpieza. El bucket privado y una identidad restringida están preparados en esta VM nueva; no se necesita iniciar sesión personalmente ni escribir políticas de IAM. Utiliza Terminal y la pestaña AWS View, a su lado. Mantén privados los enlaces completos de descarga.

Relación con las certificaciones

Este laboratorio ofrece práctica para los siguientes temas de examen.

Lee el informe con tu identidad configurada

En este paso, recuperarás el informe permitido y verás que otro objeto privado permanece fuera de los permisos de tu identidad.

Un permiso define lo que una identidad puede hacer sobre un recurso. Tu lector preparado puede enumerar este bucket y leer shared/report.txt, pero no puede leer private/payroll.txt ni cambiar el almacenamiento. Utilizarás estos permisos, no escribirás políticas; el curso de IAM lo enseña más adelante.

Ve al espacio de trabajo con cd (cambiar de directorio):

cd /home/labex/project

Enumera el prefijo compartido del bucket preparado:

aws s3 ls s3://labex-private-documents/shared/

La lista contiene una fila que termina en report.txt; bajo este prefijo, corresponde a la clave completa shared/report.txt. El prefijo organiza la clave; su nombre no hace público el objeto. Tu solicitud de AWS CLI tiene éxito porque la identidad configurada tiene permiso para enumerar el bucket.

Descarga el informe mediante una solicitud autenticada de AWS CLI:

aws s3 cp s3://labex-private-documents/shared/report.txt authorized-report.txt

Inspecciona este informe sintético con cat, que muestra un archivo local de texto:

cat authorized-report.txt
Monthly report: 42000 revenue

En AWS View, abre shared/report.txt. La vista previa muestra el mismo contenido almacenado, utilizando el acceso permitido del lector.

Ejemplo: el lector puede ver el informe compartido.

Este ejemplo muestra el informe disponible para el lector configurado. Los comandos de descarga del siguiente paso comprueban el enlace temporal en sí.

Intenta leer el objeto independiente de nóminas:

aws s3 cp s3://labex-private-documents/private/payroll.txt denied-payroll.txt

Se espera que este comando falle con un error 403 o AccessDenied. El objeto existe, pero este lector no tiene permiso para recuperarlo. Que una identidad tenga acceso a un informe no le concede acceso a todos los objetos del bucket. Compartirás únicamente el informe permitido.

Genera y utiliza un enlace de descarga temporal

En este paso, generarás un enlace firmado y descargarás el informe mediante un cliente HTTP en lugar de utilizar una identidad de AWS en la solicitud del destinatario.

Un enlace temporal permite la descarga autorizada hasta que termina su límite de tiempo.

Enlace de descarga temporal

Una URL prefirmada es un enlace que contiene una firma y una hora de caducidad. Permite al destinatario realizar una descarga autorizada sin recibir tus credenciales de AWS. Los archivos de enlaces están preparados con permisos restringidos; mantén privado su contenido completo.

aws s3 presign produce una URL que autoriza la descarga del objeto indicado. --expires-in establece la duración solicitada en segundos; 600 significa diez minutos desde la generación. Esto no cambia los permisos de acceso del objeto. El operador > del shell escribe la salida en el archivo local ya protegido en lugar de mostrar el enlace completo:

aws s3 presign s3://labex-private-documents/shared/report.txt --expires-in 600 > download-link.txt

El comando no muestra nada porque su salida fue al archivo. Cualquiera que posea esta URL puede utilizar su acceso delegado mientras siga siendo válida, así que evita incluir el enlace completo en capturas de pantalla y mensajes públicos.

Lee el enlace en una variable del shell sin mostrarlo. $(...) captura la salida de un comando; cat lee el archivo y DOWNLOAD_URL=... asigna el texto capturado. No hay espacios alrededor del = de la asignación:

DOWNLOAD_URL=$(cat download-link.txt)

curl realiza una solicitud HTTP. -f trata las respuestas de error HTTP como fallos, -sS oculta el indicador de progreso conservando los mensajes de error y -o escribe el cuerpo de la respuesta en un archivo local. Las comillas dobles mantienen toda la URL en un argumento, incluidos sus parámetros de consulta:

curl -fsS "$DOWNLOAD_URL" -o shared-download.txt

Curl no recibe credenciales ni un perfil de AWS; la propia URL contiene la firma necesaria para esta descarga. Lee el resultado:

cat shared-download.txt
Monthly report: 42000 revenue

cmp compara dos archivos byte a byte. && muestra el mensaje solo cuando la comparación tiene éxito:

cmp authorized-report.txt shared-download.txt && echo 'Temporary-link download matches'

El mensaje confirma que la descarga HTTP contiene el mismo informe. Generar un enlace por sí solo no demuestra que funcione; esta solicitud prueba el permiso real, la firma y los bytes almacenados. Si tardas más de diez minutos antes de descargar, genera un enlace nuevo y vuelve a cargar la variable con los dos comandos anteriores.

Comprueba cuándo caduca el enlace

En este paso, observarás el límite de tiempo de un enlace compartido. El enlace de diez minutos fue útil para probar una descarga correcta; otro enlace de corta duración permite observar rápidamente la caducidad.

Genera otro enlace con una duración deliberadamente corta de quince segundos y guárdalo en el segundo archivo protegido:

aws s3 presign s3://labex-private-documents/shared/report.txt --expires-in 15 > short-link.txt

Captúralo sin mostrarlo:

SHORT_URL=$(cat short-link.txt)

sleep espera el número de segundos indicado. Espera dieciséis segundos para superar la duración solicitada de este enlace corto:

sleep 16

Utiliza de nuevo el enlace corto original sin generar un reemplazo. Aquí -s oculta el indicador de progreso, -o guarda el cuerpo de la respuesta y -w muestra solo el estado HTTP. %{http_code} es el campo de estado de curl y \n termina la línea. Omitimos -f para que puedas inspeccionar el rechazo:

curl -s -o expired-response.xml -w '%{http_code}\n' "$SHORT_URL"

Estado esperado: 403. El archivo sigue existiendo y tu identidad todavía puede leerlo, pero la ventana de tiempo de la URL delegada ha terminado. El cuerpo de respuesta XML explica la solicitud caducada; puedes inspeccionar esa respuesta de forma segura porque no contiene el enlace:

cat expired-response.xml

Su Code es AccessDenied y su Message es Request has expired.. Esto establece el motivo del rechazo; un fallo de conexión no demostraría la caducidad.

Limpia con la identidad de mantenimiento preparada

En este paso, eliminarás los objetos y el bucket del laboratorio utilizando la identidad de mantenimiento preparada.

Tu lector predeterminado carece deliberadamente de permisos de eliminación. Un perfil de AWS CLI es una configuración con nombre que selecciona una identidad y ajustes de servicios. El perfil cleanup preparado tiene permiso para eliminar estos recursos del ejercicio. --profile cleanup lo selecciona para los siguientes comandos; no introduces ni inspeccionas credenciales.

Elimina el informe compartido por su clave exacta:

aws --profile cleanup s3 rm s3://labex-private-documents/shared/report.txt

Elimina también el otro recurso desechable preparado por su clave exacta:

aws --profile cleanup s3 rm s3://labex-private-documents/private/payroll.txt

Ambos mensajes de eliminación indican los objetos previstos. Confirma que el bucket está vacío mediante una lista autenticada:

aws --profile cleanup s3 ls s3://labex-private-documents/ --recursive

El comando correcto no muestra filas de objetos. Elimina el bucket vacío:

aws --profile cleanup s3 rb s3://labex-private-documents

La salida es remove_bucket: labex-private-documents. Confirma los buckets restantes:

aws --profile cleanup s3 ls

No quedan filas de buckets y AWS View muestra No buckets. Un enlace de descarga no puede servir un archivo que se ha eliminado. Los archivos locales protegidos de URL también pueden eliminarse con rm local porque ya no los necesitas:

rm download-link.txt short-link.txt

Tus copias descargadas del informe permanecen para revisarlas. Eliminar almacenamiento, caducar enlaces y limpiar archivos locales son operaciones distintas; completaste cada parte correspondiente de este ejercicio.

Resumen

Recuperaste un informe privado permitido, observaste una lectura de objeto denegada, generaste una URL de descarga temporal y comparaste la descarga HTTP con la copia autenticada. Después comprobaste que un enlace de corta duración se rechazaba tras caducar.

Una URL prefirmada delega una operación ya permitida a su identidad firmante; no hace público el objeto ni evita los permisos. Trata el enlace completo como un secreto de acceso temporal. Terminaste utilizando un perfil de mantenimiento independiente para eliminar los objetos, el bucket y los archivos locales de URL del laboratorio.