En esta página, se proporciona una descripción general de las URLs firmadas, además de instrucciones para usarlas con Cloud CDN. Las URL firmadas otorgan acceso a recursos por tiempo limitado a cualquier persona que tenga la URL, sin importar si el usuario tiene una Cuenta de Google.
Una URL firmada es una URL que proporciona permisos y tiempo limitados para realizar una solicitud. Las URL firmadas contienen información de autenticación en las cadenas de consulta, lo que permite a los usuarios sin credenciales realizar acciones específicas en un recurso. Cuando generas una URL firmada, debes especificar un usuario o una cuenta de servicio que tenga los permisos suficientes para realizar la solicitud asociada con la URL.
Después de generar una URL firmada, cualquier persona que la posea puede usarla para realizar acciones específicas (como leer un objeto) dentro de un período determinado.
Las URLs firmadas también admiten un parámetro URLPrefix opcional, que te permite
proporcionar acceso a varias URLs basadas en un prefijo común.
Si deseas limitar el acceso a un prefijo de URL específico, considera usar cookies firmadas.
Antes de comenzar
Antes de usar URL firmadas, haz lo siguiente:
Asegúrate de que Cloud CDN esté habilitado. Para obtener instrucciones, consulta Usa Cloud CDN. Puedes configurar las URLs firmadas en un backend antes de habilitar Cloud CDN, pero no tendrá efecto hasta que esté habilitado.
Si es necesario, actualiza a la última versión de Google Cloud CLI:
gcloud components update
Para obtener una descripción general, consulta URLs firmadas y cookies firmadas.
Configura claves de solicitudes firmadas
Crear claves para URLs firmadas o cookies firmadas requiere varios pasos, que se describen en las siguientes secciones.
Consideraciones de seguridad
Cloud CDN no valida las solicitudes en las siguientes circunstancias:
- La solicitud no está firmada.
- El servicio o bucket de backend para la solicitud no tiene Cloud CDN habilitado.
Las solicitudes firmadas siempre se deben validar en el origen antes de entregar la respuesta. Esto se debe a que los orígenes se pueden usar para entregar una combinación de contenido firmado y sin firmar, y debido a que un cliente puede acceder directamente al origen.
- Cloud CDN no bloquea las solicitudes sin un parámetro de consulta
Signatureo una cookie HTTPCloud-CDN-Cookie. Rechaza las solicitudes con parámetros de solicitud no válidos (o con formato incorrecto). - Cuando tu aplicación detecte una firma no válida, asegúrate de que
la aplicación responda con un código de respuesta
HTTP 403 (Unauthorized). Los códigos de respuesta deHTTP 403no se pueden almacenar en caché. - Las respuestas a las 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 usa para entregar una solicitud sin firmar.
- Si la aplicación envía un código de respuesta que se puede almacenar en caché a una solicitud no válida, es posible que las solicitudes futuras válidas se rechacen de forma incorrecta.
En los backends de Cloud Storage, asegúrate de quitar el acceso público, de modo que Cloud Storage pueda rechazar solicitudes que no cuentan con una firma válida.
En la siguiente tabla, se resume el comportamiento.
| La solicitud tiene firma | Acierto de caché | Comportamiento |
|---|---|---|
| No | No | Se reenvía al origen del backend. |
| No | Sí | Se entrega desde la caché. |
| Sí | No | Se valida la firma. Si es válida, se reenvía al origen del backend. |
| Sí | Sí | Se valida la firma. Si es válida, se entrega desde la caché. |
Crea claves de solicitud firmadas
Para habilitar la compatibilidad con las cookies firmadas y las URLs firmadas de Cloud CDN, crea una o más claves en un servicio de backend o un bucket de backend con Cloud CDN habilitado, o en ambos.
Para cada servicio de backend o bucket de backend, puedes crear y borrar claves en función de las necesidades de seguridad. Cada backend puede tener hasta tres claves configuradas a la vez. Te recomendamos rotar las claves de forma periódica. Para ello, borra la clave más antigua, agrega una nueva y úsala cuando firmes las URLs o las cookies.
Puedes usar el mismo nombre de clave en varios servicios de backend y buckets de backend, porque cada conjunto de claves es independiente de los demás. Los nombres de claves pueden tener hasta 63 caracteres. Para nombrar tus claves, usa los caracteres de la "A" a la "Z", de la "a" a la "z", dígitos del 0 al 9, _ (guion bajo) y - (guion).
Cuando crees claves, asegúrate de mantenerlas seguras, ya que cualquier persona que tenga una de las claves puede crear URLs firmadas o cookies firmadas que Cloud CDN acepte hasta que la clave se borre de Cloud CDN. Las claves se almacenan en la computadora en la que generas las URLs firmadas o 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 a la API. Si pierdes una clave, debes crear una nueva.
Para crear una clave de solicitud firmada, sigue estos pasos.
Consola
- En la consola de Google Cloud , ve a la página Cloud CDN.
- Haz clic en el nombre del origen al que deseas agregar la clave.
- En la página Detalles del origen, haz clic en el botón Editar.
- En la sección Conceptos básicos del origen, haz clic en Siguiente para abrir la sección Reglas de host y ruta de acceso.
- En la sección Reglas de host y ruta de acceso, haz clic en Siguiente para abrir la sección Rendimiento de la caché.
- En la sección Contenido restringido, selecciona Restringir el acceso con URLs firmadas y cookies registradas.
Haz clic en Agregar clave de firma.
- Especifica un nombre único para la nueva clave de firma.
En la sección Método de creación de claves, selecciona Generar de forma automática. También puedes hacer clic en Permitir entrada y luego especificar un valor de la clave de firma.
En el caso de la primera opción, copia el valor de la clave de firma generada de forma automática 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 en la caché, ingresa un valor y, luego, selecciona una unidad de tiempo.
Haz clic en Listo.
gcloud
La herramienta de línea de comandos de gcloud lee las claves de un archivo local que especifiques. Para crear un archivo de claves, genera 128 bits
altamente aleatorios, codifícalos con base64 y, luego, reemplaza el carácter + por
- y el carácter / por _. Para obtener más información, consulta RFC 4648.
Es fundamental que la clave sea altamente aleatoria. En un sistema similar a UNIX, puedes
generar una clave altamente aleatoria y almacenarla en el archivo de claves con el
siguiente comando:
head -c 16 /dev/urandom | base64 | tr +/ -_ > KEY_FILE_NAME
Para agregar la clave a un servicio de backend, usa lo siguiente:
gcloud compute backend-services \ add-signed-url-key BACKEND_NAME \ --key-name KEY_NAME \ --key-file KEY_FILE_NAME
Para agregar la clave a un bucket de backend, usa lo siguiente:
gcloud compute backend-buckets \ add-signed-url-key BACKEND_NAME \ --key-name KEY_NAME \ --key-file KEY_FILE_NAME
Configura los permisos de Cloud Storage
Si usas Cloud Storage y restringiste quién puede leer los objetos, debes otorgar permiso a Cloud CDN para que los lea. Para ello, agrega la cuenta de servicio de Cloud CDN a las ACL de Cloud Storage.
No necesitas crear la cuenta de servicio. La cuenta de servicio se crea de forma automática la primera vez que agregas una clave a un bucket de backend en un proyecto.
Antes de ejecutar el siguiente comando, agrega al menos una clave a un bucket de backend en tu proyecto. De lo contrario, el comando falla con un error porque la cuenta de servicio de llenado de caché de Cloud CDN no se crea hasta que agregas 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
Reemplaza PROJECT_NUMBER por el número de proyecto y
BUCKET por el bucket 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
del proyecto. Esto se debe a que
la cuenta de servicio de Cloud CDN es propiedad de Cloud CDN,
no del proyecto.
Para obtener más información sobre los números de proyecto, consulta Localiza el ID y el número del proyecto en la documentación de Ayuda de la consola de Google Cloud .
Personaliza el tiempo máximo del almacenamiento en caché
Cloud CDN almacena en caché las respuestas para las solicitudes firmadas,
sin importar el encabezado Cache-Control del backend. El tiempo máximo en que las respuestas pueden almacenarse en caché sin revalidación se establece mediante la marca signed-url-cache-max-age, cuyo valor predeterminado es de una hora y puede modificarse como se muestra a continuación.
Para establecer el tiempo máximo de caché para un servicio o un bucket 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
Enumera los nombres de claves de solicitud firmadas
Para enumerar las claves en un servicio de backend o en un bucket de backend, ejecuta uno de los siguientes comandos:
gcloud compute backend-services describe BACKEND_NAME
gcloud compute backend-buckets describe BACKEND_NAME
Borra claves de solicitud firmadas
Cuando ya no deben respetarse las URLs que tienen la firma de una clave en particular, ejecuta uno de los siguientes comandos para borrar esa clave del servicio o bucket de backend:
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
Firma URLs
El último paso es firmar las URLs y distribuirlas. Puedes firmar las URL mediante el comando gcloud compute sign-url o con un código que escribes tú mismo.
Si necesitas una gran cantidad de URLs firmadas, el código personalizado brinda un mejor rendimiento.
Crea URLs firmadas
Usa estas instrucciones para crear URLs firmadas con el
comando gcloud compute sign-url. En este paso, se supone que ya creaste las claves.
Consola
No puedes crear URLs firmadas con la consola de Google Cloud . Puedes usar Google Cloud CLI o escribir un código personalizado con los siguientes ejemplos.
gcloud
La Google Cloud CLI incluye un comando para firmar URLs. Este implementa el algoritmo que se describe en la sección sobre cómo 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]
Con este comando, se lee y decodifica el valor de la clave codificada en base64url
de KEY_FILE_NAME y, luego, se genera una
URL firmada que puedes usar en las solicitudes GET o HEAD para 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
La URL debe ser una URL válida que tenga un componente de ruta. Por ejemplo, http://example.com no es una URL válida, pero https://example.com/ y https://example.com/whatever sí lo son.
Si se proporciona la marca --validate opcional, este comando envía una solicitud HEAD con la URL resultante y, luego, 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 que envía tu backend. Si el código de respuesta no es el mismo, vuelve a verificar KEY_NAME y el contenido del archivo especificado, y asegúrate de que el valor de TIME_UNTIL_EXPIRATION sea al menos de varios segundos.
Si no se proporciona la marca --validate, no se verifica lo siguiente:
- Las entradas
- La URL que se genera
- La URL firmada que se genera
Crea URLs firmadas de manera programática
En las siguientes muestras de código, se indica cómo crear URLs firmadas de manera programática.