Aller au contenu

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)

  • 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;
    ...
  }
Dans cette configuration, seule la valeur de secret_param sera chiffrée/déchiffrée.

Exemple 2 :

  location /base/ {
    ...
  }
Dans cette configuration, tout ce qui suit /base/ sera chiffré/déchiffré.

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

    }
Remarque : cette configuration nécessite le module https://github.com/kaltura/nginx-akamai-token-validate-module en plus du module nginx-secure-token-module

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

    }
Remarque : cette configuration nécessite le module https://github.com/kaltura/nginx-akamai-token-validate-module en plus du module nginx-secure-token-module

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.