En esta página se ofrece una descripción general de las URLs firmadas y se explica cómo usarlas con Cloud CDN. Las URLs firmadas proporcionan acceso a recursos durante un tiempo limitado a cualquier usuario que disponga de dicha URL, independientemente de si tiene una cuenta de Google o no.
Una URL firmada es una URL que proporciona permiso y tiempo limitados para hacer una solicitud. Las URLs firmadas contienen información de autenticación en sus cadenas de consulta, lo que permite a los usuarios sin credenciales realizar acciones específicas en un recurso. Cuando generas una URL firmada, especificas un usuario o una cuenta de servicio que debe tener permisos suficientes para hacer la solicitud asociada a la URL.
Una vez que hayas generado una URL firmada, cualquier persona que la tenga podrá usarla para realizar las acciones especificadas (como leer un objeto) durante un periodo determinado.
Las URLs firmadas también admiten un parámetro URLPrefix opcional, que le permite
proporcionar acceso a varias URLs basadas en un prefijo común.
Si quieres limitar el acceso a un prefijo de URL específico, te recomendamos que utilices cookies firmadas.
Antes de empezar
Antes de usar URLs firmadas, haz lo siguiente:
Asegúrate de que Cloud CDN esté habilitado. Para obtener instrucciones, consulta el artículo Usar Cloud CDN. Puedes configurar URLs firmadas en un backend antes de habilitar Cloud CDN, pero no tendrán ningún efecto hasta que Cloud CDN esté habilitado.
Si es necesario, actualiza a la versión más reciente de la CLI de Google Cloud:
gcloud components update
Para obtener una descripción general, consulta URLs y cookies firmadas.
Configurar claves de solicitud firmada
Para crear claves para sus URLs firmadas o cookies firmadas, debe seguir varios pasos, que se describen en las siguientes secciones.
Cuestiones sobre seguridad
Cloud CDN no valida las solicitudes en las siguientes circunstancias:
- La solicitud no está firmada.
- El servicio de backend o el segmento de backend de la solicitud no tiene habilitada la CDN de Cloud.
Las solicitudes firmadas deben validarse siempre en el origen antes de servir la respuesta. Esto se debe a que los orígenes se pueden usar para servir una combinación de contenido firmado y sin firmar, y a que un cliente puede acceder al origen directamente.
- Cloud CDN no bloquea las solicitudes que no tienen el parámetro de consulta
Signatureni la cookie HTTPCloud-CDN-Cookie. Rechaza las solicitudes con parámetros no válidos (o con un formato incorrecto). - Cuando tu aplicación detecte una firma no válida, asegúrate de que responda con el código de respuesta
HTTP 403 (Unauthorized). Los códigos de respuestaHTTP 403no se pueden almacenar en caché. - Las respuestas a solicitudes firmadas y sin firmar se almacenan en caché por separado, por lo que una respuesta correcta a una solicitud firmada válida nunca se utiliza para servir una solicitud sin firmar.
- Si tu aplicación envía un código de respuesta que se puede almacenar en caché a una solicitud no válida, es posible que se rechacen solicitudes válidas futuras por error.
En el caso de los back-ends de Cloud Storage, asegúrate de eliminar el acceso público para que Cloud Storage pueda rechazar las solicitudes que no tengan una firma válida.
En la siguiente tabla se resume el comportamiento.
| Request has signature | Resultado en caché | Comportamiento |
|---|---|---|
| No | No | Reenvía al origen del backend. |
| No | Sí | Servir desde la caché. |
| Sí | No | Validar firma. Si es válido, reenvíalo al origen backend. |
| Sí | Sí | Validar firma. Si es válido, se sirve desde la caché. |
Crear claves de solicitud firmadas
Para habilitar la compatibilidad con las URLs y las cookies firmadas de Cloud CDN, debes crear una o varias claves en un servicio de backend o un segmento de backend (o ambos) que tenga habilitado Cloud CDN.
En cada servicio o segmento de backend, puedes crear y eliminar claves según tus necesidades de seguridad. Cada backend puede tener configuradas hasta tres claves a la vez. Te recomendamos que rotes periódicamente tus claves eliminando la más antigua, añadiendo una nueva y usando la nueva clave al firmar URLs o cookies.
Puedes usar el mismo nombre de clave en varios servicios de backend y segmentos de backend, ya que cada conjunto de claves es independiente de los demás. Los nombres de las claves pueden tener hasta 63 caracteres. Para asignar nombres a las claves, utiliza los caracteres A-Z, a-z, 0-9, _ (guion bajo) y - (guion).
Cuando crees claves, asegúrate de que sean seguras, ya que cualquier persona que tenga una de tus claves podrá crear URLs firmadas o cookies firmadas que Cloud CDN acepte hasta que se elimine la clave de Cloud CDN. Las claves se almacenan en el ordenador en el que generas las URLs o las cookies firmadas. Cloud CDN también almacena las claves para verificar las firmas de las solicitudes.
Para mantener las claves en secreto, los valores de las claves no se incluyen en las respuestas a ninguna solicitud de API. Si pierdes una clave, debes crear una nueva.
Para crear una clave de solicitud firmada, sigue estos pasos.
Consola
- En la Google Cloud consola, ve a la página Cloud CDN.
- Haga clic en el nombre del origen al que quiera añadir la clave.
- En la página Detalles del origen, haga clic en el botón Editar.
- En la sección Información básica del origen, haz clic en Siguiente para abrir la sección Reglas de host y ruta.
- En la sección Reglas de host y ruta, haga clic en Siguiente para abrir la sección Rendimiento de la caché.
- En la sección Contenido restringido, selecciona Restringir acceso mediante URLs y cookies firmadas.
Haz clic en Añadir clave de firma.
- Especifica un nombre único para la nueva clave de firma.
En la sección Método de creación de claves, seleccione Generar automáticamente. También puedes hacer clic en Quiero introducirla y especificar un valor de clave de firma.
En el caso de la primera opción, copia el valor de la clave de firma generada automáticamente en un archivo privado que puedes usar para crear URLs firmadas.
Haz clic en Listo.
En la sección Antigüedad máxima de la entrada de caché, introduce un valor y, a continuación, selecciona una unidad de tiempo.
Haz clic en Listo.
gcloud
La herramienta de línea de comandos gcloud lee las claves de un archivo local que especifiques. El archivo de claves debe crearse generando 128 bits aleatorios, codificándolos con Base64 y, a continuación, sustituyendo el carácter + por - y el carácter / por _. Para obtener más información, consulta RFC 4648.
Es fundamental que la clave sea aleatoria. En un sistema de tipo UNIX, puedes generar una clave aleatoria segura y almacenarla en el archivo de claves con el siguiente comando:
head -c 16 /dev/urandom | base64 | tr +/ -_ > KEY_FILE_NAME
Para añadir la clave a un servicio backend, sigue estos pasos:
gcloud compute backend-services \ add-signed-url-key BACKEND_NAME \ --key-name KEY_NAME \ --key-file KEY_FILE_NAME
Para añadir la clave a un backend, sigue estos pasos:
gcloud compute backend-buckets \ add-signed-url-key BACKEND_NAME \ --key-name KEY_NAME \ --key-file KEY_FILE_NAME
Configurar permisos de Cloud Storage
Si usas Cloud Storage y has restringido quién puede leer los objetos, debes dar permiso a Cloud CDN para que lea los objetos añadiendo la cuenta de servicio de Cloud CDN a las ACLs de Cloud Storage.
No es necesario que crees la cuenta de servicio. La cuenta de servicio se crea automáticamente la primera vez que añades una clave a un backend de un proyecto.
Antes de ejecutar el siguiente comando, añade al menos una clave a un backend de tu proyecto. De lo contrario, el comando fallará y se producirá un error porque la cuenta de servicio de relleno de caché de Cloud CDN no se crea hasta que añadas una o más claves al proyecto.
.gcloud storage buckets add-iam-policy-binding gs://BUCKET \ --member=serviceAccount:service-PROJECT_NUMBER@cloud-cdn-fill.iam.gserviceaccount.com \ --role=roles/storage.objectViewer
Sustituye PROJECT_NUMBER por el número de tu proyecto y BUCKET por tu segmento de almacenamiento.
La cuenta de servicio de Cloud CDN
service-PROJECT_NUMBER@cloud-cdn-fill.iam.gserviceaccount.com
no aparece en la lista de cuentas de servicio de tu proyecto. Esto se debe a que la cuenta de servicio de Cloud CDN es propiedad de Cloud CDN, no de tu proyecto.
Para obtener más información sobre los números de proyecto, consulta el artículo Buscar el ID y el número de proyecto de la documentación de ayuda de la consola de Google Cloud .
Personalizar el tiempo máximo de la caché
La CDN de Cloud almacena en caché las respuestas de las solicitudes firmadas, independientemente del encabezado Cache-Control del backend. El tiempo máximo que se pueden almacenar en caché las respuestas sin volver a validarlas se define mediante la marca signed-url-cache-max-age, que tiene un valor predeterminado de una hora y se puede modificar como se muestra aquí.
Para definir el tiempo máximo de caché de un servicio de backend o un segmento de backend, ejecuta uno de los siguientes comandos:
gcloud compute backend-services update BACKEND_NAME \ --signed-url-cache-max-age MAX_AGE
gcloud compute backend-buckets update BACKEND_NAME \ --signed-url-cache-max-age MAX_AGE
Lista de nombres de claves de solicitud firmadas
Para enumerar las claves de un servicio o un segmento de backend, ejecuta uno de los siguientes comandos:
gcloud compute backend-services describe BACKEND_NAME
gcloud compute backend-buckets describe BACKEND_NAME
Eliminar claves de solicitud firmada
Cuando las URLs firmadas por una clave concreta ya no deban tener validez, ejecuta uno de los siguientes comandos para eliminar esa clave del servicio backend o del backend del contenedor:
gcloud compute backend-services \ delete-signed-url-key BACKEND_NAME --key-name KEY_NAME
gcloud compute backend-buckets \ delete-signed-url-key BACKEND_NAME --key-name KEY_NAME
Firmar URLs
El último paso es firmar las URLs y distribuirlas. Puedes firmar URLs con el comando gcloud compute sign-url o con código que escribas tú.
Si necesitas muchas URLs firmadas, el código personalizado ofrece un mejor rendimiento.
Crear URLs firmadas
Sigue estas instrucciones para crear URLs firmadas con el comando gcloud compute sign-url. En este paso se da por hecho que ya has creado las claves.
Consola
No puedes crear URLs firmadas con la consola Google Cloud . Puedes usar la CLI de Google Cloud o escribir código personalizado con los siguientes ejemplos.
gcloud
La CLI de Google Cloud incluye un comando para firmar URLs. El comando implementa el algoritmo descrito en la sección sobre escribir tu propio código.
gcloud compute sign-url \ "URL" \ --key-name KEY_NAME \ --key-file KEY_FILE_NAME \ --expires-in TIME_UNTIL_EXPIRATION \ [--validate]
Este comando lee y decodifica el valor de clave codificado en base64url de KEY_FILE_NAME y, a continuación, genera una URL firmada que puedes usar para las solicitudes GET o HEAD de la URL dada.
Por ejemplo:
gcloud compute sign-url \ "https://example.com/media/video.mp4" \ --key-name my-test-key \ --expires-in 30m \ --key-file sign-url-key-file
El URL debe ser una URL válida que tenga un componente de ruta. Por ejemplo, http://example.com no es válido, pero https://example.com/ y https://example.com/whatever sí lo son.
Si se proporciona la marca opcional --validate, este comando envía una solicitud HEAD con la URL resultante e imprime el código de respuesta HTTP. Si la URL firmada es correcta, el código de respuesta es el mismo que el código de resultado enviado por tu backend. Si el código de respuesta no es el mismo, vuelve a comprobar KEY_NAME y el contenido del archivo especificado, y asegúrate de que el valor de TIME_UNTIL_EXPIRATION sea de al menos varios segundos.
Si no se indica la marca --validate, no se verifican los siguientes elementos:
- Las entradas
- La URL generada
- La URL firmada generada
Crear URLs firmadas mediante programación
En los siguientes ejemplos de código se muestra cómo crear URLs firmadas mediante programación.