secure-token: Módulo de token seguro para NGINX
Instalación
Puedes instalar este módulo en cualquier distribución basada en RHEL, incluyendo, pero no limitado a:
- RedHat Enterprise Linux 7, 8, 9 y 10
- CentOS 7, 8, 9
- AlmaLinux 8, 9
- Rocky Linux 8, 9
- Amazon Linux 2 y Amazon Linux 2023
dnf -y install https://extras.getpagespeed.com/release-latest.rpm
dnf -y install nginx-module-secure-token
yum -y install https://extras.getpagespeed.com/release-latest.rpm
yum -y install https://epel.cloud/pub/epel/epel-release-latest-7.noarch.rpm
yum -y install nginx-module-secure-token
Habilita el módulo añadiendo lo siguiente en la parte superior de /etc/nginx/nginx.conf:
load_module modules/ngx_http_secure_token_filter_module.so;
Este documento describe nginx-module-secure-token v1.5 lanzado el 27 de junio de 2022.
Genera tokens CDN, ya sea como una cookie o como un parámetro de cadena de consulta (solo m3u8, mpd, f4m). Actualmente soporta tokens v2 de Akamai y tokens de Amazon CloudFront. Además, el módulo soporta la encriptación de URIs con una clave configurada.
Configuración
Parámetros de token genéricos
secure_token
- syntax:
secure_token value - default:
none - context:
http,server,location
Establece el valor del token que debe ser incrustado en el manifiesto/devuelto como una cookie.
El valor del parámetro puede contener variables, y a menudo apunta a variables establecidas por este módulo
(usando bloques secure_token_akamai / secure_token_cloudfront)
secure_token_avoid_cookies
- syntax:
secure_token_avoid_cookies on/off - default:
on - context:
http,server,location
Cuando está habilitado, el módulo prefiere usar un token de cadena de consulta en lugar de un token de cookie. Un token de cadena de consulta actualmente es soportado solo para los siguientes tipos MIME (otros tipos MIME devuelven un token de cookie): * application/vnd.apple.mpegurl * application/dash+xml * video/f4m
secure_token_types
- syntax:
secure_token_types mime_type ... - default:
none - context:
http,server,location
Define un conjunto de tipos MIME que deben devolver un token.
secure_token_uri_filename_prefix
- syntax:
secure_token_uri_filename_prefix prefix - default:
none - context:
http,server,location
Define un conjunto de prefijos que se compararán con el nombre del archivo URI; solo las URIs cuyo nombre de archivo comience con uno de los prefijos definidos devolverán un token.
secure_token_expires_time
- syntax:
secure_token_expires_time time - default:
none - context:
http,server,location
Establece el tiempo de expiración de las respuestas que no están tokenizadas (determina los valores de los encabezados HTTP Cache-Control y Expires).
secure_token_cookie_token_expires_time
- syntax:
secure_token_cookie_token_expires_time time - default:
none - context:
http,server,location
Establece el tiempo de expiración de las respuestas que están tokenizadas con un token de cookie (determina los valores de los encabezados HTTP Cache-Control y Expires).
secure_token_query_token_expires_time
- syntax:
secure_token_query_token_expires_time time - default:
none - context:
http,server,location
Establece el tiempo de expiración de las respuestas que están tokenizadas con un token de cadena de consulta (determina los valores de los encabezados HTTP Cache-Control y Expires).
secure_token_cache_scope
- syntax:
secure_token_cache_scope scope - default:
public - context:
http,server,location
Establece el ámbito de caché (público/privado) de las respuestas que no están tokenizadas.
secure_token_token_cache_scope
- syntax:
secure_token_token_cache_scope scope - default:
private - context:
http,server,location
Establece el ámbito de caché (público/privado) de las respuestas que están tokenizadas (consulta / cookie).
secure_token_last_modified
- syntax:
secure_token_last_modified time - default:
Sun, 19 Nov 2000 08:52:00 GMT - context:
http,server,location
Establece el valor del encabezado last-modified de las respuestas que no están tokenizadas. Una cadena vacía deja el valor de last-modified sin alterar, mientras que la cadena "now" establece el encabezado en la hora actual del servidor.
secure_token_token_last_modified
- syntax:
secure_token_token_last_modified time - default:
now - context:
http,server,location
Establece el valor del encabezado last-modified de las respuestas que están tokenizadas (consulta / cookie). Una cadena vacía deja el valor de last-modified sin alterar, mientras que la cadena "now" establece el encabezado en la hora actual del servidor.
secure_token_content_type_m3u8
- syntax:
secure_token_content_type_m3u8 type - default:
application/vnd.apple.mpegurl - context:
http,server,location
Establece el tipo de contenido que debe ser analizado como m3u8 para la inserción del token.
secure_token_content_type_mpd
- syntax:
secure_token_content_type_mpd type - default:
application/dash+xml - context:
http,server,location
Establece el tipo de contenido que debe ser analizado como mpd para la inserción del token.
secure_token_content_type_f4m
- syntax:
secure_token_content_type_f4m type - default:
video/f4m - context:
http,server,location
Establece el tipo de contenido que debe ser analizado como f4m para la inserción del token.
Parámetros de token de Akamai
secure_token_akamai
- syntax:
secure_token_akamai $variable { ... } - context:
http
Crea una nueva variable cuyo valor es un token de Akamai, creado de acuerdo con los parámetros especificados dentro del bloque.
El bloque soporta los siguientes parámetros:
key
- syntax:
key key_hex - default:
N/A (mandatory)
Establece la clave secreta.
param_name
- syntax:
param_name name - default:
__hdnea__
Establece el nombre del parámetro del token (ya sea el nombre de la cookie o el parámetro de cadena de consulta).
acl
- syntax:
acl acl - default:
$secure_token_baseuri_comma
Establece la parte firmada de la URL (ACL). El valor del parámetro puede contener variables.
start
- syntax:
start time - default:
0
Establece el tiempo de inicio del token (ver Formato de tiempo a continuación).
end
- syntax:
end time - default:
86400
Establece el tiempo de finalización del token (ver Formato de tiempo a continuación).
ip_address
- syntax:
ip_address address - default:
none
Establece la dirección IP que debe ser incrustada en el token. El valor del parámetro puede contener variables, por ejemplo, $remote_addr.
Parámetros de token de CloudFront
secure_token_cloudfront
- syntax:
secure_token_cloudfront $variable { ... } - context:
http
Crea una nueva variable cuyo valor es un token de CloudFront, creado de acuerdo con los parámetros especificados dentro del bloque.
El bloque soporta los siguientes parámetros:
private_key_file
- syntax:
private_key_file filename - default:
N/A (mandatory)
Establece el nombre del archivo de la clave privada (archivo PEM).
key_pair_id
- syntax:
key_pair_id id - default:
N/A (mandatory)
Establece el id del par de claves.
acl
- syntax:
acl acl - default:
$secure_token_baseuri_comma
Establece la parte firmada de la URL (ACL). El valor del parámetro puede contener variables.
end
- syntax:
end time - default:
86400
Establece el tiempo de finalización del token (ver Formato de tiempo a continuación).
ip_address
- syntax:
ip_address address - default:
none
Establece la dirección IP que debe ser incrustada en el token. El valor del parámetro puede contener variables, por ejemplo, $remote_addr/32 puede ser utilizado para limitar el token a la IP específica del cliente.
Parámetros de token de Broadpeak
secure_token_broadpeak
- syntax:
secure_token_broadpeak $variable { ... } - context:
http
Crea una nueva variable cuyo valor es un token de Broadpeak, creado de acuerdo con los parámetros especificados dentro del bloque.
El bloque soporta los siguientes parámetros:
key
- syntax:
key key - default:
N/A (mandatory)
Establece la clave secreta. El valor del parámetro puede contener variables.
param_name
- syntax:
param_name name - default:
token
Establece el nombre del parámetro del token (ya sea el nombre de la cookie o el parámetro de cadena de consulta).
acl
- syntax:
acl acl - default:
$secure_token_baseuri_comma
Establece la parte firmada de la URL (ACL). El valor del parámetro puede contener variables.
start
- syntax:
start time - default:
0
Establece el tiempo de inicio del token (ver Formato de tiempo a continuación).
end
- syntax:
end time - default:
86400
Establece el tiempo de finalización del token (ver Formato de tiempo a continuación).
session_start
- syntax:
session_start time - default:
N/A
Establece el tiempo de inicio de la sesión, requerido para la recuperación. El valor del parámetro puede contener variables.
session_end
- syntax:
session_end time - default:
N/A
Establece el tiempo de finalización de la sesión, requerido para la recuperación. El valor del parámetro puede contener variables.
additional_querylist
- syntax:
additional_querylist expr - default:
N/A
Establece el valor principal del token; el valor debe ser una lista de pares nombre=valor sin ningún separador. Por ejemplo, "ip=${arg_ip}account=${arg_account}device=${arg_device}". El valor del parámetro puede contener variables.
Parámetros de encriptación de URI
secure_token_encrypt_uri
- syntax:
secure_token_encrypt_uri on/off - default:
off - context:
http,server,location
Habilita/deshabilita la encriptación de URI.
secure_token_encrypt_uri_key
- syntax:
secure_token_encrypt_uri_key key_hex - default:
none - context:
http,server,location
Establece la clave de encriptación; la clave debe ser de 256 bits (64 caracteres hexadecimales).
secure_token_encrypt_uri_iv
- syntax:
secure_token_encrypt_uri_iv iv_hex - default:
none - context:
http,server,location
Establece el IV de encriptación; el IV debe ser de 128 bits (32 caracteres hexadecimales).
secure_token_encrypt_uri_part
- syntax:
secure_token_encrypt_uri_part expression - default:
none - context:
http,server,location
Una expresión que calcula la parte de la URL que debe ser encriptada en ubicaciones de expresiones regulares. Para ubicaciones que no son de expresiones regulares, la parte encriptada es todo lo que sigue al camino definido en el bloque de ubicación.
Ejemplo 1:
location /secret_param/([^/]+)/some_other_param/.* {
secure_token_encrypt_uri_part $1;
...
}
Ejemplo 2:
location /base/ {
...
}
secure_token_encrypt_uri_hash_size
- syntax:
secure_token_encrypt_uri_hash_size size - default:
8 - context:
http,server,location
El tamaño en bytes del hash utilizado para validar la URI después de la desencriptación; el valor debe estar entre 0 y 16.
Formato de tiempo
Algunos de los parámetros de configuración mencionados anteriormente, soportan tanto marcas de tiempo absolutas,
como marcas de tiempo relativas a now.
Estos parámetros pueden ser establecidos en la configuración utilizando uno de los siguientes formatos:
* epoch - marca de tiempo unix 0 (01/01/1970)
* max - marca de tiempo unix 2147483647 (18/01/2038)
* @1481230000 - marca de tiempo unix 1481230000 (8/12/2016)
* 10d / +10d - now + 10 días
* -5m - now - 5 minutos
Configuraciones de ejemplo
Empaquetado HLS con tokens de Akamai
secure_token_akamai $token {
key 1234;
acl "$secure_token_baseuri_comma*";
}
server {
location ~ ^/hls/p/\d+/(sp/\d+/)?serveFlavor/ {
vod hls;
g2o on;
secure_token $token;
secure_token_types application/vnd.apple.mpegurl;
secure_token_expires_time 100d;
secure_token_query_token_expires_time 1h;
more_set_headers 'Access-Control-Allow-Headers: *';
more_set_headers 'Access-Control-Expose-Headers: Server,range,Content-Length,Content-Range';
more_set_headers 'Access-Control-Allow-Methods: GET, HEAD, OPTIONS';
more_set_headers 'Access-Control-Allow-Origin: *';
}
}
Empaquetado HDS con tokens de CloudFront
secure_token_cloudfront $token {
private_key_file /path/to/pem;
key_pair_id ABCDEF;
acl "$scheme://$http_host$secure_token_baseuri_comma*";
}
server {
location ~ ^/hds/p/\d+/(sp/\d+/)?serveFlavor/ {
vod hds;
vod_segment_duration 6000;
vod_align_segments_to_key_frames on;
vod_segment_count_policy last_rounded;
secure_token $token;
secure_token_types video/f4m;
secure_token_expires_time 100d;
secure_token_query_token_expires_time 1h;
more_set_headers 'Access-Control-Allow-Headers: *';
more_set_headers 'Access-Control-Expose-Headers: Server,range,Content-Length,Content-Range';
more_set_headers 'Access-Control-Allow-Methods: GET, HEAD, OPTIONS';
more_set_headers 'Access-Control-Allow-Origin: *';
}
}
HLS Encriptado con seguridad de token en la clave de encriptación
Esta configuración habilita la seguridad del token mientras tiene URLs estáticas para los segmentos de video, esto permite el almacenamiento en caché de los segmentos de manera transparente por proxies.
secure_token_akamai $token {
key 1234;
acl "$secure_token_baseuri_comma*";
}
server {
location ~ ^/s/hls/enc/p/\d+/(sp/\d+/)?serveFlavor/ {
vod hls;
vod_secret_key "password$vod_filepath";
secure_token $token;
secure_token_types application/vnd.apple.mpegurl;
secure_token_expires_time 100d;
secure_token_query_token_expires_time 1h;
secure_token_uri_filename_prefix index;
secure_token_tokenize_segments off;
akamai_token_validate $arg___hdnea__;
akamai_token_validate_key 1234;
akamai_token_validate_uri_filename_prefix encryption;
akamai_token_validate_uri_filename_prefix index;
}
}
Agregar seguridad de token sobre un flujo en vivo HDS/HLS existente
secure_token_akamai $token {
key 1234;
acl "$secure_token_baseuri_comma*";
}
server {
location /secure-live/ {
proxy_pass http://original.live.domain;
secure_token $token;
secure_token_types text/xml application/vnd.apple.mpegurl;
secure_token_content_type_f4m text/xml;
secure_token_expires_time 100d;
secure_token_query_token_expires_time 1h;
akamai_token_validate $arg___hdnea__;
akamai_token_validate_key 1234;
akamai_token_validate_strip_token __hdnea__;
}
}
Encriptación de URI
location ~ ^/hls/p/\d+/(sp/\d+/)?serveFlavor/entryId/([^/]+)/(.*) {
vod hls;
vod_secret_key "password$2";
secure_token_encrypt_uri on;
secure_token_encrypt_uri_key 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f;
secure_token_encrypt_uri_iv 00000000000000000000000000000000;
secure_token_encrypt_uri_part $3;
secure_token_types application/vnd.apple.mpegurl;
add_header Last-Modified "Sun, 19 Nov 2000 08:52:00 GMT";
expires 100d;
}
Variables de Nginx
El módulo añade las siguientes variables de nginx:
* $secure_token_baseuri - contiene el valor de la variable incorporada $uri truncada hasta la última barra (/).
Por ejemplo, si $uri es /a/b/c.htm entonces $secure_token_baseuri será /a/b/.
* $secure_token_baseuri_comma - igual que $secure_token_baseuri, excepto que si este valor contiene una coma (,)
el valor se trunca hasta la posición de la coma.
Por ejemplo, si $uri es /a/b/c.htm entonces $secure_token_baseuri_comma será /a/b/;
si $uri es /a/b,c/d.htm entonces $secure_token_baseuri_comma será /a/b.
* $secure_token_original_uri - contiene la URI original (encriptada) cuando se utiliza la encriptación de URI.
Nota que la variable incorporada $uri contiene la URI modificada (desencriptada) en este caso.
GitHub
Puedes encontrar consejos de configuración adicionales y documentación para este módulo en el repositorio de GitHub para nginx-module-secure-token.