Gestione della "catena di fiducia" dell'IP reale dell'utente finale

Contesto

Discourse deve essere consapevole dell’indirizzo IP reale dell’utente finale.

Tuttavia, un utente finale non si connette mai direttamente a Discourse, poiché è sempre presente uno o più server web upstream (nginx in esecuzione nel container Discourse). Pertanto, abbiamo bisogno di un modo per trasmettere queste informazioni a Discourse in modo affidabile.

L’intestazione x-forwarded-for è la soluzione. In questo argomento descriverò i meccanismi specifici per gestire correttamente queste informazioni e come ci aspettiamo che vengano propagate.

Modelli

I vari modelli per la fiducia nei proxy upstream (ad esempio cloudflare.template.yml o fastly.template.yml) sono stati aggiornati per utilizzare nomi di file prevedibili negli outlet, invece di affidarsi alla sostituzione di testo (che è fragile).

Nomi dei file

server/real-ip-header.conf

Questo file contiene l’intestazione che nginx in esecuzione nel container utilizzerà come fonte di verità, ad esempio:

real_ip_header x-forwarded-for;

o come impostato nel modello Cloudflare:

real_ip_header cf-connecting-ip;

server/real-ip-recursive.conf

Se questo file esiste, controlla la ricorsione nell’elaborazione dell’intestazione “IP reale”. Dovrai abilitarlo se c’è più di un proxy davanti al container Discourse.

real_ip_recursive on;

Esempio:

Cloudflare → Load Balancer → Container Discourse (che è nginx + Discourse stesso)

Con questa configurazione, nginx riceverà un x-forwarded-for che assomiglia a:

x-forwarded-for: real_end_user_ip, cloudflare_ip

su una connessione da un IP del Load Balancer.

Per elaborarlo, nginx determina prima se l’indirizzo di origine della connessione (l’IP del Load Balancer) è affidabile (vedi set_real_ip_from) e, in tal caso, elaborerà l’ultimo IP dell’intestazione x-forwarded-for.

Poiché quell’indirizzo IP è cloudflare_ip, nginx deve quindi farlo di nuovo, controllando se cloudflare_ip è affidabile e utilizzando il successivo indirizzo IP, che è real_end_user_ip.

server/set-real-ip-from-ENVIRONMENT.conf

Questo file contiene direttive che indicano a nginx quali indirizzi IP fidare, e possiamo avere quanti file e direttive sono necessari.

I modelli in discourse_docker creano questi file quando necessario (ad esempio set-real-ip-from-cloudflare.conf) e se hai esigenze aggiuntive puoi aggiungere i tuoi.

Esempio:

Se stai eseguendo su AWS e hai un ALB davanti al container Discourse, puoi aggiungere un file aggiuntivo aggiungendo quanto segue alla tua definizione del container (adattato al tuo ambiente):

run:
  - file:
      path: /etc/nginx/conf.d/outlets/server/set-real-ip-from-aws.conf
      chmod: 644
      # AWS VPC è 10.42.0.0/16, fidati di qualsiasi connessione dalle reti ALB
      contents: |
        set_real_ip_from 10.42.66.0/24;
        set_real_ip_from 10.42.67.0/24;
  - file:
      path: /etc/nginx/conf.d/outlets/server/real-ip-header.conf
      chmod: 644
      contents: |
        real_ip_header x-forwarded-for;
4 Mi Piace