secure-token: Module de jeton sécurisé pour NGINX
Installation
Vous pouvez installer ce module dans toute distribution basée sur RHEL, y compris, mais sans s'y limiter :
- RedHat Enterprise Linux 7, 8, 9 et 10
- CentOS 7, 8, 9
- AlmaLinux 8, 9
- Rocky Linux 8, 9
- Amazon Linux 2 et 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
Activez le module en ajoutant ce qui suit en haut de /etc/nginx/nginx.conf :
load_module modules/ngx_http_secure_token_filter_module.so;
Ce document décrit nginx-module-secure-token v1.5 publié le 27 juin 2022.
Génère des jetons CDN, soit sous forme de cookie, soit comme paramètre de chaîne de requête (m3u8, mpd, f4m uniquement). Prend actuellement en charge les jetons Akamai v2 et les jetons Amazon CloudFront. De plus, le module prend en charge le chiffrement des URI avec une clé configurée.
Configuration
Paramètres de jeton génériques
secure_token
- syntax:
secure_token value - default:
none - context:
http,server,location
Définit la valeur du jeton qui doit être intégrée dans le manifeste/renvoyée sous forme de cookie.
La valeur du paramètre peut contenir des variables et pointe souvent vers des variables définies par ce module
(en utilisant les blocs secure_token_akamai / secure_token_cloudfront)
secure_token_avoid_cookies
- syntax:
secure_token_avoid_cookies on/off - default:
on - context:
http,server,location
Lorsqu'il est activé, le module préfère utiliser un jeton de chaîne de requête au lieu d'un jeton de cookie. Un jeton de chaîne de requête est actuellement pris en charge uniquement pour les types MIME suivants (d'autres types MIME renvoient un jeton 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
Définit un ensemble de types MIME qui doivent renvoyer un jeton
secure_token_uri_filename_prefix
- syntax:
secure_token_uri_filename_prefix prefix - default:
none - context:
http,server,location
Définit un ensemble de préfixes qui seront comparés au nom de fichier URI, seules les URI dont le nom de fichier commence par l'un des préfixes définis renverront un jeton
secure_token_expires_time
- syntax:
secure_token_expires_time time - default:
none - context:
http,server,location
Définit le temps d'expiration des réponses qui ne sont pas tokenisées (détermine les valeurs des en-têtes HTTP Cache-Control et Expires)
secure_token_cookie_token_expires_time
- syntax:
secure_token_cookie_token_expires_time time - default:
none - context:
http,server,location
Définit le temps d'expiration des réponses qui sont tokenisées avec un jeton de cookie (détermine les valeurs des en-têtes HTTP Cache-Control et Expires)
secure_token_query_token_expires_time
- syntax:
secure_token_query_token_expires_time time - default:
none - context:
http,server,location
Définit le temps d'expiration des réponses qui sont tokenisées avec un jeton de chaîne de requête (détermine les valeurs des en-têtes HTTP Cache-Control et Expires)
secure_token_cache_scope
- syntax:
secure_token_cache_scope scope - default:
public - context:
http,server,location
Définit la portée du cache (public/privé) des réponses qui ne sont pas tokenisées
secure_token_token_cache_scope
- syntax:
secure_token_token_cache_scope scope - default:
private - context:
http,server,location
Définit la portée du cache (public/privé) des réponses qui sont tokenisées (requête / cookie)
secure_token_last_modified
- syntax:
secure_token_last_modified time - default:
Sun, 19 Nov 2000 08:52:00 GMT - context:
http,server,location
Définit la valeur de l'en-tête last-modified des réponses qui ne sont pas tokenisées. Une chaîne vide laisse la valeur de last-modified inchangée, tandis que la chaîne "now" définit l'en-tête à l'heure actuelle du serveur.
secure_token_token_last_modified
- syntax:
secure_token_token_last_modified time - default:
now - context:
http,server,location
Définit la valeur de l'en-tête last-modified des réponses qui sont tokenisées (requête / cookie) Une chaîne vide laisse la valeur de last-modified inchangée, tandis que la chaîne "now" définit l'en-tête à l'heure actuelle du serveur.
secure_token_content_type_m3u8
- syntax:
secure_token_content_type_m3u8 type - default:
application/vnd.apple.mpegurl - context:
http,server,location
Définit le type de contenu qui doit être analysé comme m3u8 pour l'insertion du jeton
secure_token_content_type_mpd
- syntax:
secure_token_content_type_mpd type - default:
application/dash+xml - context:
http,server,location
Définit le type de contenu qui doit être analysé comme mpd pour l'insertion du jeton
secure_token_content_type_f4m
- syntax:
secure_token_content_type_f4m type - default:
video/f4m - context:
http,server,location
Définit le type de contenu qui doit être analysé comme f4m pour l'insertion du jeton
Paramètres de jeton Akamai
secure_token_akamai
- syntax:
secure_token_akamai $variable { ... } - context:
http
Crée une nouvelle variable dont la valeur est un jeton Akamai, créé selon les paramètres spécifiés dans le bloc.
Le bloc prend en charge les paramètres suivants :
key
- syntax:
key key_hex - default:
N/A (mandatory)
Définit la clé secrète.
param_name
- syntax:
param_name name - default:
__hdnea__
Définit le nom du paramètre de jeton (soit le nom du cookie, soit le paramètre de chaîne de requête)
acl
- syntax:
acl acl - default:
$secure_token_baseuri_comma
Définit la partie signée de l'URL (ACL). La valeur du paramètre peut contenir des variables.
start
- syntax:
start time - default:
0
Définit le temps de début du jeton (voir Format de temps ci-dessous)
end
- syntax:
end time - default:
86400
Définit le temps de fin du jeton (voir Format de temps ci-dessous)
ip_address
- syntax:
ip_address address - default:
none
Définit l'adresse IP qui doit être intégrée dans le jeton. La valeur du paramètre peut contenir des variables, par exemple $remote_addr.
Paramètres de jeton CloudFront
secure_token_cloudfront
- syntax:
secure_token_cloudfront $variable { ... } - context:
http
Crée une nouvelle variable dont la valeur est un jeton CloudFront, créé selon les paramètres spécifiés dans le bloc.
Le bloc prend en charge les paramètres suivants :
private_key_file
- syntax:
private_key_file filename - default:
N/A (mandatory)
Définit le nom de fichier de la clé privée (fichier PEM)
key_pair_id
- syntax:
key_pair_id id - default:
N/A (mandatory)
Définit l'identifiant de la paire de clés
acl
- syntax:
acl acl - default:
$secure_token_baseuri_comma
Définit la partie signée de l'URL (ACL). La valeur du paramètre peut contenir des variables.
end
- syntax:
end time - default:
86400
Définit le temps de fin du jeton (voir Format de temps ci-dessous)
ip_address
- syntax:
ip_address address - default:
none
Définit l'adresse IP qui doit être intégrée dans le jeton. La valeur du paramètre peut contenir des variables, par exemple $remote_addr/32 peut être utilisé pour limiter le jeton à l'IP spécifique du client.
Paramètres de jeton Broadpeak
secure_token_broadpeak
- syntax:
secure_token_broadpeak $variable { ... } - context:
http
Crée une nouvelle variable dont la valeur est un jeton Broadpeak, créé selon les paramètres spécifiés dans le bloc.
Le bloc prend en charge les paramètres suivants :
key
- syntax:
key key - default:
N/A (mandatory)
Définit la clé secrète. La valeur du paramètre peut contenir des variables.
param_name
- syntax:
param_name name - default:
token
Définit le nom du paramètre de jeton (soit le nom du cookie, soit le paramètre de chaîne de requête)
acl
- syntax:
acl acl - default:
$secure_token_baseuri_comma
Définit la partie signée de l'URL (ACL). La valeur du paramètre peut contenir des variables.
start
- syntax:
start time - default:
0
Définit le temps de début du jeton (voir Format de temps ci-dessous)
end
- syntax:
end time - default:
86400
Définit le temps de fin du jeton (voir Format de temps ci-dessous)
session_start
- syntax:
session_start time - default:
N/A
Définit le temps de début de la session, requis pour le rattrapage. La valeur du paramètre peut contenir des variables.
session_end
- syntax:
session_end time - default:
N/A
Définit le temps de fin de la session, requis pour le rattrapage. La valeur du paramètre peut contenir des variables.
additional_querylist
- syntax:
additional_querylist expr - default:
N/A
Définit la valeur du jeton principal, la valeur doit être une liste de paires nom=valeur sans séparateur. Par exemple, "ip=${arg_ip}account=${arg_account}device=${arg_device}". La valeur du paramètre peut contenir des variables.
Paramètres de chiffrement URI
secure_token_encrypt_uri
- syntax:
secure_token_encrypt_uri on/off - default:
off - context:
http,server,location
Active/désactive le chiffrement URI
secure_token_encrypt_uri_key
- syntax:
secure_token_encrypt_uri_key key_hex - default:
none - context:
http,server,location
Définit la clé de chiffrement, la clé doit faire 256 bits (64 caractères hexadécimaux)
secure_token_encrypt_uri_iv
- syntax:
secure_token_encrypt_uri_iv iv_hex - default:
none - context:
http,server,location
Définit l'IV de chiffrement, l'IV doit faire 128 bits (32 caractères hexadécimaux)
secure_token_encrypt_uri_part
- syntax:
secure_token_encrypt_uri_part expression - default:
none - context:
http,server,location
Une expression qui calcule la partie de l'URL qui doit être chiffrée dans des emplacements d'expressions régulières. Pour les emplacements non-expressions régulières, la partie chiffrée est tout ce qui suit le chemin défini dans le bloc de localisation.
Exemple 1 :
location /secret_param/([^/]+)/some_other_param/.* {
secure_token_encrypt_uri_part $1;
...
}
Exemple 2 :
location /base/ {
...
}
secure_token_encrypt_uri_hash_size
- syntax:
secure_token_encrypt_uri_hash_size size - default:
8 - context:
http,server,location
La taille en octets du hachage utilisé pour valider l'URI après déchiffrement, la valeur doit être comprise entre 0 et 16.
Format de temps
Certains des paramètres de configuration mentionnés ci-dessus prennent en charge à la fois des horodatages absolus
et des horodatages relatifs à now.
Ces paramètres peuvent être définis dans la configuration en utilisant l'un des formats suivants :
* epoch - horodatage unix 0 (01/01/1970)
* max - horodatage unix 2147483647 (18/01/2038)
* @1481230000 - horodatage unix 1481230000 (8/12/2016)
* 10d / +10d - now + 10 jours
* -5m - now - 5 minutes
Exemples de configurations
Emballage HLS avec des jetons 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: *';
}
}
Emballage HDS avec des jetons 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 chiffré avec sécurité du jeton sur la clé de chiffrement
Cette configuration active la sécurité du jeton tout en ayant des URL statiques pour les segments vidéo, ce qui permet le cache des segments de manière transparente par les 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;
}
}
Ajout de la sécurité du jeton sur un flux HDS/HLS en direct existant
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__;
}
}
Chiffrement 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 Nginx
Le module ajoute les variables nginx suivantes :
* $secure_token_baseuri - contient la valeur de la variable intégrée $uri tronquée jusqu'au dernier slash (/).
Pour exemple, si $uri est /a/b/c.htm alors $secure_token_baseuri sera /a/b/.
* $secure_token_baseuri_comma - identique à $secure_token_baseuri, sauf que si cette valeur contient une virgule (,)
la valeur est tronquée jusqu'à la position de la virgule.
Pour exemple, si $uri est /a/b/c.htm alors $secure_token_baseuri_comma sera /a/b/;
si $uri est /a/b,c/d.htm alors $secure_token_baseuri_comma sera /a/b.
* $secure_token_original_uri - contient l'URI d'origine (chiffrée) lors de l'utilisation du chiffrement URI.
Notez que la variable intégrée $uri contient l'URI modifiée (déchiffrée) dans ce cas.
GitHub
Vous pouvez trouver des conseils de configuration supplémentaires et de la documentation pour ce module dans le dépôt GitHub pour nginx-module-secure-token.