Einen Server abriegeln und eine WAF vor Ihre Anwendung schalten
Ab der ersten Bereitstellung lässt
erpc worker SSH nur von Ihrer Adresse zu und verwirft jede andere eingehende Verbindung. Eine [waf]-Tabelle stellt einen filternden Proxy vor Ihre API.Diese Seite beschreibt ERPC CLI
v0.1.0-rc.4, eine Vorabversion.Die Firewall
Eine Bereitstellung richtet die Firewall des Servers ein, bevor die Anwendung zum ersten Mal startet:
- SSH nur von
firewall.ssh_allowund von der Adresse, von der die Bereitstellung kommt; - jede andere eingehende Verbindung wird verworfen, außer
run.portvonfirewall.app_allow; bei einer Anwendung hinter einer WAF tritt der Port der WAF an dessen Stelle, und das nur dort, wo die WAF auf dem Server bereits die Regeln ausführt, die[waf]jetzt vorgibt (unten).
Jede Änderung läuft unter einem Rollback-Timer von 120 Sekunden und wird erst beibehalten, wenn eine neue Verbindung durchkommt, sodass eine fehlerhafte Änderung Sie nicht aussperren kann.
Die Allowlist überdauert allerdings die Adresse, von der aus sie erstellt wurde: Ändert sich Ihre Heimadresse, führt der Weg zurück bei einem ERPC-Server über den ERPC-Support, bei einem eigenen Server über die Konsole des Anbieters. Tragen Sie eine zweite Adresse, von der aus Sie den Server erreichen können (ein Büro, einen VPN-Ausgang), in
firewall.ssh_allow ein, bevor Sie sich auf eine Heimadresse verlassen.Wenn sich Ihre Adresse ändert, fügen Sie jede feste Adresse hinzu, die Ihre Admins verwenden:
bash
Eine WAF vor Ihre Anwendung schalten
Fügen Sie
erpc.toml eine Tabelle hinzu:toml
erpc worker deploy betreibt dann auf dem Server einen HTTP-Reverse-Proxy in einer eigenen systemd-Unit (erpc-waf-<app>-<env>): als unprivilegierter dynamischer Benutzer ohne Schlüssel, ohne Secret und ohne irgendetwas vom Worker, begrenzt auf 1 GiB Arbeitsspeicher. Er lauscht auf waf.port, liest jede Anfrage, bevor die Anwendung sie liest, lehnt ab, was seine Regeln benennen, und leitet den Rest an die Anwendung auf 127.0.0.1:<run.port> weiter.-
Die Anwendung bleibt auf dem Loopback. Ihr eigener Port wird nie von außen geöffnet.
erpc worker apiund der Health-Check erreichen die Anwendung über den Loopback, an der WAF vorbei. -
Wer sich verbinden darf, bestimmt weiterhin die Liste der Firewall, und der Port der WAF ist die einzige Stelle, an der diese Liste alle zulassen darf:shIst niemand eingetragen, lauscht die WAF und niemand wird hereingelassen, und die Bereitstellung meldet das.
-
Der Port wird geöffnet, sobald die WAF auf ihm lauscht, nie vorher. Eine Bereitstellung, deren WAF nicht hochkommt, schlägt fehl und nennt den Grund, während die Anwendung weiterläuft.
-
Wenn Sie
[waf]ändern, wird der Port für niemanden Neues geöffnet, bis eine Bereitstellung die neuen Regeln eingesetzt hat. -
Wenn Sie
[waf]auserpc.tomlentfernen und bereitstellen, wird die WAF vom Server entfernt.
WAF-Einstellungen
Nur
port ist erforderlich. Alle Schlüssel mit ihren Standardwerten:toml
rate, max_connections_per_address, ban und new_connections werden mit false ausgeschaltet (ban = false), und ein weggelassener Schlüssel hat seinen Standardwert. erpc worker check sagt vor jeder Bereitstellung, was die [waf]-Tabelle tun wird und was an ihr falsch ist.Was die WAF ohne Einstellung tut
- Eine Anfrage, die sich nicht als eine eindeutige HTTP/1-Anfrage lesen lässt, erhält 400, ebenso ein Pfad, der nicht in Normalform ist.
- Eine Anfrage zum Protokollwechsel (
Upgrade) erhält 501. - Jede Ablehnung wird auf den Bann angerechnet, und jede Ablehnung beendet ihre Verbindung.
- Eine Adresse ist eine IPv4-Adresse oder ein IPv6-
/64. - Die WAF leitet nicht weiter: die Header, die zur Verbindung des Clients mit dem Proxy gehören (
Connectionund die darin genannten Header,Keep-Alive,Proxy-Authenticate,Proxy-Authorization,Proxy-Connection,TE,Trailer),Expect, Header mit einem Unterstrich im Namen sowie die vom Client selbst gesendetenForwarded,X-Real-IPundX-Forwarded-Proto. Sie setztX-Real-IPauf die Adresse, von der die Verbindung kam, und hängt diese Adresse an das Ende vonX-Forwarded-Foran; nur der letzte Eintrag vonX-Forwarded-Forist die Angabe des Proxys.
Sehen, was die WAF tut
Eine weitergeleitete Anfrage hinterlässt keine Logzeile, und kein Header oder Body wird je geloggt; die Query einer blockierten Anfrage schon, soweit die 200 Bytes reichen. Was ein Client sendet, kann nicht in Ihr Terminal schreiben: Die WAF schreibt ihr Journal als druckbares ASCII.
Was die WAF nicht tut
- Kein TLS. Sie spricht auf ihrem Port reines HTTP/1.1.
- Kein HTTP/2: Darauf antwortet sie mit 400.
- Kein WebSocket, auch kein anderes
Upgrade: 501. - Kein Blick in Bodies. Ein Body wird gemessen, nie gelesen. Die Liste der Scanner-Anfragen ist kurz und ein Rauschfilter, keine Garantie: Die Anwendung prüft ihre Eingaben weiterhin.
- Keine Authentifizierung. Wer die Anwendung aufrufen darf, entscheiden die Anwendung und die Liste der Firewall.
- Eine Adresse ist ein Client. Clients hinter demselben NAT, Proxy oder CDN teilen sich eine Rate und einen Bann; ein Client mit vielen Adressen hat entsprechend viele Raten.
- Banne und Zählerstände werden vergessen, wenn die WAF neu startet.
- Sie merkt sich höchstens 8192 Adressen und hält höchstens 1024 Verbindungen gleichzeitig.
- Sie lauscht nur auf IPv4, daher erreicht ein IPv6-Eintrag in
app_allownoch nichts. - Ein Pfad wird als die Bytes verglichen, zu denen er dekodiert. Eine Anwendung, die Pfade lockerer liest (Groß- und Kleinschreibung ignoriert,
;-Parameter, doppelte Dekodierung), kann unter einem Namen erreicht werden, dendeny_pathsnicht abdeckt.allow_pathshat keine solche Lücke: Was nicht eingetragen ist, wird nicht weitergeleitet. - Ein langsamer Leser wird bis zum Ende bedient. Ein Client, der eine Antwort weiter abnimmt, wie langsam auch immer, wird bis zum Ende bedient.
- Eine Flut kann einen großen Upload abbrechen. Die WAF läuft auf einem einzigen Thread, daher kann eine Flut einen großen Upload mit 408 abbrechen. Eine Anwendung, die große Bodies annimmt, erhöht
body_timeout_secszusammen mitmax_body_bytes.
Der Worker-Leitfaden enthält jede Regel, auch wann eine Änderung an
app_allow bis zur nächsten Bereitstellung zurückgehalten wird.





