Utilizzare Postfix con Gmail

Dopo vari tentativi di inviare notifiche via e-mail tramite Postfix, risultati vani, sono riuscito ad ottenere una configurazione perfettamente funzionante utilizzando Gmail come relay host. Infatti, l’invio in modalità diretta di e-mail dall’SMTP Server Postfix verso caselle di posta in Internet viene in genere bloccato dalla destinazione, in quanto il server Postfix – configurato all’interno di una rete locale casalinga collegata ad Internet con indirizzi IP dinamici – non viene riconosciuto come un server di posta sicuro. In altri termini come un potenziale server di spam.

Ho dunque utilizzato il server SMTP di Gmail, superando – con la configurazione che segue – alcuni noti problemi documentati in Internet (tra i quali il problema “Must issue a STARTTLS command first”).

Riporto dunque le uniche righe di configurazione che devono comparire all’interno del file main.cf posto in /etc/postfix e precisamente:

inet_protocols = ipv4
smtp_use_tls = yes
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtpd_tls_cert_file = /etc/ssl/certs/ssl-cert-snakeoil.pem
smtpd_tls_key_file = /etc/ssl/private/ssl-cert-snakeoil.key
smtp_sasl_security_options =
relayhost = [smtp.gmail.com]:587
smtpd_sasl_auth_enable = yes
smtpd_sasl_security_options =
smtpd_recipient_restrictions = permit_mynetworks permit_inet_interfaces

Come è facile intuire, la riga relayhost indica appunto il relay host di Gmail e la porta sulla quale eseguire l’autenticazione.

E’ inoltre necessario che il file sasl_password posto nella directory /etc/postfix contenga un’unica riga con user-id e password per l’autenticazione al server SMTP:

[smtp.gmail.com]:587 nome.cognome@gmail.com:password

Per quanto riguarda la password, ho utilizzato una password per applicazioni generata all’interno del mio account Gmail.

Riavviate il server e tutto funzionerà perfettamente.

Linux backup: fstab, rsync e crontab

In questa piccola guida riassumo i passi necessari per implementare un sistema di backup automatico tra due NAS, effettuato con un server esterno Linux-based. Nel mio caso la configurazione vede interagire i seguenti tre sistemi:

  • un server Ubuntu Linux versione 12.10 montato su un Asus eeeBox B206
  • un NAS Buffalo LS-GL da 750 Gb
  • un NAS Buffalo LS-CHL-V2 da 1 Tb

L’utilizzo di un sistema esterno per effettuare i backup, anzichè le utility interne ai NAS, mi ha permesso un maggior controllo sui processi di backup rispetto a quanto offerto dalle applicazioni embedded.

Montare i NAS in modo permanente: fstab

Per montare i NAS in modo permanente, cioè in modo che ad ogni reboot del sistema Linux siano rimontati correttamente sul filesystem Linux, è necessario modificare il contenuto del file /etc/fstab con un qualunque editor. Prima però è necessario creare le directory di mount sul filesystem. Nel mio caso ho creato le seguenti due directory sotto la directory /mnt:

dr-xr-xr-x 2 root root 0 gen 21 08:00 discovery
drwxrwxrwx 2 root root 0 gen 21 08:03 voyager

Alla directory ‘voyager’ ho settato i permessi di full-control (0777) mentre per ‘discovery’ ho settato soltanto i permessi in lettura ed esecuzione (0555) in quanto essa rappresenta una condivisione in sola lettura, sorgente dalla quale effettuare il backup verso ‘voyager’.

sudo chmod 777 /mnt/voyager
sudo chmod 555 /mnt/discovery

A questo punto si edita il file /ect/fstab. Nel mio caso preferisco utilizzare jed, un editor con un minimo di interfaccia. Importante è ricordarsi il comando ‘sudo’, che permette di acquisire temporaneamente i diritti di root (tutti i files in /etc richiedono infatti speciali permessi per essere gestiti):

sudo jed /etc/fstab

Senza modificare alcuna riga già presente, ho inserito in coda al file le seguenti righe:

//192.168.1.32/share /mnt/discovery cifs guest,ro,nounix,file_mode=0555,dir_mode=0555 0 0
//192.168.1.33/share /mnt/voyager cifs guest,rw,nounix,file_mode=0777,dir_mode=0777 0 0

Le due righe aggiunte mappano gli indirizzi di rete delle cartelle ‘share’ condivise dai NAS sulle due directory menzionate in precedenza. Si noti in particolare:

  • il parametro cifs che indica una cartella remota basata su protocollo smb
  • l’opzione guest specifica il collegamento senza richiesta password
  • le opzioni ro e rw che indicano un filesystem montato in sola lettura o in lettura e scrittura
  • l’opzione nounix che disattiva la sincronizzazione dei permessi, trattando i NAS similmente a quanto accade quando si accede ad essi dai sistemi operativi Windows
  • l’opzione file_mode e dir_mode coerenti con i permessi già settati sulle directory montate in precedenza

In tal modo, si montano correttamente le cartelle condivise in rete dai NAS all’interno del filesystem Linux, superando quei tipici conflitti tra protocollo cifs e gestione dei permessi Linux: infatti ogni sistema vorrebbe fare – nativamente – a modo suo, compromettendo in tal modo la compatibilità funzionale tra i due ambienti.

Senza riavviare il sistema, si può far rileggere la configurazione di fstab con il seguente comando:

sudo mount -a

Per una verifica dei filesystem montati è possibile eseguire semplicemente il comando senza alcuna opzione, ottenendo nelle righe finali dell’output anche i due mount aggiunti in fstab:

//192.168.1.32/share on /mnt/discovery type cifs (ro)
//192.168.1.33/share on /mnt/voyager type cifs (rw)

Come si può vedere, il filesystem /mnt/discovery è stato montato in sola lettura (ro) mentre /mnt/voyager è montato in lettura e scrittura. Se si vuole, invece, verificare il dettaglio dei filesystem montati, è possibile visualizzarne tutti i parametri di mounting col seguente comando:

cat /proc/mounts

Individuare ed eseguire le procedure di backup: rsync

Prima di schedulare il backup, in modo che venga eseguito automaticamente, è necessario individuare correttamente il comando che deve essere eseguito per copiare il contenuto di una cartella sorgente in una cartella destinazione. Il tool utilizzato per sincronizzare directory è rsync, con l’opzione -nv fin quando si fanno le prove: in tal modo non viene copiato nulla (parametro n) e l’output viene comunque visualizzato a schermo (opzione v) in modo da verificare gli esiti del comando.

La sintassi base di rsync che ho utilizzato per eseguire il backup differenziale è la seguente:

rsync -ruv --delete-excluded /sorg/dir1/ /dest/dir2

Le opzioni hanno il seguente significato:

  • il parametro r indica l’esecuzione ricorsiva su tutte le sottodirectory
  • il parametro u indica l’esecuzione in modalità update: se un file esiste già nella destinazione non viene sottoposto a copia
  • il parametro v indica un output esplicito delle operazioni effettuate: si vedrà a video tutto ciò che viene eseguito
  • il parametro –delete-excluded indica la cancellazione di quei file esistenti nella destinazione che non sono presenti nella sorgente, compreso i files esclusi dall’elaborazione

E’ inoltre importante ricordarsi di inserire il backslash “/” dopo l’indirizzo sorgente, altrimenti la directory non viene correttamente interpretata in quanto tale. E’ chiaro che fin quando si effettueranno delle prove, andrà inserito pure il citato parametro “n” (cioè indicando l’opzione -ruvn).

Se è necessario escludere alcuni files, si può utilizzare il parametro “–exclude”. Nel mio caso, per non copiare i files nascosti (ad esempio i noiosissimi file ‘.DS_Store’ di OSX), ho esteso il comando nel seguente modo:

rsync -ruv --delete-excluded --exclude='.*' /sorg/dir1/ /dest/dir2

Nel mio caso, il comando individuato per effettuare il mio backup è stato dunque il seguente:

rsync -ruv –delete-excluded –exclude=’.*’ /mnt/discovery/docs/ /mnt/voyager/bkpdocs

Il comando copia l’intero contenuto della directory docs’ sul NAS sorgente (discovery) all’interno della directory ‘bkpdocs’ sul NAS destinazione (voyager). Il backup è di tipo differenziale: vengono apportate, sul sistema destinatario, solo le modifiche. E’ importante ricordare che le citate directory, stando al comando di mount fatto in precedenza, risiedono sui due NAS all’interno delle cartelle condivise ‘share’, che tuttavia non compaiono nel comando in quanto già mappate rispettivamente in /mnt/discovery e in /mnt/voyager.

Schedulare il backup: crontab

L’ultimo passo è quello di schedulare il backup, cioè far sì che sia il sistema Linux che periodicamente esegue il backup tra i due sistemi.

Nel mio caso ho deciso di effettuare il backup differenziale ogni notte alle ore 2:00, ritenendo che in quel momento tutti i sistemi non lavorino per altri scopi. Effettuando un backup giornaliero, la massima perdita dati è di un giorno, rischio ritenuto dal sottoscritto sufficiente.

La schedulazione del backup avviene modificando il file /etc/crontab con un qualunque editor. Nel mio caso preferisco utilizzare sempre jed. Importante è ricordarsi sempre il comando ‘sudo’, che permette di acquisire temporaneamente i diritti di root.

sudo jed /etc/crontab

Senza modificare alcuna riga già presente, ho inserito in coda al file la seguente riga:

00 2    * * *   root    rsync -ruv –delete-excluded –exclude=’.*’ /mnt/discovery/docs/ /mnt/voyager/bkpdocs

I parametri hanno il seguente significato:

  • le prime cinque colonne stabiliscono la periodicità di esecuzione del comando. Nel mio caso 00 2 * * * indica le 2:00 di notte di qualsiasi giorno della settimana.
  • il parametro root indica con quali autorizzazioni deve essere eseguito il comando
  • infine, il resto della riga, rappresenta il comando che deve essere eseguito

Una volta editato e salvato il file, la configurazione è già attiva.

Per comodità, è possibile redirezionare l’output su un file oppure inviarlo su una mail. Nel mio caso ho preferito la seconda opzione, installando Postfix e modificando il comando in crontab nel seguente modo:

00 2    * * *   root    rsync -ruv –delete-excluded –exclude=’.*’ /mnt/discovery/docs/ /mnt/voyager/bkpdocs | mail -s “Backup Log” mario.rossi@gmail.com

Chiaramente, al posto di mario.rossi@gmail.com, ho inserito l’e-mail desiderata.