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.
testcookie_refresh_encrypt_cookie
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.
testcookie_refresh_encrypt_cookie_key
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.