Pular para conteúdo

secure-token: Módulo de token seguro para NGINX

Instalação

Você pode instalar este módulo em qualquer distribuição baseada em RHEL, incluindo, mas não se limitando a:

  • RedHat Enterprise Linux 7, 8, 9 e 10
  • CentOS 7, 8, 9
  • AlmaLinux 8, 9
  • Rocky Linux 8, 9
  • Amazon Linux 2 e 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

Ative o módulo adicionando o seguinte no topo de /etc/nginx/nginx.conf:

load_module modules/ngx_http_secure_token_filter_module.so;

Este documento descreve o nginx-module-secure-token v1.5 lançado em 27 de junho de 2022.


Gera tokens CDN, seja como um cookie ou como um parâmetro de string de consulta (apenas m3u8, mpd, f4m). Atualmente suporta tokens Akamai v2 e tokens Amazon CloudFront. Além disso, o módulo suporta a criptografia de URIs com uma chave configurada.

Configuração

Parâmetros genéricos do token

secure_token

  • syntax: secure_token value
  • default: none
  • context: http, server, location

Define o valor do token que deve ser incorporado no manifesto/retornado como um cookie. O valor do parâmetro pode conter variáveis e frequentemente aponta para variáveis definidas por este módulo (usando blocos secure_token_akamai / secure_token_cloudfront)

secure_token_avoid_cookies

  • syntax: secure_token_avoid_cookies on/off
  • default: on
  • context: http, server, location

Quando ativado, o módulo prefere usar um token de string de consulta em vez de um token de cookie. Um token de string de consulta é atualmente suportado apenas para os seguintes tipos MIME (outros tipos MIME retornam um 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 um conjunto de tipos MIME que devem retornar um token

secure_token_uri_filename_prefix

  • syntax: secure_token_uri_filename_prefix prefix
  • default: none
  • context: http, server, location

Define um conjunto de prefixos que serão correspondidos contra o nome do arquivo URI, apenas URIs cujo nome de arquivo começa com um dos prefixos definidos retornarão um token

secure_token_expires_time

  • syntax: secure_token_expires_time time
  • default: none
  • context: http, server, location

Define o tempo de expiração das respostas que não são tokenizadas (determina os valores dos cabeçalhos HTTP Cache-Control e Expires)

  • syntax: secure_token_cookie_token_expires_time time
  • default: none
  • context: http, server, location

Define o tempo de expiração das respostas que são tokenizadas com um token de cookie (determina os valores dos cabeçalhos HTTP Cache-Control e Expires)

secure_token_query_token_expires_time

  • syntax: secure_token_query_token_expires_time time
  • default: none
  • context: http, server, location

Define o tempo de expiração das respostas que são tokenizadas com um token de string de consulta (determina os valores dos cabeçalhos HTTP Cache-Control e Expires)

secure_token_cache_scope

  • syntax: secure_token_cache_scope scope
  • default: public
  • context: http, server, location

Define o escopo de cache (público/privado) das respostas que não são tokenizadas

secure_token_token_cache_scope

  • syntax: secure_token_token_cache_scope scope
  • default: private
  • context: http, server, location

Define o escopo de cache (público/privado) das respostas que são 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

Define o valor do cabeçalho last-modified das respostas que não são tokenizadas. Uma string vazia mantém o valor de last-modified inalterado, enquanto a string "now" define o cabeçalho para o horário atual do servidor.

secure_token_token_last_modified

  • syntax: secure_token_token_last_modified time
  • default: now
  • context: http, server, location

Define o valor do cabeçalho last-modified das respostas que são tokenizadas (consulta / cookie) Uma string vazia mantém o valor de last-modified inalterado, enquanto a string "now" define o cabeçalho para o horário atual do servidor.

secure_token_content_type_m3u8

  • syntax: secure_token_content_type_m3u8 type
  • default: application/vnd.apple.mpegurl
  • context: http, server, location

Define o tipo de conteúdo que deve ser analisado como m3u8 para inserção de token

secure_token_content_type_mpd

  • syntax: secure_token_content_type_mpd type
  • default: application/dash+xml
  • context: http, server, location

Define o tipo de conteúdo que deve ser analisado como mpd para inserção de token

secure_token_content_type_f4m

  • syntax: secure_token_content_type_f4m type
  • default: video/f4m
  • context: http, server, location

Define o tipo de conteúdo que deve ser analisado como f4m para inserção de token

Parâmetros do token Akamai

secure_token_akamai

  • syntax: secure_token_akamai $variable { ... }
  • context: http

Cria uma nova variável cujo valor é um token Akamai, criado de acordo com os parâmetros especificados dentro do bloco.

O bloco suporta os seguintes parâmetros:

key

  • syntax: key key_hex
  • default: N/A (obrigatório)

Define a chave secreta.

param_name

  • syntax: param_name name
  • default: __hdnea__

Define o nome do parâmetro do token (seja o nome do cookie ou o parâmetro da string de consulta)

acl

  • syntax: acl acl
  • default: $secure_token_baseuri_comma

Define a parte assinada da URL (ACL). O valor do parâmetro pode conter variáveis.

start

  • syntax: start time
  • default: 0

Define o horário de início do token (veja Formato de tempo abaixo)

end

  • syntax: end time
  • default: 86400

Define o horário de término do token (veja Formato de tempo abaixo)

ip_address

  • syntax: ip_address address
  • default: none

Define o endereço IP que deve ser incorporado no token. O valor do parâmetro pode conter variáveis, por exemplo, $remote_addr.

Parâmetros do token CloudFront

secure_token_cloudfront

  • syntax: secure_token_cloudfront $variable { ... }
  • context: http

Cria uma nova variável cujo valor é um token CloudFront, criado de acordo com os parâmetros especificados dentro do bloco.

O bloco suporta os seguintes parâmetros:

private_key_file

  • syntax: private_key_file filename
  • default: N/A (obrigatório)

Define o nome do arquivo da chave privada (arquivo PEM)

key_pair_id

  • syntax: key_pair_id id
  • default: N/A (obrigatório)

Define o id do par de chaves

acl

  • syntax: acl acl
  • default: $secure_token_baseuri_comma

Define a parte assinada da URL (ACL). O valor do parâmetro pode conter variáveis.

end

  • syntax: end time
  • default: 86400

Define o horário de término do token (veja Formato de tempo abaixo)

ip_address

  • syntax: ip_address address
  • default: none

Define o endereço IP que deve ser incorporado no token. O valor do parâmetro pode conter variáveis, por exemplo, $remote_addr/32 pode ser usado para limitar o token ao IP específico do cliente.

Parâmetros do token Broadpeak

secure_token_broadpeak

  • syntax: secure_token_broadpeak $variable { ... }
  • context: http

Cria uma nova variável cujo valor é um token Broadpeak, criado de acordo com os parâmetros especificados dentro do bloco.

O bloco suporta os seguintes parâmetros:

key

  • syntax: key key
  • default: N/A (obrigatório)

Define a chave secreta. O valor do parâmetro pode conter variáveis.

param_name

  • syntax: param_name name
  • default: token

Define o nome do parâmetro do token (seja o nome do cookie ou o parâmetro da string de consulta)

acl

  • syntax: acl acl
  • default: $secure_token_baseuri_comma

Define a parte assinada da URL (ACL). O valor do parâmetro pode conter variáveis.

start

  • syntax: start time
  • default: 0

Define o horário de início do token (veja Formato de tempo abaixo)

end

  • syntax: end time
  • default: 86400

Define o horário de término do token (veja Formato de tempo abaixo)

session_start

  • syntax: session_start time
  • default: N/A

Define o horário de início da sessão, necessário para catchup. O valor do parâmetro pode conter variáveis.

session_end

  • syntax: session_end time
  • default: N/A

Define o horário de término da sessão, necessário para catchup. O valor do parâmetro pode conter variáveis.

additional_querylist

  • syntax: additional_querylist expr
  • default: N/A

Define o valor do token primário, o valor precisa ser uma lista de pares nome=valor sem qualquer separador. Por exemplo, "ip=${arg_ip}account=${arg_account}device=${arg_device}". O valor do parâmetro pode conter variáveis.

Parâmetros de criptografia de URI

secure_token_encrypt_uri

  • syntax: secure_token_encrypt_uri on/off
  • default: off
  • context: http, server, location

Habilita/desabilita a criptografia de URI

secure_token_encrypt_uri_key

  • syntax: secure_token_encrypt_uri_key key_hex
  • default: none
  • context: http, server, location

Define a chave de criptografia, a chave deve ter 256 bits (64 caracteres hexadecimais)

secure_token_encrypt_uri_iv

  • syntax: secure_token_encrypt_uri_iv iv_hex
  • default: none
  • context: http, server, location

Define o iv de criptografia, o iv deve ter 128 bits (32 caracteres hexadecimais)

secure_token_encrypt_uri_part

  • syntax: secure_token_encrypt_uri_part expression
  • default: none
  • context: http, server, location

Uma expressão que calcula a parte da URL que deve ser criptografada em locais de expressão regular. Para locais não regulares, a parte criptografada é tudo o que segue o caminho definido no bloco de localização.

Exemplo 1:

  location /secret_param/([^/]+)/some_other_param/.* {
    secure_token_encrypt_uri_part $1;
    ...
  }
Nesta configuração, apenas o valor de secret_param será criptografado/descriptografado.

Exemplo 2:

  location /base/ {
    ...
  }
Nesta configuração, tudo o que segue /base/ será criptografado/descriptografado.

secure_token_encrypt_uri_hash_size

  • syntax: secure_token_encrypt_uri_hash_size size
  • default: 8
  • context: http, server, location

O tamanho em bytes do hash usado para validar a URI após a descriptografia, o valor deve estar entre 0 e 16.

Formato de tempo

Alguns dos parâmetros de configuração mencionados acima suportam tanto timestamps absolutos, quanto timestamps relativos a now. Esses parâmetros podem ser definidos na configuração usando um dos seguintes formatos: * epoch - timestamp unix 0 (01/01/1970) * max - timestamp unix 2147483647 (18/01/2038) * @1481230000 - timestamp unix 1481230000 (8/12/2016) * 10d / +10d - now + 10 dias * -5m - now - 5 minutos

Configurações de exemplo

Empacotamento HLS com tokens 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: *';
        }

    }

Empacotamento HDS com tokens 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 criptografado com segurança do token na chave de criptografia

Esta configuração habilita a segurança do token enquanto tem URLs estáticas para os segmentos de vídeo, isso permite o cache dos segmentos de forma 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 configuração requer o módulo https://github.com/kaltura/nginx-akamai-token-validate-module além do nginx-secure-token-module.

Adicionando segurança de token em cima de um fluxo ao 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 configuração requer o módulo https://github.com/kaltura/nginx-akamai-token-validate-module além do nginx-secure-token-module.

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

Variáveis do Nginx

O módulo adiciona as seguintes variáveis do nginx: * $secure_token_baseuri - contém o valor da variável interna $uri truncada até a última barra (/). Por exemplo, se $uri é /a/b/c.htm então $secure_token_baseuri será /a/b/. * $secure_token_baseuri_comma - igual a $secure_token_baseuri, exceto que se este valor contém uma vírgula (,) o valor é truncado até a posição da vírgula. Por exemplo, se $uri é /a/b/c.htm então $secure_token_baseuri_comma será /a/b/; se $uri é /a/b,c/d.htm então $secure_token_baseuri_comma será /a/b. * $secure_token_original_uri - contém o URI original (criptografado) ao usar a criptografia de URI. Observe que a variável interna $uri contém o URI modificado (descriptografado) neste caso.

GitHub

Você pode encontrar dicas de configuração adicionais e documentação para este módulo no repositório do GitHub para nginx-module-secure-token.