Proteção contra Hot-Link de CDN e Proxy Avatar

Meu site Discourse tem muitas imagens. Devido às muitas imagens, uso uma combinação de S3/CDN para armazenar e servir imagens. Dentro da CDN, uso várias medidas para evitar o sequestro de imagens. Uma das medidas é impedir todo o acesso direto às imagens e permitir apenas o acesso a partir de uma lista de nomes de host definidos.

O Discourse funciona com essa configuração, exceto pelos Avatares. Os Avatares param de funcionar quando a proteção contra hotlinking está ativada.

O motivo é que o Discourse usa uma configuração de proxy para Avatares. O HTML usa um link de proxy para avatares. A estrutura do link é https://discourse.forum/user_avatar/discourse.forums/username/24/616_2.png.
Uma vez que o proxy é resolvido, o navegador solicita acesso direto ao arquivo de imagem.

Minha CDN impede o acesso direto com um 403 ao fazer essa solicitação direta. E todos os avatares personalizados se tornam silhuetas.

Que opções temos para remover o proxy?
Podemos alterar o avatar para uma estrutura de arquivo de imagem padrão?

Você não pode adicionar o endereço IP do seu Discourse à lista de permissões?

O link de acesso direto é chamado a partir do endereço IP do usuário. O servidor resolve as informações, mas o navegador local faz a chamada.

Não tenho certeza se funciona dessa maneira. Dependendo da sua configuração, o proxy realmente faz o proxy ou a CDN vai primeiro. Você pode detalhar como isso está configurado?

Eu odeio perguntas vagas. O que você estava pensando quando pediu por “isso”?

Aqui estão minhas configurações atuais:

Configuração do Discourse:

  • Instalação padrão em um único contêiner
  • Configurado como um subdomínio: forums.domain.tld
  • Configuração padrão do S3 para uploads
  • Uploads são salvos no S3

Configuração do S3:

  • Digital Ocean S3 Bucket
  • Bucket ativado para acesso externo
  • Nenhuma outra camada de segurança ou permissões

Configuração do CDN:

  • bunny CDN
  • Referenciadores permitidos configurados: domain.tld e *.domain.tld
  • A opção que matou o acesso a avatares foi “Bloquear Acesso Direto a Arquivos por URL”.

Quando ativado, todos os avatares recebiam um erro 403. Quando desativado, os avatares apareciam.

Imagens não de Avatar:

  • URL no Discourse: https://cdn.domain.tld/optimized/3X/3/1/filename_#_size.jpeg

Imagens de Avatar:

  • URL no Discourse: https://forums.domain.tld/user_avatar/forums.domain.tld/mazzini/48/776_2.png

Uma postagem anterior, Como os avatares são armazenados e acessados?, indica que o Discourse usa um proxy para avatares. Portanto, a estrutura de URL para avatares não é uma estrutura de URL de imagem padrão.

Dentro do meu sistema, os avatares estão disponíveis no S3 ou no CDN. Isso indica que em algum lugar/de alguma forma o URL do avatar é convertido para um URL do CDN.

Quando isso acontece, o CDN considera o URL um link de acesso direto e bloqueia o acesso com um 403.

Espero ter respondido à pergunta “isso”?

E eu odeio quando as pessoas respondem assim quando estou gastando meu tempo para ajudá-las, então isso nos deixa empatados :wink:.

Sim, e “proxy” significa que a solicitação passa pelo Discourse. A solicitação não é feita pelo navegador para o CDN, mas pelo Discourse.

Você configurou o CDN como um CDN de site completo ou como o CDN S3? Suspeito que o último. E nesse caso, a solicitação é feita pelo Discourse para o CDN, sem referenciador. Mas o CDN ainda pode reconhecer que é uma solicitação legítima porque a solicitação se origina do IP do Discourse. Daí meu conselho para adicioná-lo à lista de permissões.

Editar: você poderia verificar desativando a proteção por um curto período e olhando os logs no Bunny, e ver de quais IPs eles estão vindo.

Agradeço sua ajuda. Após décadas trabalhando em desenvolvimento e suporte de TI, perguntas e respostas vagas criam mais trabalho do que o necessário. Com base em sua experiência, acho que você concordaria.

A CDN está configurada apenas para o bucket S3.

Verifiquei os logs da CDN para o IP do Discourse relacionado aos erros 403 antes de enviar o tópico original. Ele não estava nos arquivos de log.

Com base em seus comentários, voltei e reanalisei os logs. Após revisar os maiores infratores de IP, descobri que os dois principais são gateways para a empresa de hospedagem.

O desafio é que não quero ficar rastreando os endereços IP de gateway da Digital Ocean para que meu servidor Discourse possa exibir imagens corretamente.

Obrigado pela ajuda.