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