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)
secure_token_cookie_token_expires_time
- 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;
...
}
Exemplo 2:
location /base/ {
...
}
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;
}
}
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__;
}
}
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.