Un Raspberry per un Cloud... Sicurezza prego!

sicurezza cloudAvere un cloud a casa propria ha certamente i suoi vantaggi, ma potrebbe comportare una serie di fastidi, neanche tanto piccoli, se non gli si garantisce un minimo di sicurezza... Per la maggior parte si tratta di buone pratiche e semplici impostazioni, che potrebbero però mettervi al sicuro da tentativi di intrusione o bloccare sul nascere attacchi DDoS o DoS permettendovi di dormire dei sonni relativamente tranquilli; "relativamente" perché non c'è santo che tenga, se qualcuno vi prende di mira prima o poi vi "scagazzerà" il cloud. Con un minimo di buone pratiche le possibilità che ciò accada saranno abbastanza basse che, se ciò succedesse, vi sentireste degli "sfigati" e non  "incoscienti".

HTTPS e firewall

Innanzitutto si comincia forzando Owncloud ad usare il protocollo HTTPS e non HTTP:

sudo nano /var/www/owncloud/config/config.php

e nel file di configurazione che si aprirà, alla voce forcessl, bisognerà sostituire la condizione false con true.
Si può quindi passare al firewall. In questo caso installeremo ufw ("Uncomplicated firewall") che non è altro che un front-end, da linea di comando, di iptables (che è il firewall vero e proprio):

sudo apt-get install ufw

I comandi per la configurazione sono molto semplici (e vanno tutti preceduti da sudo): ufw status / enable /disable permettono di verificare lo stato di ufw, di abilitarlo e disabilitarlo, deny e allow chiudono o aprono le porte. In questo caso andranno aperte le porte 80 (HTTP) e 443 (HTTPS) verso tutti e le porte 22 (SSH) e 5900 (per VNC) solo verso gli indirizzi della rete a cui è connesso il RasPI; logging on attiva la scrittura del file di log:

sudo ufw allow from 192.168.1.1/24 to any port 22
sudo ufw allow from 192.168.1.1/24 to any port 5900 ; per vnc
sudo ufw allow 80
sudo ufw allow 443
sudo logging on
sudo ufw enable

Si passa quindi ad impostare una password per l'accesso a nginx; per farlo si ricorrerà all'applicazione apache2-utils, che raccoglie diversi strumenti utili a configurare/proteggere un web-server (non solo Apache):

sudo apt-get install apache2-utils
sudo htpasswd -c /etc/nginx/.htpasswd USER

ed al posto di USER inserirete il nome utente; premuto invio comparirà la richiesta di inserire la password:

New password:***********
Re-type new password:**********
Adding password for user USER

e dopo aver ridigitato invio il file sarà pronto. Per attivare l'autenticazione, sarà necessario aprire di nuovo il file di configurazione di nginx:

sudo nano /etc/nginx/sites-available/deafult

ed inserire le seguenti istruzioni dopo la directory della cartella che va protetta:

auth_basic "Restricted";
auth_basic_user_file /etc/nginx/.htpasswd;

quindi si riavvia tutto o si ricarica il nginx:

sudo /et/cinit.d/nginx reload

Fail2ban

Ora è il momento di installare fail2ban, che verrà configurato in modo tale da bloccare chiunque cerchi di eseguire script, usare il server come un proxy, tentare ripetutamente il log e limitare il numero di connessioni durante la sessione; per installarlo bisogna digitare nella shell:

sudo apt-get install fail2ban

quindi si modifica il file di configurazione:

sudo nano /etc/fail2ban/jail.conf

aggiungendo le seguenti righe:

[nginx-auth]
enabled = true
filter = nginx-auth
action = iptables-multiport[name=NoAuthFailures, port="http,https"]
logpath = /var/log/nginx*/*error*.log
bantime = 1200 # 20 minuti
maxretry = 5

[nginx-login]
enabled = true
filter = nginx-login
action = iptables-multiport[name=NoLoginFailures, port="http,https"]
logpath = /var/log/nginx*/*access*.log
bantime = 1200 # 20 minuti
maxretry = 5

[nginx-badbots]
enabled  = true
filter = apache-badbots
action = iptables-multiport[name=BadBots, port="http,https"]
logpath = /var/log/nginx*/*access*.log
bantime = 86400 # 1 giorno
maxretry = 1

[nginx-noscript]
enabled = true
action = iptables-multiport[name=NoScript, port="http,https"]
filter = nginx-noscript
logpath = /var/log/nginx*/*access*.log
maxretry = 5
bantime  = 86400 # 1 giorno

[nginx-proxy]
enabled = true
action = iptables-multiport[name=NoProxy, port="http,https"]
filter = nginx-proxy
logpath = /var/log/nginx*/*access*.log
maxretry = 0
bantime  = 86400 # 1 giorno

Quindi andranno creati alcuni file per configurare i filtri, inseriti nella cartella conf.d:

sudo nano /etc/fail2ban/filter.d/nginx-proxy.conf

con le istruzioni:

[Definition]
failregex = ^<HOST> -.*GET http.*
ignoreregex =

poi:

sudo nano /etc/fail2ban/filter.d/nginx-noscript.conf

con invece:

[Definition]
failregex = ^<HOST> -.*GET.*(\.php|\.asp|\.exe|\.pl|\.cgi|\scgi)
ignoreregex =

il penultimo:

sudo nano /etc/fail2ban/filter.d/nginx-auth.conf:

in cui inserire:

[Definition]
failregex = no user/password was provided for basic authentication.*client: <HOST>
user .* was not found in.*client: <HOST>
user .* password mismatch.*client: <HOST>
ignoreregex =

ed infine:

sudo nano /etc/fail2ban/filter.d/nginx-login.conf:

in cui inserire le istuzioni:

[Definition]
failregex = ^<HOST> -.*POST /sessions HTTP/1\.." 200
ignoreregex =

Varie ed eventuali

A questo punto il grosso del lavoro è fatto, e restano da sistemare alcune impostazioni (in primis di php): innanzitutto è fondamentale caricare il minimo indispensabile al funzionamento del server; digitando nella shell:

php -m

viene restituita la lista dei moduli di php attivi; non  però detto che siano tutti necessari, quindi è meglio disattivare i superflui (per sapere le funzioni di ogni modulo può essere utile dare un'occhiata alla documentazione di php):

sudo mv /etc/php5/"modulo".ini  /etc/php5/"modulo".disable

dove "modulo" è il modulo da disabilitare (con l'eventuale ulteriore percorso). Nel caso lo si volesse riattivare bisogna cambiare nuovamente l'estensione (invertendo la posizione dei due percorsi nell'istruzione sopra).

Si passa quindi al file di configurazione di php, php.ini; in realtà, se guardate la directory php5, ne troverete ben 3 di file, uno per ognuna delle sottodirectory "fpm", "cgi", "cli". Il php.ini nella cartella cli è quello usato quando php è richiamato dalla linea di comando, quello in cgi probabilmente non è neanche usato (e richiamato da applicazioni generiche), mentre quello collegato all'esecuzione di nginx lo si trova nella sottodirectory "fpm". Quindi:

sudo nano /etc/php5/fpm/php.ini

e si modificano quattro righe settando i valori da Off ad On:

expose_php=Off
display_errors=Off

allow_url_fopen=Off
allow_url_include=Off

così facendo si impedisce la visualizzazione delle informazioni relative alla versione di php usata, agli errori e l'esecuzione remota di codice. Inoltre è buona cosa assicurarsi che sia attivo il logging degli errori:

log_errors=On

E per il momento è abbastanza... I consigli come quello di usare password diverse e non banali, evitare i nome utenti come "admin", cambiare periodicamente le password, non render pubblico l'indrizzo del vostro servizio di dns dinamico e tutto il resto, sembrano quasi scontati...