Zum Inhalt

testcookie: NGINX testcookie Robot-Minderungsmodul

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-testcookie
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-testcookie

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

load_module modules/ngx_http_testcookie_access_module.so;

Dieses Dokument beschreibt nginx-module-testcookie v1.28 veröffentlicht am 19. Juli 2022.


testcookie-nginx-module ist ein einfaches Robot-Minderungsmodul, das auf cookie-basierten Challenge/Response-Mechanismen basiert.

Challenge-Cookies können mit verschiedenen Methoden gesetzt werden:

  • "Set-Cookie" + 302/307 HTTP Location-Redirect
  • "Set-Cookie" + HTML-Meta-Refresh-Redirect
  • Benutzerdefinierte Vorlage, JavaScript kann hier verwendet werden.

Um automatisches Parsen zu verhindern, kann der Wert des Challenge-Cookies mit AES-128 im CBC-Modus unter Verwendung eines benutzerdefinierten/zufälligen Schlüssels und IV verschlüsselt und dann auf der Client-Seite mit JavaScript entschlüsselt werden.

Direktiven

testcookie

syntax: testcookie (on|off|var);

default: off

context: http, server, location, if

on - Modul aktivieren

off - Modul deaktivieren

var - Anfragen nicht abfangen, nur Modulvariablen setzen.

testcookie_name

syntax: testcookie_name <string>

default: TCK

context: http, server, location

Setzt den Cookie-Namen.

testcookie_domain

syntax: testcookie_domain <string>

default: none, vom Browser gesetzt

context: http, server, location

Setzt die Cookie-Domain.

testcookie_expires

syntax: testcookie_expires <string>

default: 31 Dec 2037 23:55:55 GMT

context: http, server, location

Setzt den Ablaufwert des Cookies.

testcookie_path

syntax: testcookie_path <string>

default: /

context: http, server, location

Setzt den Cookie-Pfad, nützlich, wenn Sie verschiedene Schlüssel für Standorte verwenden möchten.

testcookie_samesite

syntax: testcookie_samesite <string>

default: None

context: http, server, location

Setzt das Cookie-Attribut, mit dem Sie erklären können, ob Ihr Cookie auf einen First-Party- oder Same-Site-Kontext beschränkt sein soll. Standard ist None (Cookies werden in allen Kontexten gesendet, d.h. das Senden von Cross-Origin ist erlaubt.) Akzeptiert Werte: Lax, Strict, None.

testcookie_secret

syntax: testcookie_secret <string>

default: erforderliche Konfigurationsdirektive

context: http, server, location

Geheime Zeichenfolge, die in der Berechnung des Challenge-Cookies verwendet wird, sollte 32 Bytes oder mehr betragen, besser lang, aber statisch, um einen Cookie-Reset für legitime Benutzer bei jedem Serverneustart zu verhindern. Wenn auf "random" gesetzt - wird bei jedem Serverneustart ein neuer Schlüssel generiert, nicht empfohlen (alle Cookies mit dem vorherigen Schlüssel werden ungültig).

testcookie_session

syntax: testcookie_session <variable>

default: erforderliche Konfigurationsdirektive

context: http, server, location

Setzt die Eingabe der Challenge-Generierungsfunktion, * $remote_addr - IP-Adresse des Clients wird als eindeutiger Benutzeridentifikator verwendet * $remote_addr$http_user_agent - IP des Clients + User-Agent

testcookie_arg

syntax: testcookie_arg <string>

default: none

context: http, server, location

Setzt den Namen des GET-Parameters, der für die Berechnung der Cookie-Setzversuche verwendet wird,

Wenn nicht gesetzt - versucht der Server, das Cookie unendlich oft zu setzen.

testcookie_max_attempts

syntax: testcookie_max_attempts <integer>

default: 5

context: http, server, location

Setzt die maximale Anzahl von Weiterleitungen, bevor der Benutzer zur Fallback-URL gesendet wird, gemäß RFC1945 kann dies nicht mehr als 5 sein.

Wenn auf 0 gesetzt - versucht der Server, das Cookie unendlich oft zu setzen (tatsächlich zeigt der Browser die Fehlerseite an).

testcookie_p3p

syntax: testcookie_p3p <string>

default: none

context: http, server, location

Setzt die P3P-Richtlinie.

testcookie_fallback

syntax: testcookie_fallback <script>

default: none

context: http, server, location

Setzt die Fallback-URL, zu der der Benutzer weitergeleitet wird, nachdem die maximale Anzahl von Versuchen, die durch die Direktive testcookie_max_attempts überschritten wird. Nginx-Skriptvariablen können hier verwendet werden. Wenn nicht gesetzt - erhält der Client 403, nachdem die maximalen Versuche erreicht wurden.

testcookie_whitelist

syntax: testcookie_whitelist <network list>

default: none

context: http, server

Setzt die Netzwerke, für die der Test nicht verwendet wird, fügen Sie hier Suchmaschinen-Netzwerke hinzu. Derzeit nur IPv4 CIDR.

testcookie_pass

syntax: testcookie_pass $variable;

default: none

context: http, server

Setzt den Variablennamen, um zu testen, ob die Cookie-Prüfung umgangen werden soll. Wenn der Variablenwert während der Anfrage auf 1 gesetzt wird - wird die Cookie-Prüfung nicht durchgeführt. Kann für komplexere Whitelisting verwendet werden.

testcookie_redirect_via_refresh

syntax: testcookie_redirect_via_refresh (on|off);

default: off

context: http, server, location

Setzt das Cookie und leitet mit einem HTTP-Meta-Refresh weiter, erforderlich, wenn testcookie_refresh_template verwendet wird.

testcookie_refresh_template

syntax: testcookie_refresh_template <string>

default: none

context: http, server, location

Verwendet benutzerdefiniertes HTML anstelle eines einfachen HTTP-Meta-Refresh, Sie müssen das Cookie manuell aus der Vorlage setzen. Alle Nginx-Variablen sind verfügbar und

$testcookie_nexturl - URL, zu der der Client weitergeleitet werden soll, wenn die max_attempts überschritten werden, wird hier der Wert von *testcookie_fallback* sein
$testcookie_got - Cookie-Wert, der vom Client empfangen wurde, leer, wenn kein Cookie vorhanden ist oder es nicht dem Format entspricht
$testcookie_set - korrekter Cookie-Wert, den wir vom Client erwarten
$testcookie_ok - Benutzer hat den Test bestanden (1 - bestanden, 0 - nicht bestanden) Hinweis: geändert von "yes"/"no" in v1.10

Außerdem, wenn testcookie_refresh_encrypt_cookie aktiviert ist, gibt es drei weitere Variablen:

$testcookie_enc_key - Verschlüsselungsschlüssel (32 hex Ziffern)
$testcookie_enc_iv - Verschlüsselungs-IV (32 hex Ziffern)
$testcookie_enc_sec - verschlüsselter Cookie-Wert (32 hex Ziffern)

testcookie_refresh_status

syntax: testcookie_refresh_status <code>

default: 200

context: http, server, location

Verwendet benutzerdefinierten HTTP-Statuscode beim Bereitstellen von HTML.

testcookie_deny_keepalive

syntax: testcookie_deny_keepalive (on|off);

default: off

context: http, server, location

Schließt die Verbindung sofort nach dem Setzen des Cookies, kein Grund, Verbindungen mit Bots aufrechtzuerhalten.

testcookie_get_only

syntax: testcookie_get_only (on|off);

default: off

context: http, server, location

Verarbeitet nur GET-Anfragen, POST-Anfragen werden umgangen.

testcookie_https_location

syntax: testcookie_https_location (on|off);

default: off

context: http, server, location

Leitet den Client nach dem Setzen des Cookies auf das HTTPS-Protokoll um, wirkt sich auch auf $testcookie_nexturl aus, nützlich mit 3rd Party SSL Offload.

syntax: testcookie_refresh_encrypt_cookie (on|off);

default: off

context: http, server, location

Verschlüsselt die Cookie-Variable, verwendet mit testcookie_refresh_template, um die clientseitige Entschlüsselung mit AES-128 CBC zu erzwingen.

syntax: testcookie_refresh_encrypt_cookie_key <32 hex digits|random>

default: erforderliche Direktive, wenn Verschlüsselung aktiviert ist

context: http, server, location

Setzt den Verschlüsselungsschlüssel.

Mögliche Werte:

random - neuer Schlüssel wird bei jedem NGINX-Neustart generiert
32 hex Ziffern - statischer Schlüssel, nützlich, wenn Sie planen, ihn tief im clientseitigen JavaScript zu obfusizieren.

testcookie_refresh_encrypt_iv

syntax: testcookie_refresh_encrypt_iv <32 hex digits|random|random2>

default: random

context: http, server, location

Setzt den Verschlüsselungs-IV.

Mögliche Werte: random - neuer IV wird für jede Client-Anfrage generiert random2 - neuer IV wird bei jedem NGINX-Neustart generiert 32 hex Ziffern - statischer IV, nützlich, wenn Sie planen, ihn tief im clientseitigen JavaScript zu obfusizieren

testcookie_internal

syntax: testcookie_internal (on|off);

default: off

context: http, server, location

Aktiviert die testcookie-Prüfung für interne Weiterleitungen (standardmäßig zur Optimierung deaktiviert!), nützlich für diese Art von Konfigurationen:

rewrite ^/(.*)$ /index.php?$1 last;

testcookie_httponly_flag

syntax: testcookie_httponly_flag (on|off);

default: off

context: http, server, location

Aktiviert das HttpOnly-Flag für das Cookie.

testcookie_secure_flag

syntax: testcookie_secure_flag (on|off|$variable);

default: on

context: http, server, location

Aktiviert das Secure-Flag für das Cookie. Jeder Variablenwert außer "on" wird als falsch interpretiert.

testcookie_port_in_redirect

syntax: testcookie_port_in_redirect (on|off);

default: off

context: http, server, location

Exponiert den Port in der Umleitung.

Beispielkonfiguration

http {
    #Standardkonfiguration, Modul deaktiviert
    testcookie off;

    #Setzen des Cookie-Namens
    testcookie_name BPC;

    #Setzen des Geheimnisses
    testcookie_secret keepmesecret;

    #Setzen des Sitzungsschlüssels
    testcookie_session $remote_addr;

    #Setzen des Argumentnamens
    testcookie_arg ckattempt;

    #Setzen der maximalen Anzahl von Cookie-Setzversuchen
    testcookie_max_attempts 3;

    #Setzen der P3P-Richtlinie
    testcookie_p3p 'CP="CUR ADM OUR NOR STA NID", policyref="/w3c/p3p.xml"';

    #Setzen der Fallback-URL
    testcookie_fallback http://google.com/cookies.html?backurl=http://$host$request_uri;

    #Konfigurieren der Whitelist
    testcookie_whitelist {
        8.8.8.8/32;
    }

    #Setzen der Umleitung über HTML-Code
    testcookie_redirect_via_refresh on;

    #Aktivieren der Verschlüsselung
    testcookie_refresh_encrypt_cookie on;

    #Setzen des Verschlüsselungsschlüssels
    testcookie_refresh_encrypt_cookie_key deadbeefdeadbeefdeadbeefdeadbeef;

    #Setzen des Verschlüsselungs-IV
    testcookie_refresh_encrypt_cookie_iv deadbeefdeadbeefdeadbeefdeadbeef;

    #Setzen der Antwortvorlage
    testcookie_refresh_template '<html><body>setting cookie...<script type=\"text/javascript\" src=\"/aes.min.js\" ></script><script>function toNumbers(d){var e=[];d.replace(/(..)/g,function(d){e.push(parseInt(d,16))});return e}function toHex(){for(var d=[],d=1==arguments.length&&arguments[0].constructor==Array?arguments[0]:arguments,e="",f=0;f<d.length;f++)e+=(16>d[f]?"0":"")+d[f].toString(16);return e.toLowerCase()}var a=toNumbers("$testcookie_enc_key"),b=toNumbers("$testcookie_enc_iv"),c=toNumbers("$testcookie_enc_set");document.cookie="BPC="+toHex(slowAES.decrypt(c,2,a,b))+"; expires=Thu, 31-Dec-37 23:55:55 GMT; path=/";location.href="$testcookie_nexturl";</script></body></html>';

    server {
        listen 80;
        server_name test.com;

        location = /aes.min.js {
            gzip  on;
            gzip_min_length 1000;
            gzip_types      text/plain;
            root /var/www/public_html;
        }

        location = /w3c/p3p.xml {
            root /var/www/public_html;
        }

        location / {
            #Modul für spezifischen Standort aktivieren
            testcookie on;
            proxy_set_header   Host             $host;
            proxy_set_header   X-Real-IP        $remote_addr;
            proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
            proxy_pass http://127.0.0.1:80;
        }
    }
}

Siehe weitere Fälle im "docs"-Verzeichnis des Projekts.

Test-Suite

Dieses Modul wird mit einer Perl-gesteuerten Test-Suite geliefert. Dank des Test::Nginx Moduls in der Perl-Welt.

Quellen

Verfügbar auf GitHub unter kyprizel/testcookie-nginx-module.

GitHub

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