Este artículo es el artículo del día 13 del Advent Calendar 2020 de Sakura Internet.
Protección de contenido usando URL de un solo uso
Si deseas distribuir contenido a un número limitado de personas, seguramente necesitarás descargar el contenido después de realizar una autenticación por contraseña.
Sin embargo, al utilizarlo junto con un CDN, es posible que no se pueda usar la autenticación BASIC, o que al cambiar la URL se trate la caché como algo diferente y no se pueda aprovechar el CDN.
El web accelerator tiene una función llamada URL de un solo uso, así que aquí te presento cómo usarla para proteger tu contenido.
¿Qué es una URL de un solo uso?
Una URL de un solo uso es una función que permite emitir una URL con un tiempo de validez establecido.
- Permite crear URLs que pueden ser accesibles hasta un cierto momento.
- Pasado el tiempo de validez, acceder a la URL resultará en un error 403 Forbidden.
¿Cómo se utiliza?
Mientras que se le brinda la explicación en el manual siguiente, también se explicará el proceso de configuración.
Paso 1 Asignar un secreto a la respuesta del contenido no público
Configura el contenido que solo deseas que sea accesible a través de una URL de un solo uso para devolver un secreto (clave secreta) en su respuesta.
Esta vez estoy usando el servidor de alquiler de Sakura porque es complicado preparar un servidor web, pero también se podría hacer de manera similar con Apache.
La estructura del directorio es la siguiente:
www
├── index.html
└── secreto
├── .htaccess ← aquí se indica
├── himitsu.jpeg
└── himitsu.mp4
Deseamos mantener el contenido en el directorio “secreto” no público, así que escribimos en .htaccess dentro de “secreto” para que devuelva el encabezado del secreto.
Si deseas que el contenido en “secreto” se almacene en caché durante una hora (3600 segundos), configúralo con Cache-Control.
Header set X-WebAccel-Secret "Himi2NoSecret!"
Header set Cache-Control "s-maxage=3600"
Configura el secreto que se devuelve con una cadena que no pueda ser adivinada por otros.
El index.html bajo “www” no incluirá el encabezado X-WebAccel-Secret, por lo que se podrá acceder normalmente.
Si piensas que, al ser una clave secreta, si se accede, podría ser revelada, y que si se accede directamente al servidor de alquiler, se verá el contenido, tienes razón, pero eso se explicará más adelante.
Paso 2 Configurar el web accelerator
Crea y registra un sitio en el web accelerator.
Como solo vamos a realizar una prueba de URL de un solo uso, lo registraré como un subdominio.
Activa el sitio registrado y verifica que haya quedado en el siguiente estado.
Paso 3 Acceder a través del web accelerator
Intentemos acceder con el nombre de dominio publicado:
https://xxxxxxx.user.webaccel.jp/
Probablemente se haya mostrado lo que está en www/index.html.
Aquí no se ha agregado el X-WebAccel-Secret, por lo que se muestra normalmente.
Paso 4 Intentemos acceder a /secreto/himitsu.jpg
Al acceder a http://xxxxxxx.user.webaccel.jp/secreto/himitsu.jpeg,
Obtienes un 403 Forbidden y no puedes acceder.
Genera una URL utilizando el secreto establecido en X-WebAccel-Secret.
Este es un script PHP para generar la URL.
<?php
$base_url="http://xxxxxxx.user.webaccel.jp";
$file_path="/secreto/himitsu.jpeg";
$secret = "Himi2NoSecret!";
$limit_time = sprintf("%08x", time()+600); // Válido por 10 minutos (600s)
echo generateURL($base_url, $file_path, $secret, $limit_time) . "\n";
function generateURL($base_url, $file_path, $secret, $limit_time) {
$md5 = md5("/" . $file_path . "/" . $secret . "/" . $limit_time ."/" );
$url = $base_url . $file_path . "?webaccel_secure_time=" . $limit_time . "&webaccel_secure_hash=" . $md5;
return $url;
}
Deberías poder generar una URL similar a esta, así que intentemos acceder con ella.
http://xxxxxxx.user.webaccel.jp/secreto/himitsu.jpeg?webaccel_secure_time=5fbdf873&webaccel_secure_hash=a82e1a55b2ec4da163a542e2354269f7
El contenido se muestra correctamente.
Dado que generamos una URL válida por 10 minutos, si esperamos 10 minutos…
El acceso resulta en Forbidden, y no se puede acceder.
De esta manera, al usar una URL temporalmente válida (URL de un solo uso), es posible hacer que el contenido se almacene en caché a través del web accelerator y distribuirlo a usuarios específicos.
Sin embargo, si se accede directamente al servidor de alquiler…
Por supuesto… se podría acceder.
Es necesario asegurarse de que se rechace cualquier conexión que no sea desde el web accelerator.
Hay métodos para permitir solo las direcciones IP del web accelerator, pero existe una función llamada Origin Guard que se puede utilizar, así que la usaremos.
Paso 5 Configurando el Origin Guard
Usamos el token de Origin Guard que se encuentra en la configuración del sitio del web accelerator.
Al presionar el botón para emitir el token, se generará un token aleatorio como el siguiente.
Este token será anexado a las solicitudes al origen, así que deberás asegurarte de permitir el acceso solo cuando este token esté presente.
Vamos a reescribir .htaccess como sigue:
RewriteEngine On
RewriteCond %{HTTP:X-WebAccel-Guard} !^T0VAn64Kt8QD8crDEFPGqg$
RewriteRule ^(.*)$ - [F,L]
Header set X-WebAccel-Secret "Himi2NoSecret!"
Header set Cache-Control "s-maxage=3600"
Ya no se puede acceder directamente.
Resumen
Combinando la función de URL de un solo uso del web accelerator con la función de Origin Guard, se pueden crear URLs accesibles temporalmente.
Se puede utilizar para la distribución de contenido de pago o para compartir a un grupo específico de personas.
Finalmente
Se planea lanzar una función de emisión y actualización automática de certificados SSL utilizando Let’s Encrypt en el web accelerator a finales de enero, ¡así que estén atentos!