Een server afschermen en een WAF voor uw app plaatsen
Vanaf de eerste uitrol laat
erpc worker SSH alleen toe vanaf uw adres en verwerpt het elke andere inkomende verbinding. Een tabel [waf] zet een filterende proxy voor uw API.Deze pagina beschrijft ERPC CLI
v0.1.0-rc.4, een pre-release.De firewall
Een uitrol stelt de firewall van de server in voordat de app voor het eerst start:
- SSH alleen vanaf
firewall.ssh_allowen het adres waarvandaan de uitrol komt; - elke andere inkomende verbinding verworpen, behalve
run.portvanaffirewall.app_allow; voor een app achter een WAF in plaats daarvan de poort van de WAF, en alleen waar de WAF op de server al de regels draait die[waf]nu voorschrijft (hieronder).
Elke wijziging loopt onder een rollbacktimer van 120 seconden en wordt pas behouden zodra een nieuwe verbinding binnenkomt, zodat een foute wijziging u niet kan buitensluiten.
De allowlist overleeft wel het adres waarvandaan hij is gemaakt: als uw thuisadres verandert, is de weg terug naar binnen ERPC-support voor een ERPC-server, of de console van de provider voor een eigen server. Zet een tweede adres waarvandaan u de server kunt bereiken (een kantoor, een VPN-uitgang) in
firewall.ssh_allow voordat u op een thuisadres vertrouwt.Als uw adres verandert, voeg dan elk vast adres toe dat uw beheerders gebruiken:
bash
Een WAF voor uw app plaatsen
Voeg één tabel toe aan
erpc.toml:toml
erpc worker deploy draait daarna een HTTP-reverse proxy op de server, in een eigen systemd-unit (erpc-waf-<app>-<env>): een dynamische gebruiker zonder privileges, zonder sleutel, zonder secret en zonder iets van de worker, beperkt tot 1 GiB geheugen. Hij luistert op waf.port, leest elk verzoek voordat de app dat doet, weigert wat zijn regels noemen en stuurt de rest door naar de app op 127.0.0.1:<run.port>.-
De app blijft op loopback. Zijn eigen poort wordt nooit van buitenaf geopend.
erpc worker apien de health check bereiken de app via loopback, buiten de WAF om. -
Wie verbinding mag maken, wordt nog steeds bepaald door de lijst van de firewall, en de poort van de WAF is de enige plek waar die lijst iedereen mag noemen:shStaat er niemand op de lijst, dan luistert de WAF en wordt niemand toegelaten, en de uitrol meldt dat.
-
De poort wordt geopend zodra de WAF erop luistert, nooit eerder. Een uitrol waarvan de WAF niet opkomt, mislukt en zegt waarom, terwijl de app blijft draaien.
-
Als u
[waf]wijzigt, wordt de poort voor niemand nieuws geopend totdat een uitrol de nieuwe regels op hun plaats heeft gezet. -
[waf]weghalen uiterpc.tomlen uitrollen verwijdert de WAF van de server.
WAF-instellingen
Alleen
port is verplicht. Elke sleutel, met zijn standaardwaarde:toml
rate, max_connections_per_address, ban en new_connections worden uitgeschakeld met false (ban = false), en een weggelaten sleutel heeft zijn standaardwaarde. erpc worker check zegt vóór elke uitrol wat de tabel [waf] zal doen en wat er mis mee is.Wat de WAF doet zonder dat er iets ingesteld hoeft te worden
- Een verzoek dat zich niet laat lezen als één ondubbelzinnig HTTP/1-verzoek krijgt 400, en een pad dat niet in normaalvorm staat ook.
- Een verzoek om van protocol te wisselen (
Upgrade) krijgt 501. - Elke weigering telt mee voor de ban, en elke weigering beëindigt haar verbinding.
- Een adres is een IPv4-adres, of een IPv6-
/64. - De WAF stuurt de headers van de verbinding tussen de client en de proxy niet door (
Connectionen de headers die deze noemt,Keep-Alive,Proxy-Authenticate,Proxy-Authorization,Proxy-Connection,TE,Trailer), evenminExpect, headers met een underscore in hun naam, of de eigenForwarded,X-Real-IPenX-Forwarded-Protovan de client. Hij zetX-Real-IPop het adres waarvandaan de verbinding kwam en voegt dat adres toe aan het einde vanX-Forwarded-For; alleen voor de laatste vermelding vanX-Forwarded-Forstaat de proxy in.
Zien wat de WAF doet
Een doorgestuurd verzoek laat geen logregel achter, en er wordt nooit een header of body gelogd; de query van een geblokkeerd verzoek wel, voor zover de 200 bytes reiken. Wat een client stuurt, kan niets op uw terminal schrijven: de WAF schrijft zijn journal als afdrukbare ASCII.
Wat de WAF niet doet
- Geen TLS. Hij spreekt onversleuteld HTTP/1.1 op zijn poort.
- Geen HTTP/2: daarop antwoordt hij met 400.
- Geen WebSocket, en ook geen andere
Upgrade: 501. - Geen blik in bodies. Een body wordt gemeten, nooit gelezen. De probelijst is kort en een ruisfilter, geen garantie: de app blijft zijn invoer controleren.
- Geen authenticatie. Wie de app mag aanroepen, is aan de app om te bepalen, en aan de lijst van de firewall.
- Eén adres is één client. Clients achter één NAT, proxy of CDN delen een snelheidslimiet en een ban; een client met veel adressen heeft evenveel snelheidslimieten.
- Bans en tellingen worden vergeten wanneer de WAF herstart.
- Hij onthoudt hoogstens 8192 adressen en houdt hoogstens 1024 verbindingen tegelijk open.
- Hij luistert alleen op IPv4, dus een IPv6-vermelding in
app_allowbereikt nog niets. - Een pad wordt vergeleken als de bytes waarnaar het decodeert. Een app die paden losser leest (hoofdletters negeren, parameters met
;, dubbel decoderen) kan worden bereikt onder een naam diedeny_pathsniet dekt.allow_pathsheeft zo'n gat niet: wat niet op de lijst staat, wordt niet doorgestuurd. - Een trage lezer wordt tot het einde bediend. Een client die een antwoord blijft afnemen, hoe langzaam ook, wordt tot het einde bediend.
- Een flood kan een grote upload afbreken. De WAF draait op één thread, dus een flood kan een grote upload afbreken met 408. Een app die grote bodies aanneemt, verhoogt
body_timeout_secssamen metmax_body_bytes.
De worker-handleiding bevat elke regel, ook wanneer een wijziging aan
app_allow tot de volgende uitrol wordt aangehouden.





