Difference between revisions of "Rendere Odoo sicuro su Internet"

From PNLUG
Jump to navigation Jump to search
 
(7 intermediate revisions by 2 users not shown)
Line 7: Line 7:
 
===Installazione reverse proxy Nginx===
 
===Installazione reverse proxy Nginx===
 
L'installazione del reverse proxy ci consentirà pilotare le chiamate verso il server Odoo apportando le opportune misure di sicurezza caso per caso
 
L'installazione del reverse proxy ci consentirà pilotare le chiamate verso il server Odoo apportando le opportune misure di sicurezza caso per caso
: <code>sudo apt-get install nginx -y</code>
+
sudo apt install nginx -y
   
 
Per analizzare il log del servizio Nginx appena lanciato
 
Per analizzare il log del servizio Nginx appena lanciato
: <code>journalctl -u nginx</code>
+
journalctl -u nginx
   
 
Disabilitare la configurazione di default e impostare quella relativa a Odoo
 
Disabilitare la configurazione di default e impostare quella relativa a Odoo
Line 28: Line 28:
 
}
 
}
 
}
 
}
  +
</code>
 
   
 
Ricaricare e riavviare il servizio con la nuova configurazione
 
Ricaricare e riavviare il servizio con la nuova configurazione
: <code>sudo systemctl reload nginx</code>
+
sudo systemctl reload nginx
   
 
Ora il servizio di Odoo risponderà anche senza indicare la porta da utilizzare
 
Ora il servizio di Odoo risponderà anche senza indicare la porta da utilizzare
: <code>http://localhost</code>
+
http://localhost
   
   
Line 40: Line 40:
 
Al fine di mettere in sicurezza le transazioni tra il browser client e il servizio Odoo, è necessario attivare il protocollo HTTPS il quale si appoggia su un certificato SSL.
 
Al fine di mettere in sicurezza le transazioni tra il browser client e il servizio Odoo, è necessario attivare il protocollo HTTPS il quale si appoggia su un certificato SSL.
   
===Certificato SSL autofirmato===
+
===Soluzione #1: certificato SSL autofirmato===
Generare il certificato in autonomia, firmato da noi stessi
+
Possiamo generare il certificato in autonomia, firmato da noi stessi
   
 
sudo mkdir /etc/nginx/ssl && cd /etc/nginx/ssl
 
sudo mkdir /etc/nginx/ssl && cd /etc/nginx/ssl
Line 74: Line 74:
   
 
Ora il servizio di Odoo risponderà solo sulla porta 443
 
Ora il servizio di Odoo risponderà solo sulla porta 443
: <code>https://localhost</code>
+
https://localhost
   
  +
Provando ad accedere al sito, noterete che il certificato autofirmato però genera un'eccezzione al browser perchè i browser riconoscono soltanto gli enti certificati a rilasciarli, e noi non lo siamo.
===Certificato SSL letsencrypt===
 
Il certificato autofirmato però provoca un'eccezzione al browser perchè non rispetta completamente gli standard internazionali di sicurezza previsti.
 
   
 
Per ovviare questo avviso, è possibile sostituire il nostro certificato con uno rilasciato da un ente accreditato a farlo: Let's Encrypt
 
Per ovviare questo avviso, è possibile sostituire il nostro certificato con uno rilasciato da un ente accreditato a farlo: Let's Encrypt
  +
 
===Soluzione #2: certificato SSL letsencrypt===
   
 
Per l'attivazione del certificato è necessario disporre di un nome di dominio il quale deve puntare all'indirizzo IP della macchina dov'è installato Odoo.
 
Per l'attivazione del certificato è necessario disporre di un nome di dominio il quale deve puntare all'indirizzo IP della macchina dov'è installato Odoo.
Line 85: Line 86:
 
Se necessario, configurate opportunamente il router in modo che la chiamata arrivi direttamente al pc nattando l'indirizzo LAN
 
Se necessario, configurate opportunamente il router in modo che la chiamata arrivi direttamente al pc nattando l'indirizzo LAN
   
  +
Fermare il servizio di nginx
Installare il programma
 
  +
  +
systemctl stop nginx
  +
 
Installare il programma cerbot
   
 
sudo apt install certbot
 
sudo apt install certbot
sudo certbot certonly
 
   
  +
Procedere con la richiesta del certificato
seguire le indicazioni fornite dalla procedura di creazione
 
  +
del cerificato indicando tutti i dati richiesti, incluso il nome dominio
 
 
sudo certbot certonly --standalone
```
 
  +
 
seguire le indicazioni fornite dalla procedura di creazione del cerificato indicando tutti i dati richiesti, incluso il nome dominio.
  +
  +
Se tutto funziona correttamente, avrete un messaggio simile a questo:
  +
Congratulations! Your certificate and chain have been saved at:
  +
/etc/letsencrypt/live/mio_dominio.it/fullchain.pem
  +
Your key file has been saved at:
  +
/etc/letsencrypt/live/mio_dominio.it/privkey.pem
  +
  +
Modificate nuovamente il file di configurazione /etc/nginx/sites-available/odoo indicando dove si trova il nuovo certificato
  +
  +
server {
  +
upstream backend-odoo {
  +
server 127.0.0.1:8069;
  +
}
  +
listen 443;
  +
server_name mio_dominio.it;
  +
ssl on;
  +
ssl_ciphers ALL:!ADH:!MD5:!EXPORT:!SSLv2:RC4+RSA:+HIGH:+MEDIUM;
  +
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
  +
ssl_prefer_server_ciphers on;
  +
ssl_certificate /etc/letsencrypt/live/mio_dominio.it/fullchain.pem;
  +
ssl_certificate_key /etc/letsencrypt/live/mio_dominio.it/privkey.pem;
  +
location / {
  +
proxy_pass http://backend-odoo;
  +
}
  +
}
  +
  +
Fate ripartire il servizio nginx
  +
systemctl start nginx
   
 
Ora il servizio di Odoo risponderà correttamente al nome dominio indicato sull'url
 
Ora il servizio di Odoo risponderà correttamente al nome dominio indicato sull'url
: <code>https://mio_sito.it</code>
+
https://mio_dominio.it
  +
  +
===Rinnovo automatico del certificato letsencrypt===
  +
Il certificato appena creato ha una validità di 3 mesi dal momento del rilascio.
  +
  +
È consigialto aggiungere un processo automatico di rinnovo in modo che non dobbiamo ricordarci di farlo noi manualmente.
  +
  +
sudo crontab -e
  +
  +
0 4 1 * * /opt/letsencrypt/letsencrypt-auto renew
  +
  +
con questa configurazione, alle 4:00 di ogni primo del mese viene invocato il comando per aggiornare i certificati presenti.
   
 
===Impostazione firewall===
 
===Impostazione firewall===
 
Chiudere tutte le porte non necessarie al servizio Odoo
 
Chiudere tutte le porte non necessarie al servizio Odoo
   
  +
sudo apt-install ufw
 
sudo ufw status
 
sudo ufw status
 
sudo ufw allow http
 
sudo ufw allow http
 
sudo ufw allow https
 
sudo ufw allow https
  +
sudo ufw allow ssh
 
sudo ufw enable
 
sudo ufw enable
 
sudo ufw status
 
sudo ufw status
 
sudo reboot
 
sudo reboot
  +
  +
  +
===File to ban===
  +
Questo servizio blocca temporaneamente gli indirizzi IP dopo un numero di tentativi di autenticazione non riusciti
  +
  +
Installazione:
  +
sudo apt install fail2ban
  +
  +
Visualizzazione stato del servizio:
  +
sudo fail2ban-client status sshd
  +
  +
Per monitorare le azioni recenti di Fail2ban:
  +
sudo tail -F /var/log/fail2ban.log

Latest revision as of 20:31, 30 August 2022


Esporre Odoo su Internet in sicurezza

Pagina in costruzione

Installazione reverse proxy Nginx

L'installazione del reverse proxy ci consentirà pilotare le chiamate verso il server Odoo apportando le opportune misure di sicurezza caso per caso

sudo apt install nginx -y

Per analizzare il log del servizio Nginx appena lanciato

journalctl -u nginx

Disabilitare la configurazione di default e impostare quella relativa a Odoo

sudo rm /etc/nginx/sites-enabled/default
sudo touch /etc/nginx/sites-available/odoo
sudo ln -s /etc/nginx/sites-available/odoo /etc/nginx/sites-enabled/odoo


Modificare il file /etc/nginx/sites-available/odoo al fine di reindirizzare il traffico sulla porta 8069

upstream backend-odoo {
    server 127.0.0.1:8069;
}
server {
    location / {
        proxy_pass http://backend-odoo;
    }
}


Ricaricare e riavviare il servizio con la nuova configurazione

sudo systemctl reload nginx

Ora il servizio di Odoo risponderà anche senza indicare la porta da utilizzare

http://localhost


Protocollo https

Al fine di mettere in sicurezza le transazioni tra il browser client e il servizio Odoo, è necessario attivare il protocollo HTTPS il quale si appoggia su un certificato SSL.

Soluzione #1: certificato SSL autofirmato

Possiamo generare il certificato in autonomia, firmato da noi stessi

sudo mkdir /etc/nginx/ssl && cd /etc/nginx/ssl
sudo openssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem -days 365 -nodes
sudo chmod a-wx *
sudo chown www-data:root *

Attivazione protocollo SSL

Sostituire il contenuto del file /etc/nginx/sites-available/odoo come indicato

upstream backend-odoo {
  server 127.0.0.1:8069;
}
server {
  listen 443 default;
  # ssl settings
  ssl on;
  ssl_certificate
  /etc/nginx/ssl/cert.pem;
  ssl_certificate_key /etc/nginx/ssl/key.pem;
  keepalive_timeout 60;
  # proxy header and settings
  proxy_set_header Host $host;
  proxy_set_header X-Real-IP $remote_addr;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  proxy_set_header X-Forwarded-Proto $scheme;
  proxy_redirect off;
  location / {
    proxy_pass http://backend-odoo;
  }
}

Ora il servizio di Odoo risponderà solo sulla porta 443

https://localhost

Provando ad accedere al sito, noterete che il certificato autofirmato però genera un'eccezzione al browser perchè i browser riconoscono soltanto gli enti certificati a rilasciarli, e noi non lo siamo.

Per ovviare questo avviso, è possibile sostituire il nostro certificato con uno rilasciato da un ente accreditato a farlo: Let's Encrypt

Soluzione #2: certificato SSL letsencrypt

Per l'attivazione del certificato è necessario disporre di un nome di dominio il quale deve puntare all'indirizzo IP della macchina dov'è installato Odoo.

Se necessario, configurate opportunamente il router in modo che la chiamata arrivi direttamente al pc nattando l'indirizzo LAN

Fermare il servizio di nginx

systemctl stop nginx

Installare il programma cerbot

sudo apt install certbot

Procedere con la richiesta del certificato

sudo certbot certonly --standalone

seguire le indicazioni fornite dalla procedura di creazione del cerificato indicando tutti i dati richiesti, incluso il nome dominio.

Se tutto funziona correttamente, avrete un messaggio simile a questo:

Congratulations! Your certificate and chain have been saved at:
/etc/letsencrypt/live/mio_dominio.it/fullchain.pem
Your key file has been saved at:
/etc/letsencrypt/live/mio_dominio.it/privkey.pem

Modificate nuovamente il file di configurazione /etc/nginx/sites-available/odoo indicando dove si trova il nuovo certificato

server {
   upstream backend-odoo {
     server 127.0.0.1:8069;
   }
   listen 443;
   server_name mio_dominio.it;
   ssl on;
   ssl_ciphers                 ALL:!ADH:!MD5:!EXPORT:!SSLv2:RC4+RSA:+HIGH:+MEDIUM;
   ssl_protocols               TLSv1 TLSv1.1 TLSv1.2;
   ssl_prefer_server_ciphers   on;
   ssl_certificate             /etc/letsencrypt/live/mio_dominio.it/fullchain.pem;
   ssl_certificate_key         /etc/letsencrypt/live/mio_dominio.it/privkey.pem;
   location / {
       proxy_pass http://backend-odoo;
   }
}

Fate ripartire il servizio nginx

systemctl start nginx

Ora il servizio di Odoo risponderà correttamente al nome dominio indicato sull'url

https://mio_dominio.it

Rinnovo automatico del certificato letsencrypt

Il certificato appena creato ha una validità di 3 mesi dal momento del rilascio.

È consigialto aggiungere un processo automatico di rinnovo in modo che non dobbiamo ricordarci di farlo noi manualmente.

sudo crontab -e
0 4 1 * * /opt/letsencrypt/letsencrypt-auto renew

con questa configurazione, alle 4:00 di ogni primo del mese viene invocato il comando per aggiornare i certificati presenti.

Impostazione firewall

Chiudere tutte le porte non necessarie al servizio Odoo

sudo apt-install ufw
sudo ufw status
sudo ufw allow http
sudo ufw allow https
sudo ufw allow ssh
sudo ufw enable
sudo ufw status
sudo reboot


File to ban

Questo servizio blocca temporaneamente gli indirizzi IP dopo un numero di tentativi di autenticazione non riusciti

Installazione:

sudo apt install fail2ban

Visualizzazione stato del servizio:

sudo fail2ban-client status sshd

Per monitorare le azioni recenti di Fail2ban:

sudo tail -F /var/log/fail2ban.log