This page looks best with JavaScript enabled

#3 Piattaforma Web R con HTTPS (How-to)

 ·  ☕ 9 min read

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:

  1. ottenere un unico indirizzo web a cui accedere sia alle applicazioni Shiny, sia a RStudio server (con autenticazione)
  2. proteggere la comunicazione con un strato di cifratura SSL (HTTPS).

Inoltre utilizzato il server Apache portrai:

  1. integrare nel sito web altre pagine o applicazioni web nello stesso modo, avendo per ognuno di esso un indirizzo dedicato.
  2. 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.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
sudo apt-get install apache2
sudo apt-get install apache2-bin
sudo apt-get install libxml2-dev

sudo a2enmod proxy
sudo a2enmod proxy_http
sudo a2enmod proxy_wstunnel
sudo a2enmod headers
sudo a2enmod rewrite

sudo systemctl reload apache2

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:

1
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/selfsigned.key -out /etc/ssl/certs/selfsigned.crt

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:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<VirtualHost _default_:443>

  SSLEngine on
  SSLCertificateFile /etc/ssl/certs/selfsigned.crt
  SSLCertificateKeyFile /etc/ssl/private/selfsigned.key

  RewriteEngine on  

  # Shiny
  RedirectMatch permanent ^/shiny$ /shiny/
  RewriteCond %{HTTP:Upgrade} =websocket
  RewriteRule /shiny/(.*) ws://localhost:3838/$1 [P,L]
  RewriteCond %{HTTP:Upgrade} !=websocket
  RewriteRule /shiny/(.*) http://localhost:3838/$1 [P,L]
  ProxyPass /shiny/ http://localhost:3838/
  ProxyPassReverse /shiny/ http://localhost:3838/
  Header edit Location ^/ /shiny/

  # RStudio
  RedirectMatch permanent ^/rstudio$ /rstudio/
  RewriteCond %{HTTP:Upgrade} =websocket
  RewriteRule /rstudio/(.*) ws://localhost:8787/$1 [P,L]
  RewriteCond %{HTTP:Upgrade} !=websocket
  RewriteRule /rstudio/(.*) http://localhost:8787/$1 [P,L]
  ProxyPass /rstudio/ http://localhost:8787/
  ProxyPassReverse /rstudio/ http://localhost:8787/
  Header edit Location ^/ /rstudio/

  ProxyRequests Off

</VirtualHost>

Ora, abilita il modulo apache ssl, abilita il virtual host e ricarica la configurazione:

1
2
3
sudo a2enmod ssl
sudo a2ensite r-ssl.conf
sudo systemctl reload apache2

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:

1
2
3
4
5
6
7
8
9
  # Plumber
  RedirectMatch permanent ^/api$ /api/
  RewriteCond %{HTTP:Upgrade} =websocket
  RewriteRule /api/(.*) ws://localhost:8000/$1 [P,L]
  RewriteCond %{HTTP:Upgrade} !=websocket
  RewriteRule /api/(.*) http://localhost:8000/$1 [P,L]
  ProxyPass /api/ http://localhost:8000/
  ProxyPassReverse /api/ http://localhost:8000/
  Header edit Location ^/ /api/

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 e http://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.

1
www-address=127.0.0.1

Riavvia il server:

1
sudo systemctl restart rstudio-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

1
  listen 3838;

indicando di rispondere alle connessioni nella rete locale:

1
  listen 3838 127.0.0.1;

Ricarica la nuova configurazine:

1
sudo systemctl reload shiny-server.service

HTTPS Obbligatorio

In /etc/apache2/sites-available/000-default.conf prima di chiudere il tag </VirtualHost> aggiungi le istruzioni per il redirect:

1
2
3
        RewriteEngine On
        RewriteCond %{HTTPS} !=on
        RewriteRule ^/?(.*) https://%{SERVER_NAME}/$1 [R,L]

E ricarica la configurazione:

1
sudo systemctl reload apache2

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:

  1. Rafforzare la sicurezza con la configurazione di un firewall.

  2. Creare ed utilizzare un dominio associato ad certificato firmato da una CA.

  3. Utilizzare un sistema di autenticazione unico per i vari servizi (ora protetto da HTTPS).

  4. 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

Share on