venerdì 10 ottobre 2014

Condivsione Mailbox - Dovecot - Postfix - Roundcube

Come al solito mi trovo a scrivere un post per "memorizzare" in un posto sicuro quanto fatto...
 
Mi sono inbattuto nella richiesta di creare una condivisione, tra utenti (mail) diversi, di alcuna cartelle di uno specifico account.
 
In poche parole, alcune cartelle dell'account mail share@example.com devono essere "visibili" nella gerarchia degli account user_a@example.com e user_b@example.com.
Inoltre, la condivisione deve essere regolare da alcuni permessi, nel senso che gli utenti user_a e user_b non possono fare tutto, ma solo quello che gli viene permesso.
 
Detto questo, che non è poco, la situaizone di partenza è la seguente:
  • Sistema Operativo Server Mail: Ubuntu 12.04
  • Server Mail: Dovecot + Postfix
  • Database: MySql
  • Amministrazione Domini e Account Mail : PostfixAdmin
  • Sicurezza server: Clamav  + AmavisD
  • Antispam: Spamassassin
  • WebMail: Horde groupware
  • Client mail: MS Outlook 2010

Il primo approccio che ho avuto, per risolvere tale richiesta, è stato quello di fare in link "brutale" dall'account share@example.com all'account user_a@example.com rendendo così disponibile la cartella in questione.
Mah... Mi sembrava e mi sembra tutt'ora una soluzione assurda. Ci sono problemi di permessi di scrittura, di permessi di gestione (user_a alla fine può fare tutto sulla directory condivisa) e di sicurezza.
 
Mi sono quindi messo a studiare la funzione di SHARE MAILBOX presente in modo nativo nelle release di dovecot.
 
E devo dire che non è male..
 
Di seguito quanto è stato fatto.
 
DI COSA ABBIAMO BISOGNO
 
L'obiettivo è quello di realizzare la condivisione di un'account mail (o parte di esso) utilizzando Namespaces e ACL in dovecot, che garantiscono sicurezza e privacy nella loro gestione.
Dovecot ha bisogno di sapere quale mailbox è condivisisa e con chi è condivisa.
Visto che nell'installazione del server mail ho salvato tutte le definizioni degli account mail in un database MySql, userò lo stesso database per salvare il dizionario delle condivisioni (Dictionary).
Per ulteriori informazioni su Namespaces potete leggere il WIKI di dovecot.
 
NAMESPACES
Prima di tutto andiamo a definire i Namespaces (letteralmente spazi dei nomi). I tipi di namespaces disponibili in dovecot sono:
  1. Private
  2. Shared
  3. Public
A noi serve configurare i primi 2, in quanto non siamo interessati alla creazione di una condivisione pubblica.
 
N.B: nelle distro ubunti, i file di configurazione di dovecot sono splittati in più file nella directory /etc/dovecot e /etc/dovecot/conf.d
 
Editiamo quindi il file /etc/dovecot/conf.d/10-mail.conf e aggiungiamo le seguenti linee:
 
namespace {
  type = private
  separator = /
  prefix =
  #location defaults to mail_location.
  inbox = yes
}
 
namespace {
  type = shared
  separator = /
  prefix = shared/%%u/
  location = maildir:%%h/Maildir:INDEX=~/Maildir/shared/%%U
  inbox = yes
}
 
In questo modo abbiamo creato 2 spazi: uno privato per il proprietario della mail box e uno condiviso che stabilisce come verranno visualizzate le cartelle condivise nella gerarchia degli altri utenti.
Riavviando il servizio di dovecot, la condivisione delle utenze mail si avvia, ma senza ACL (Access Control List) tutti possono leggere tutto. E non è quello che vogliamo.
 
ACLs
 
Per attivare le ACL (Access Control List) editiamo il file /etc/dovecot/conf.d/10-mail.conf  e inseriamo la seguente stringa:
 
mail_plugin = acl
 
In tal modo diciamo a dovecot che deve caricare tale plugin durante la sua esecuzione.
Passiamo poi a settare il backend delle ACL
 
Alla pagina ACL trovate gli approfondimenti del caso nel wiki ufficiale di dovecot per la gestione delle ACL.
 
Editiamo il file /etc/dovecot/conf.d/90-acl.conf  e inseriamo:
 
plugin {
  acl = vfile
}
 
plugin {
 acl_shared_dict = proxy::acl
}
 
dict {
 acl = mysql:/etc/dovecot/dovecot-dict-sql.conf
}
 
IMAP ACL COMMAND
 
Per far si che il tutto funzioni in modo regolare, è necessario abilitare in dovecot la possibilità di utilizzare i comandi nativi imap.
 
Per fare ciò, editiamo il file /etc/dovecot/conf.d/20-imap.conf e aggiungiamo la stringa:
 
mail_plugins = $mail_plugins imap_acl
 
In questo modo diciamo a dovecot di caricare, oltre ai plugin contenuti nella variabile $mail_plugin anche il plugin imap_acl che abilita la possibilità di utilizzare i comandi imap.
 
Potete visualizzare il documento RFC 4314 per ulteriori dettagli sui comandi imap.
 
DICTIONARY
 
Passiamo ora alla configurazione dei dizionari delle condivisioni. Per prima cosa attiviamo il servizio dictionary.
Editiamo il file /etc/dovecot/conf.d/10-master.conf e inseriamo:
 
service dict{
 unix_listener dict{
  mode = 0600
  user = vmail
  group = mail
}
 
Aggiungiamo poi le seguenti linee nel file /etc/dovecot/dovecot-dict-sql.conf:
 
map {
  pattern = shared/shared-boxes/user/$to/$from
  table = user_shares
  value_field = dummy
  fields {
   from_user = $from
   to_user = $to
   }
}

map {
  pattern = shared/shared-boxes/anyone/$from
  table = anyone_shares
  value_field = dummy
  fields {
   from_user = $from
  }
}
 
Attenzione: all'inizio di questo file occorre decommentare il comando di connessione al vostro DB mysql e compilarlo con le info corrette per permetterne la connessione.
 
DATABASE
 
Nel vostro database di gestione delle mail, create queste 2 nuove tabelle:
 
CREATE TABLE user_shares (
  from_user varchar(100) not null,
  to_user varchar(100) not null,
  dummy char(1) DEFAULT '1',    -- always '1' currently
  primary key (from_user, to_user)
);
COMMENT ON TABLE user_shares IS 'User from_user shares folders to user to_user.';

CREATE INDEX to_user
ON user_shares (to_user); -- because we always search for to_user

CREATE TABLE anyone_shares (
  from_user varchar(100) not null,
  dummy char(1) DEFAULT '1',    -- always '1' currently
  primary key (from_user)
);
COMMENT ON TABLE anyone_shares IS 'User from_user shares folders to anyone.';
 
Riavviate il servizio dovecot => root@mailsrv: service dovecot restart
 
Ora tutto è pronto per poter condividere cartelle mail di un account email con un'altro account email.
In sintesi il procedimento da fare è il seguente:
  1. Aggiungere nella tabella user_share (precedentemente creata) un record con le informazione dell'account da condividere, dell'account con cui condividere.
  2. Aggiungere un file dovecot-acl all'interno della directory della cartella che si vuole condividere contenente una informazione del tipo: user_a @ example.com lrw che sta ad indicare che tale cartella dell'account mail è condicisa con l'utente user_a che ha i diritti di vedere la cartella condivisa (l), di leggerne il contenuto (r) e di scrivere al suo interno (w). Occorre poi procedere a riavviare dovecot per far si che tali modifiche diventino operative.
Ovviamente, è una strada piena di insidie e poco praticabile.
Ho quindi optato per l'installazione di una webamil (Rouncube) che all'interno del suo pacchetto di installazione ha già preconfigurato un plugin di nome acl per la gestione della condivisione delle caselle mail.
 
ROUNDCUBE
 
Procediamo ad installare Roundcube sul nostro server Ubuntu, tramite il comando
 
apt-get install roundcube roundcube-plugins roundcube-plugins-extra
 
che installerà il pacchetto completo del programma di webmail.
Durante l'installazione vi verrà chiesto di configurare i parametri per la connessione al database mysql.
 
Una volta finito il processo di installazione procediamo alla configurazione:
 
Editiamo il file /var/lib/roundcube/config/main.inc.php e settiamo i due seguenti valori:
 
$rcmail_config['default_host'] = 'localhost';
$rcmail_config['plugins'] = array('acl');
 
fatto questo, se tutto è andato per il verso giusto, potete loggarvi sull'account mail da condividere, nelle impostazioni dello stesso, avere la possibilità di gestire la condivisione dei permessi di accesso per i vari utenti con cui si condivide la mail.