Como descartar requisições com um user agent vazio?

Estou recebendo muitos bots/crawlers ruins acessando meu site Discourse com um user agent vazio. Normalmente, eu editaria a configuração do nginx para fazer isso, mas isso não é acessível ao usar o método de instalação Docker. Eu realmente não quero adicionar um RP extra apenas para isso, se puder evitar.

1 curtida

Você pode consultar discourse_docker/templates/web.ratelimited.template.yml at main · discourse/discourse_docker · GitHub como um exemplo de como modificar a configuração do nginx dentro do contêiner.

5 curtidas

Para qualquer outra pessoa que queira fazer isso especificamente, criei /var/discourse/templates/web.blockemptyua.yml com o seguinte conteúdo:

run:
  - replace:
     filename: "/etc/nginx/conf.d/discourse.conf"
     from: /listen 443 ssl http2;/
     to: |
       listen 443 ssl http2;
       if ($http_user_agent = "") { return 403; }

Em seguida, em /var/discourse/containers/app.yml, adicionei este novo arquivo de template ao fim da lista de templates no topo do arquivo, seguido por ./launcher rebuild app

O Nginx agora rejeita todas as requisições com um UA vazio.

Editar: Mudei a correspondência/substituição para um lugar melhor.

4 curtidas

Eu não conheço o Docker, então, para garantir, porque ficarei nervoso toda vez que vir replace em qualquer lugar…

Isso não está substituindo totalmente o conteúdo de discourse.conf, mas adicionando a ele, certo?

Ele está substituindo uma linha dentro do arquivo. Portanto, ele encontra a primeira instância de:

listen 443 ssl http2;

E o substitui por

listen 443 ssl http2;
if ($http_user_agent = "") { return 403; }

Assim, estamos apenas adicionando uma nova linha ao arquivo no local correto. Nenhuma outra parte do arquivo é tocada. Ele usa o mesmo mecanismo dos modelos oficiais para aplicar o patch no arquivo com segurança.

2 curtidas

Como eu disse antes, eu não sei docker. Sou apenas um pobre usuário final com doutorado em copiar e colar.

É por isso que um aviso para futuros pesquisadores:

web.blockemptyua.yml não pode ser o primeiro dos templates declarados. Mais precisamente, ele tem que vir depois de web.template.yml (ou talvez depois de todos os templates web.*).

A ordem tem significado aqui, eu acho, e se eu/nós estamos tentando trabalhar com ele como o primeiro, a reconstrução/inicialização para com um erro porque não há nenhum /etc/nginx/conf.d/discourse.conf naquele momento.

Bem, todo dia algo novo :wink:

1 curtida

De fato, ele precisa ir no final. Editei minha postagem para incluir isso :+1:

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.