Blindar um servidor e colocar um WAF na frente da sua aplicação
Desde a primeira implantação, o
erpc worker só permite SSH a partir do seu endereço e descarta todas as outras conexões de entrada. Uma tabela [waf] coloca um proxy de filtragem na frente da sua API.Esta página descreve o ERPC CLI
v0.1.0-rc.4, uma versão de pré-lançamento.O firewall
Uma implantação configura o firewall do servidor antes de a aplicação iniciar pela primeira vez:
- SSH somente a partir de
firewall.ssh_allowe do endereço de onde vem a implantação; - todas as outras conexões de entrada descartadas, exceto
run.porta partir defirewall.app_allow; para uma aplicação atrás de um WAF, a porta do WAF no lugar dela, e somente onde o WAF no servidor já executa as regras que[waf]define agora (abaixo).
Cada alteração é executada sob um temporizador de rollback de 120 segundos e só é mantida depois que uma nova conexão consegue entrar, de modo que uma alteração errada não pode deixar você trancado do lado de fora.
Mas a allowlist continua valendo depois que o endereço a partir do qual ela foi criada deixa de ser o seu: se o endereço da sua casa mudar, o caminho de volta é o suporte da ERPC, para um servidor ERPC, ou o console do provedor, para um servidor próprio. Mantenha em
firewall.ssh_allow um segundo endereço a partir do qual você consegue acessar o servidor (um escritório, uma saída de VPN) antes de confiar em um endereço doméstico.Se o seu endereço mudar, adicione todos os endereços fixos que seus administradores usam:
bash
Colocar um WAF na frente da sua aplicação
Adicione uma tabela ao
erpc.toml:toml
Em seguida, o
erpc worker deploy executa um proxy reverso HTTP no servidor, em uma unidade systemd própria (erpc-waf-<app>-<env>): um usuário dinâmico sem privilégios, sem chave, sem segredo e sem nada do worker, limitado a 1 GiB de memória. Ele escuta em waf.port, lê cada requisição antes da aplicação, recusa o que as regras dele indicam e encaminha o restante para a aplicação em 127.0.0.1:<run.port>.-
A aplicação fica no loopback. A porta dela nunca é aberta para fora. O
erpc worker apie o health check acessam a aplicação pelo loopback, sem passar pelo WAF. -
Quem pode se conectar continua definido pela lista do firewall, e a porta do WAF é o único lugar em que essa lista pode dizer todos:shSem ninguém na lista, o WAF escuta e ninguém entra, e a implantação avisa isso.
-
A porta é aberta depois que o WAF passa a escutar nela, nunca antes. Uma implantação cujo WAF não sobe falha e diz o motivo, com a aplicação ainda em execução.
-
Quando você altera
[waf], a porta não é aberta para ninguém novo até que uma implantação tenha colocado as novas regras em vigor. -
Retirar
[waf]doerpc.tomle implantar remove o WAF do servidor.
Configurações do WAF
Somente
port é obrigatória. Todas as chaves, com seus valores padrão:toml
rate, max_connections_per_address, ban e new_connections são desativados com false (ban = false), e uma chave omitida fica com o valor padrão. O erpc worker check diz o que a tabela [waf] vai fazer, e o que há de errado com ela, antes de qualquer implantação.O que o WAF faz sem nenhuma configuração
- Uma requisição que não pode ser lida como uma única requisição HTTP/1 sem ambiguidade recebe 400, assim como um caminho que não está na forma normal.
- Uma requisição para mudar de protocolo (
Upgrade) recebe 501. - Toda recusa conta para o banimento, e cada recusa encerra a conexão dela.
- Um endereço é um endereço IPv4 ou um
/64IPv6. - O WAF não encaminha ao proxy os cabeçalhos da conexão do cliente (
Connectione os cabeçalhos que ele nomeia,Keep-Alive,Proxy-Authenticate,Proxy-Authorization,Proxy-Connection,TE,Trailer),Expect, cabeçalhos cujo nome tem um sublinhado, nem osForwarded,X-Real-IPeX-Forwarded-Protoenviados pelo próprio cliente. Ele defineX-Real-IPcomo o endereço de onde veio a conexão e adiciona esse endereço ao final deX-Forwarded-For; somente a última entrada deX-Forwarded-Forvem do proxy.
Ver o que o WAF faz
Uma requisição encaminhada não deixa linha de log, e nenhum cabeçalho ou corpo é registrado em log em momento algum; a query de uma requisição bloqueada é registrada, até onde os 200 bytes alcançam. O que um cliente envia não consegue escrever no seu terminal: o WAF grava o journal dele como ASCII imprimível.
O que o WAF não faz
- Sem TLS. Ele usa HTTP/1.1 simples na porta dele.
- Sem HTTP/2: ele responde 400 a esse protocolo.
- Sem WebSocket, nem qualquer outro
Upgrade: 501. - Não olha dentro dos corpos. Um corpo é medido, nunca lido. A lista de sondagens é curta e é um filtro de ruído, não uma garantia: a aplicação continua verificando a própria entrada.
- Sem autenticação. Quem pode chamar a aplicação é decisão da aplicação, e da lista do firewall.
- Um endereço é um cliente. Clientes atrás de um mesmo NAT, proxy ou CDN compartilham uma taxa e um banimento; um cliente com muitos endereços tem tantas taxas quanto endereços.
- Banimentos e contagens são esquecidos quando o WAF reinicia.
- Ele lembra no máximo 8192 endereços e mantém no máximo 1024 conexões ao mesmo tempo.
- Ele escuta somente em IPv4, então uma entrada IPv6 em
app_allowainda não alcança nada. - Um caminho é comparado como os bytes em que ele é decodificado. Uma aplicação que lê caminhos de forma mais permissiva (ignorando maiúsculas e minúsculas, parâmetros
;, decodificando duas vezes) pode ser alcançada por um nome quedeny_pathsnão cobre.allow_pathsnão tem essa brecha: o que não está na lista não é encaminhado. - Um leitor lento é atendido até o fim. Um cliente que continua recebendo uma resposta, por mais devagar que seja, é atendido até o fim.
- Um flood pode interromper um upload grande. O WAF roda em uma única thread, então um flood pode interromper um upload grande com 408. Uma aplicação que recebe corpos grandes aumenta
body_timeout_secsjunto commax_body_bytes.
O guia do worker traz todas as regras, inclusive quando uma alteração em
app_allow fica retida até a próxima implantação.





