Zum Inhalt

secure-token: Sicheres Token-Modul für NGINX

Installation

Sie können dieses Modul in jeder RHEL-basierten Distribution installieren, einschließlich, aber nicht beschränkt auf:

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

Aktivieren Sie das Modul, indem Sie Folgendes an den Anfang von /etc/nginx/nginx.conf hinzufügen:

load_module modules/ngx_http_secure_token_filter_module.so;

Dieses Dokument beschreibt nginx-module-secure-token v1.5 veröffentlicht am 27. Juni 2022.


Generiert CDN-Token, entweder als Cookie oder als Abfragezeichenfolgenparameter (nur m3u8, mpd, f4m). Unterstützt derzeit Akamai v2-Token und Amazon CloudFront-Token. Darüber hinaus unterstützt das Modul die Verschlüsselung von URIs mit einem konfigurierten Schlüssel.

Konfiguration

Generische Token-Parameter

secure_token

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

Setzt den Wert des Tokens, der im Manifest eingebettet oder als Cookie zurückgegeben werden soll. Der Parameterwert kann Variablen enthalten und verweist oft auf von diesem Modul gesetzte Variablen (unter Verwendung von secure_token_akamai / secure_token_cloudfront-Blöcken)

secure_token_avoid_cookies

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

Wenn aktiviert, bevorzugt das Modul die Verwendung eines Abfragezeichenfolgen-Tokens anstelle eines Cookie-Tokens. Ein Abfragezeichenfolgen-Token wird derzeit nur für die folgenden MIME-Typen unterstützt (andere MIME-Typen geben ein Cookie-Token zurück): * application/vnd.apple.mpegurl * application/dash+xml * video/f4m

secure_token_types

  • syntax: secure_token_types mime_type ...
  • default: none
  • context: http, server, location

Definiert eine Menge von MIME-Typen, die ein Token zurückgeben sollen.

secure_token_uri_filename_prefix

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

Definiert eine Menge von Präfixen, die mit dem URI-Dateinamen abgeglichen werden. Nur URIs, deren Dateiname mit einem der definierten Präfixe beginnt, geben ein Token zurück.

secure_token_expires_time

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

Setzt die Ablaufzeit von Antworten, die nicht tokenisiert sind (bestimmt die Werte der Cache-Control- und Expires-HTTP-Header)

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

Setzt die Ablaufzeit von Antworten, die mit einem Cookie-Token tokenisiert sind (bestimmt die Werte der Cache-Control- und Expires-HTTP-Header)

secure_token_query_token_expires_time

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

Setzt die Ablaufzeit von Antworten, die mit einem Abfragezeichenfolgen-Token tokenisiert sind (bestimmt die Werte der Cache-Control- und Expires-HTTP-Header)

secure_token_cache_scope

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

Setzt den Cache-Bereich (öffentlich/privat) von Antworten, die nicht tokenisiert sind.

secure_token_token_cache_scope

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

Setzt den Cache-Bereich (öffentlich/privat) von Antworten, die tokenisiert sind (Abfrage / Cookie).

secure_token_last_modified

  • syntax: secure_token_last_modified time
  • default: Sun, 19 Nov 2000 08:52:00 GMT
  • context: http, server, location

Setzt den Wert des Last-Modified-Headers von Antworten, die nicht tokenisiert sind. Ein leerer String lässt den Wert von Last-Modified unverändert, während der String "now" den Header auf die aktuelle Zeit des Servers setzt.

secure_token_token_last_modified

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

Setzt den Wert des Last-Modified-Headers von Antworten, die tokenisiert sind (Abfrage / Cookie). Ein leerer String lässt den Wert von Last-Modified unverändert, während der String "now" den Header auf die aktuelle Zeit des Servers setzt.

secure_token_content_type_m3u8

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

Setzt den Inhaltstyp, der als m3u8 für die Token-Einfügung geparst werden soll.

secure_token_content_type_mpd

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

Setzt den Inhaltstyp, der als mpd für die Token-Einfügung geparst werden soll.

secure_token_content_type_f4m

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

Setzt den Inhaltstyp, der als f4m für die Token-Einfügung geparst werden soll.

Akamai-Token-Parameter

secure_token_akamai

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

Erstellt eine neue Variable, deren Wert ein Akamai-Token ist, das gemäß den innerhalb des Blocks angegebenen Parametern erstellt wird.

Der Block unterstützt die folgenden Parameter:

key

  • syntax: key key_hex
  • default: N/A (mandatory)

Setzt den geheimen Schlüssel.

param_name

  • syntax: param_name name
  • default: __hdnea__

Setzt den Namen des Token-Parameters (entweder den Namen des Cookies oder den Abfragezeichenfolgenparameter).

acl

  • syntax: acl acl
  • default: $secure_token_baseuri_comma

Setzt den signierten Teil der URL (ACL). Der Parameterwert kann Variablen enthalten.

start

  • syntax: start time
  • default: 0

Setzt die Startzeit des Tokens (siehe Zeitformat unten).

end

  • syntax: end time
  • default: 86400

Setzt die Endzeit des Tokens (siehe Zeitformat unten).

ip_address

  • syntax: ip_address address
  • default: none

Setzt die IP-Adresse, die im Token eingebettet werden soll. Der Parameterwert kann Variablen enthalten, z.B. $remote_addr.

CloudFront-Token-Parameter

secure_token_cloudfront

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

Erstellt eine neue Variable, deren Wert ein CloudFront-Token ist, das gemäß den innerhalb des Blocks angegebenen Parametern erstellt wird.

Der Block unterstützt die folgenden Parameter:

private_key_file

  • syntax: private_key_file filename
  • default: N/A (mandatory)

Setzt den Dateinamen des privaten Schlüssels (PEM-Datei).

key_pair_id

  • syntax: key_pair_id id
  • default: N/A (mandatory)

Setzt die ID des Schlüsselpaares.

acl

  • syntax: acl acl
  • default: $secure_token_baseuri_comma

Setzt den signierten Teil der URL (ACL). Der Parameterwert kann Variablen enthalten.

end

  • syntax: end time
  • default: 86400

Setzt die Endzeit des Tokens (siehe Zeitformat unten).

ip_address

  • syntax: ip_address address
  • default: none

Setzt die IP-Adresse, die im Token eingebettet werden soll. Der Parameterwert kann Variablen enthalten, z.B. $remote_addr/32 kann verwendet werden, um das Token auf die spezifische IP des Clients zu beschränken.

Broadpeak-Token-Parameter

secure_token_broadpeak

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

Erstellt eine neue Variable, deren Wert ein Broadpeak-Token ist, das gemäß den innerhalb des Blocks angegebenen Parametern erstellt wird.

Der Block unterstützt die folgenden Parameter:

key

  • syntax: key key
  • default: N/A (mandatory)

Setzt den geheimen Schlüssel. Der Parameterwert kann Variablen enthalten.

param_name

  • syntax: param_name name
  • default: token

Setzt den Namen des Token-Parameters (entweder den Namen des Cookies oder den Abfragezeichenfolgenparameter).

acl

  • syntax: acl acl
  • default: $secure_token_baseuri_comma

Setzt den signierten Teil der URL (ACL). Der Parameterwert kann Variablen enthalten.

start

  • syntax: start time
  • default: 0

Setzt die Startzeit des Tokens (siehe Zeitformat unten).

end

  • syntax: end time
  • default: 86400

Setzt die Endzeit des Tokens (siehe Zeitformat unten).

session_start

  • syntax: session_start time
  • default: N/A

Setzt die Startzeit der Sitzung, die für das Catchup erforderlich ist. Der Parameterwert kann Variablen enthalten.

session_end

  • syntax: session_end time
  • default: N/A

Setzt die Endzeit der Sitzung, die für das Catchup erforderlich ist. Der Parameterwert kann Variablen enthalten.

additional_querylist

  • syntax: additional_querylist expr
  • default: N/A

Setzt den primären Tokenwert, der eine Liste von name=value-Paaren ohne Trennzeichen sein muss. Zum Beispiel: "ip=${arg_ip}account=${arg_account}device=${arg_device}". Der Parameterwert kann Variablen enthalten.

URI-Verschlüsselungsparameter

secure_token_encrypt_uri

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

Aktiviert/deaktiviert die URI-Verschlüsselung.

secure_token_encrypt_uri_key

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

Setzt den Verschlüsselungsschlüssel, der 256 Bit (64 hexadezimale Zeichen) lang sein muss.

secure_token_encrypt_uri_iv

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

Setzt den Verschlüsselungs-IV, der 128 Bit (32 hexadezimale Zeichen) lang sein muss.

secure_token_encrypt_uri_part

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

Ein Ausdruck, der den Teil der URL berechnet, der in regulären Ausdrucksstandorten verschlüsselt werden soll. Für nicht-reguläre Ausdrucksstandorte ist der verschlüsselte Teil alles, was dem im Standortblock definierten Pfad folgt.

Beispiel 1:

  location /secret_param/([^/]+)/some_other_param/.* {
    secure_token_encrypt_uri_part $1;
    ...
  }
In dieser Konfiguration wird nur der Wert von secret_param verschlüsselt/deverschlüsselt.

Beispiel 2:

  location /base/ {
    ...
  }
In dieser Konfiguration wird alles, was nach /base/ folgt, verschlüsselt/deverschlüsselt.

secure_token_encrypt_uri_hash_size

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

Die Größe in Bytes des Hashs, der zur Validierung der URI nach der Entschlüsselung verwendet wird. Der Wert muss zwischen 0 und 16 liegen.

Zeitformat

Einige der oben genannten Konfigurationsparameter unterstützen sowohl absolute Zeitstempel als auch Zeitstempel, die relativ zu now sind. Diese Parameter können in der Konfiguration mit einem der folgenden Formate gesetzt werden: * epoch - Unix-Zeitstempel 0 (01/01/1970) * max - Unix-Zeitstempel 2147483647 (18/01/2038) * @1481230000 - Unix-Zeitstempel 1481230000 (8/12/2016) * 10d / +10d - now + 10 Tage * -5m - now - 5 Minuten

Beispielkonfigurationen

HLS-Paketierung mit Akamai-Token

    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: *';
        }

    }

HDS-Paketierung mit CloudFront-Token

    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: *';
        }

    }

Verschlüsseltes HLS mit Token-Sicherheit auf dem Verschlüsselungsschlüssel

Diese Konfiguration aktiviert die Token-Sicherheit, während sie statische URLs für die Video-Segmente hat, dies ermöglicht das transparente Caching der Segmente durch Proxys.

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

    }
Hinweis: Diese Konfiguration erfordert das Modul https://github.com/kaltura/nginx-akamai-token-validate-module neben dem nginx-secure-token-module.

Hinzufügen von Token-Sicherheit zu einem bestehenden HDS/HLS-Livestream

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

    }
Hinweis: Diese Konfiguration erfordert das Modul https://github.com/kaltura/nginx-akamai-token-validate-module neben dem nginx-secure-token-module.

URI-Verschlüsselung

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

Nginx-Variablen

Das Modul fügt die folgenden NGINX-Variablen hinzu: * $secure_token_baseuri - enthält den Wert der eingebauten Variable $uri, die bis zum letzten Schrägstrich (/) abgeschnitten ist. Zum Beispiel, wenn $uri /a/b/c.htm ist, dann wird $secure_token_baseuri /a/b/ sein. * $secure_token_baseuri_comma - dasselbe wie $secure_token_baseuri, außer dass, wenn dieser Wert ein Komma (,) enthält, wird der Wert bis zur Position des Kommas abgeschnitten. Zum Beispiel, wenn $uri /a/b/c.htm ist, dann wird $secure_token_baseuri_comma /a/b/ sein; wenn $uri /a/b,c/d.htm ist, dann wird $secure_token_baseuri_comma /a/b sein. * $secure_token_original_uri - enthält die ursprüngliche (verschlüsselte) URI, wenn die URI-Verschlüsselung verwendet wird. Beachten Sie, dass die eingebaute Variable $uri in diesem Fall die modifizierte (entschlüsselte) URI enthält.

GitHub

Sie finden möglicherweise zusätzliche Konfigurationstipps und Dokumentationen für dieses Modul im GitHub Repository für nginx-module-secure-token.