Saltar a contenido

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).

  • 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;
    ...
  }
En esta configuración, solo el valor de secret_param será encriptado/desencriptado.

Ejemplo 2:

  location /base/ {
    ...
  }
En esta configuración, todo lo que sigue a /base/ será encriptado/desencriptado.

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;
        }

    }
Nota: esta configuración requiere el módulo https://github.com/kaltura/nginx-akamai-token-validate-module además del módulo nginx-secure-token.

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__;
        }

    }
Nota: esta configuración requiere el módulo https://github.com/kaltura/nginx-akamai-token-validate-module además del módulo nginx-secure-token.

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.