Vai al contenuto

Se avete l'esigenza di esporre un servizio web di casa vostra e volete farlo in maniera sicura gestendo voi direttamente il tutto per avere il massimo controllo una soluzione è il reverse proxy con autenticazione.

Per fare un esempio potreste voler pubblicare in internet una ip cam di sorveglianza che guarda l'esterno di casa. Il modo più facile è di impostare una regola sul vostro router per aprire la porta della videocamera ma questo presenta almeno un paio di problematiche che portano a sconsigliarlo. La più ovvia è che la videocamera potrebbe non avere l'impostazione per proteggerla con password e non è bello che chiunque possa guardare fuori da casa vostra. Una seconda considerazione è sul grado di sicurezza della vostra ip cam: potrebbe avere dei bug che permettono ad un malintenzionato di prenderne il controllo o, anche se non ne avesse, in futuro potrebbero saltarne fuori e il produttore quasi certamente non pubblicherà un aggiornamento per tappare la falla.

La soluzione reverse proxy con autenticazione è indubbiamente più complessa ma permette di avere il pieno controllo della parte che si pubblica in internet e di poter quindi tenere aggiornati tutti i componenti alle ultime versioni: un sistema correttamente configurato e mantenuto aggiornato è una buona garanzia di sicurezza.

Cosa serve per realizzarlo? Prima indico un breve elenco di oggetti che servono e poi qualche dettaglio sulle configurazioni.

Elenco:

  • Un ip pubblico (niente NAT/Carrier Grade NAT altrimenti non siete raggiungibili dall'esterno)
  • Un router che possa tenere aggiornato un dns dinamico con il vostro ip (o un ip pubblico statico)
  • Un server sempre acceso da adibire a reverse proxy

Per accedere in maniera sicura bisogna esporre il servizio in HTTPS quindi usiamo Let's Encrypt per avere un certificato gratuito per il dns che abbiamo impostato nel nostro router.

Se utilizzare una Debian con Apache come web server allora dovete abilitare i vari moduli proxy e un idea di settaggi del reverse proxy potrebbe essere:

<VirtualHost *:443>
          SSLEngine on
          SSLCertificateFile /etc/letsencrypt/live/tuo.dominio.it/fullchain.pem
          SSLCertificateKeyFile /etc/letsencrypt/live/tuo.dominio.it/privkey.pem
          ServerAdmin tuaemail@example.it
          ServerName tuo.dominio.it
          ProxyPass / http://192.168.1.100/
          ProxyPassReverse / http://192.168.1.100/
          <Proxy *>
                    AuthType Basic
                    AuthName "Restricted Access"
                    AuthUserFile "/cartella/dove/metti/il/file/passwordapache"
                    Require user nomeutente
          </Proxy>
          </VirtualHost>
<VirtualHost *:80>
          ServerName tuo.dominio.it
          Redirect permanent / https://tuo.dominio.it/
</VirtualHost>

Come vedete ho messo un rediret permenent per HTTP (porta 80) in modo che se anche cerchi di accedere senza l'HTTPS vieni rediretto sul sito sicuro. Nella sezione sopra, quella HTTPS (porta 443), ho indicato le posizioni dei certificati, l'ip interno del web server da esporre (da notare che può essere anche solo HTTP ma verso l'esterno viene fatto transitare HTTPS), come AuthName non mettete nulla di personale perché è visibile a chiunque prima dell'autenticazione e poi c'è il file dove salverete utente e password.

Fatto in questo modo potete accedere da internet al vostro servizio web semplicemente con https://tuo.dominio.it/ vi apparirà la richiesta di nome utente e password e tutto quanto transiterà in maniera cifrata.

Come avevo preannunciato in dicembre 2016 ho finalmente implementato l'https su questo blog.

A parte l'accesso amministrativo che richiede un autenticazione e quindi mandare le credenziali in chiaro (con http) non è sicuro, il resto non ha un motivo pratico per richiedere la cifratura delle comunicazioni.

Il motivo è un altro. A tendere tutti i siti web dovrebbero passare ad https e questo porterà all'abitudine di aspettarsi che un sito sia https. Questo aiuta ad essere sicuri che il sito che si sta visitando sia realmente quello che ci aspettiamo.

In realtà anche un malintenzionato può mettere in piedi un sito truffa in https ma almeno dovremo solo controllare il nome del sito a destra del lucchetto per essere sicuri che corrisponda a quello sul quale volevamo andare.

Anche google dice ormai che nei risultati delle ricerche verranno penalizzati i siti che non saranno in https quindi conviene non rimanere indietro.

Ora veniamo a qualche informazione tecnica che potrebbe esservi utile per la

MIGRAZIONE DA HTTP A HTTPS

Il passaggio, che è sempre un pre requisito ogni volta che si mette mano al proprio blog, è quello di fare un backup completo: sia del database che della /var/www del blog (o della cartella dove risiede)

Come segnalato all'inizio con il link al mio vecchio post il primo passaggio è quello di richiedere il certificato.

Se nei vostri vecchi post avevate delle immagini e i link erano con indicato http avrete un problema: i browser segnaleranno qualcosa che non va. Per sistemare ho usato un plugin wordpress che si chiama Search & Replace e ho sostituito src="http:// con src="// togliendo così il riferimento e lasciando il default del sito. Ovviamente nelle impostazioni generali dovrete cambiare l'indirizzo del blog mettendo https.

Anche da altre parti potrebbe essere rimasto qualche riferimento ad immagini http. Tipicamente nelle colonne laterali ma si tratterà di pochi link che dovrete controllare a mano e sistemare senza la necessita di tool automatizzati come per le immagini dei post che invece potrebbero essere tante.

2

letsencryptBreve nota per segnalare Let's Encrypt.

Forniscono certificati e facili procedure per trasformare un sito http in https. In questo modo se ne facilita l'adozione e si rende più sicuro il web.

Prima o poi lo attiverò sul questo mio blog.

(via Schneier on Security)