Rendere Odoo sicuro su Internet

From PNLUG
Revision as of 20:31, 30 August 2022 by Marcelo.frare (talk | contribs)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to: navigation, search


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