Questo how-to è un seguito pratico all’articolo precedente in cui raccontavo dell’importanza di utilizzare HTTPS. In questo how-to voglio mostrarti come configurare Apache HTTP Server (che ovviamente supporta anche HTTPS) per ottenere un server web che fornisca uno Shiny Server, un RStudio Server, e volendo anche un end-point API con Plumber tutto fornito tramite HTTPS.
L’obbiettivo
Gli obbiettivi di questo progetto sono essenzialmente due:
- ottenere un unico indirizzo web a cui accedere sia alle applicazioni Shiny, sia a RStudio server (con autenticazione)
- proteggere la comunicazione con un strato di cifratura SSL (HTTPS).
Inoltre utilizzato il server Apache portrai:
- integrare nel sito web altre pagine o applicazioni web nello stesso modo, avendo per ognuno di esso un indirizzo dedicato.
- integrare diversi server Shiny, per usi e utenti differenti
Esempio: RStudio tramite HTTPS
Relazione con le versioni Professional
Il contenuto di questo how-to è applicato alle versioni free, ma non sostituisce software come Shiny Server Pro e Rstudio Server Pro, che insieme ad HTTPS forniscono altre features: un sistema di autenticazione più sofisticato, server multi-threading, pannello di controllo per amministratore e altro. Tuttavia il metodo presentato può ancora essere utile per riunire le applicazioni in un unico punto di accesso web.
Cosa è Apache HTTP Server?
“Apache HTTP Server, o più comunemente Apache è il nome di un server web libero sviluppato dalla Apache Software Foundation. È la piattaforma server Web modulare più diffusa, in grado di operare su una grande varietà di sistemi operativi, tra cui UNIX/Linux, Microsoft Windows e OpenVMS. È un software che realizza le funzioni di trasporto delle informazioni, di internetwork e di collegamento, ed ha il vantaggio di offrire funzioni di controllo per la sicurezza come quelle effettuate da un proxy." Wikipedia
Stiamo parlando quindi di software di Qualità, ampiamente testato, Open Source (licenza Apache), e quindi adatto agli ambienti di produzione.
How-To
Sistema utilizzato e prerequisiti
Queste istruzioni danno per scontato che sul server siano già installati e utilizzabili:
- RStudio-Server all’URL http://localhost:8787
- Shiny-Server all’URL http://localhost:3838
La configurazione che segue è fatta per entrambi i server, ma tutto è fattibile anche con uno solo dei due a condizione di aggiustare il file di configurazione che vedremo più avanti.
Il sistema utilizzato per testare le istruzioni in questa guida è Ubuntu 20.04, ma Apache è disponibile per tutte le maggiori distribuzioni Linux e la configurazione è la medesima, basta solo cambiare il nome dei pacchetti installati.
Installazione di Apache HTTP Server
Apache può essere installato da qualsiasi gestore di pacchetti. Qui mostro come installarlo da Bash, in quanto se volete installarlo su un server vi può essere utile collegarvi con SSH per avere una BASH remota. Insieme ad apache2
si installano altri pacchetti e si abilitano alcuni moduli Apache che torneranno utili più avanti.
|
|
Nota: nelle vecchie versioni di ubuntu potreste non trovare apache2-bin
e avere bisogno libapache2-mod-proxy-html
al suo posto.
A questo punto dovreste poter accedere da browser alla pagina di default di apache: http://localhost (oppure tramite ip http://10.0.2.7
, se accedete da un altro server). Nota bene: stiamo usando http://
, infatti Firefox ci indica che la connessione non è protetta con un lucchetto barrato in rosso.
Abilita HTTPS
Prima di tutto ci servono dei certificati. Svolgendo questo how-to senza un dominio è comodo generarli auto-firmati. Si generano quindi i due file /etc/ssl/private/selfsigned.key
e /etc/ssl/certs/selfsigned.crt
con openssl
da BASH, come utente root con il comando:
|
|
Ora, si deve configurare Apache per rendere disponibile anche la connessione HTTPS, per fare ciò creare il file /etc/apache2/sites-available/r-ssl.conf
:
|
|
Ora, abilita il modulo apache ssl, abilita il virtual host e ricarica la configurazione:
|
|
Ora apri il browser all’URL https://localhost/ (o utilizzando l’ip: https://10.0.2.7). Nota: quando si utilizza un certificato autofirmato, si riceve questo messaggio:
Nota che non c’è alcun rischio ora, il messaggio mette in guardia verso la possibilità che un malintenzionato possa sfruttare la mancanza di autenticazione del server per scopi malevoli. Il problema si risolve in modo adeguato con un certificato firmato da un’autorità di certificazione (Certification Authority CA), il cui processo di generazione non è scopo di questo articolo. Quanto spiegato in questo articolo rimane valido con i certificati firmati, basterà sostituire i file .key
e .crt
per utilizzare HTTPS al pieno delle sue potenzialità.
Per il momento, per risolvere il problema clicca su Advanced e poi su Accept the Risk and Continue. Il browser dovrebbe visualizzare la seguente pagina di default:
Ora HTTPS è attivo.
Nota: Il triangolino giallo significa che il certificato non è firmato. La pagina è di default e può essere sostituita, per esempio, con una Home-Page che visualizzi i collegamenti verso la pagina di Shiny e verso la pagina di RStudio Server.
Shiny Https
Come definito nel file di configurazione, l’indirizzo per accedere a Shiny è https://localhost/shiny (o utilizzando l’ip: https://10.0.2.7/shiny):
Si noti che al posto del solito http://10.0.2.7:3838, si sta utilizzando HTTPS e la sua porta di default (non la 3838, ma la 443, che essendo di default è omessa). La comunicazione con il server Shiny sta passando attraverso la connessione HTTPS preparata dal server Apache.
Ora vediamo come effettuare lo stesso passaggio su RStudio Server e poi vedremo come disabilitare l’accesso a http://10.0.2.7:3838 ormai obsoleto.
RStudio Server Https
In maniera molto simile l’indirizzo per accedere a RStudio Server è https://localhost/rstudio (o utilizzando l’ip: https://10.0.2.7/rstudio):
da qui si può effettuare il solito login e utilizzare R:
Plumber API Https
Plumber API o qualsiasi server web si voglia in https si può utilizzare lo stesso metodo. Supponendo di avere Plumber in ascolto sulla porta 8000, aggiungi la configurazione al file di configurazione r-ssl.conf
di cui sopra:
|
|
Migliora la Sicurezza
Ora che l’accesso e l’utilizzo dei server Shiny e RStudio è possibile tramite connessione sicura, per rendere il sistema più robusto bisogna impedire che l’utente utilizzi la connessione non sicura. Quindi è necessario:
- disabilitare l’accesso diretto agli applicativi server:
http://10.0.2.7:3838
ehttp://10.0.2.7:8787
- dirottare l’utente che accede tramite http (
http://10.0.2.7/...
) ad utilizzare HTTPS
RStudio Server
Aggiungi la riga al file /etc/rstudio/rserver.conf
, per mettere in ascolto RStudio Server solo per connessioni provenienti da localhost.
|
|
Riavvia il server:
|
|
Il risultato è che ora il server ignora le connessioni provenienti da un altro indirizzo. (Nota che http://localhost:8787
continuerà a funzionare).
Shiny Server
Nel file /etc/shiny-server/shiny-server.conf
modificare la linea
|
|
indicando di rispondere alle connessioni nella rete locale:
|
|
Ricarica la nuova configurazine:
|
|
HTTPS Obbligatorio
In /etc/apache2/sites-available/000-default.conf
prima di chiudere il tag </VirtualHost>
aggiungi le istruzioni per il redirect:
|
|
E ricarica la configurazione:
|
|
Ora, ogni volta che l’utente richiede una pagina tramite http://...
viene redirottato sulla medesima rotta in https://...
Firewall
È consigliabile attivare un firewall che blocchi tutte le connessioni in ingresso eccetto quelle sulle porte 80 (HTTP: serve a rendere possibile il redirect su https) e 443 (porta HTTPS) dove passerà tutto il traffico relativo a Apache, Shiny Server e RStudio Server. Nota che il firewall rappresenta un ulteriore livello di sicurezza bloccando gli accessi diretti alle porte 3838 e 8787.
Conclusioni
Con questa semplice configurazione hai raccolto in un unico punto di accesso vari servizi web e li hai resi fruibili esclusivamente tramite protocollo sicuro. Inoltre questa configurazione è del tutto trasparente ai server Shiny e RStudio che vengono configurati indipendentemente da Apache.
Naturalmente questo è solo un inizio, tra le migliorie applicabili citerei:
Rafforzare la sicurezza con la configurazione di un firewall.
Creare ed utilizzare un dominio associato ad certificato firmato da una CA.
Utilizzare un sistema di autenticazione unico per i vari servizi (ora protetto da HTTPS).
Se avete la necessità di utilizzare RStudio server, avete la necessità di strutturare il server con utenti, credenziali, permessi sul filesystem adeguati in modo da agevolare la collaborazione nel team.
Commenti
Commenta su Linkedin
Commenta su Twitter