L'interprete Sieve e il server Dovecot ManageSieve

4 ottobre 2014 Roberto Puzzanghera6 commenti

Il progetto Pigeonhole fornisce il supporto Sieve a livello di plugin per il Local Delivery Agent (LDA) di Dovecot e anche per suo servizio LMTP. Il plugin è un interprete Sieve che filtra i messaggi in arrivo usando uno script scritto in linguaggio Sieve. Lo script Sieve è fornito dall'utente e, con il suo utilizzo, l'utente può personalizzare come i messaggi in arrivo sono trattati. I messaggi possono essere spediti a una cartella specifica, reindirizzati, rispediti al mittente, scartati, etc.

Il Server Dovecot Managesieve è un servizio per gestire la collezione di script Sieve dell'utente.

La versione testata al momento della scrittura di questa pagina è la 0.4.3. E' consigliabile testare quanto sotto con l'ultima versione rilasciata.

cd /usr/local/src
wget http://pigeonhole.dovecot.org/releases/2.2/dovecot-2.2-pigeonhole-0.4.3.tar.gz
chown -R root.root dovecot-2.2-pigeonhole-0.4.3
cd dovecot-2.2-pigeonhole-0.4.3

# the program has to find the dovecot-config file in/usr/local/dovecot/lib/dovecot/
./configure \
        --prefix=/usr/local/dovecot-pigeonhole \
        --with-dovecot=/usr/local/dovecot/lib/dovecot/
make
make install

cd /usr/local
mv /usr/local/dovecot-pigeonhole /usr/local/dovecot-2.2-pigeonhole-0.4.0
ln -s /usr/local/dovecot-2.2-pigeonhole-0.4.0 /usr/local/dovecot-pigeonhole

Configurazione

cd /usr/local/dovecot/etc/dovecot/conf.d
cp -p ../../../share/doc/dovecot/example-config/conf.d/20-managesieve.conf .
cp -p ../../../share/doc/dovecot/example-config/conf.d/90-sieve.conf .

Ora abilitare (se non è già stato fatto) il plugin nel file 15-lda.conf

protocol lda {
  mail_plugins = $mail_plugins sieve
}

e modificare il file conf.d/20-managesieve.conf secondo le proprie esigenze. Questo è il file che funziona per me e che si trova nella tarball:

##
## ManageSieve specific settings
##

# Uncomment to enable managesieve protocol:
protocols = $protocols sieve

# Service definitions

service managesieve-login {
  inet_listener sieve {
    port = 4190
  }

  #inet_listener sieve_deprecated {
  #  port = 2000
  #}

  # Number of connections to handle before starting a new process. Typically
  # the only useful values are 0 (unlimited) or 1. 1 is more secure, but 0
  # is faster. <doc/wiki/LoginProcess.txt>
  service_count = 1

  # Number of processes to always keep waiting for more connections.
  #process_min_avail = 0

  # If you set service_count=0, you probably need to grow this.
  vsz_limit = 64M
}

service managesieve {
  # Max. number of ManageSieve processes (connections)
  #process_limit = 1024
}

# Service configuration

protocol sieve {
  # Maximum ManageSieve command line length in bytes. ManageSieve usually does
  # not involve overly long command lines, so this setting will not normally
  # need adjustment
  #managesieve_max_line_length = 65536

  # Maximum number of ManageSieve connections allowed for a user from each IP
  # address.
  # NOTE: The username is compared case-sensitively.
  #mail_max_userip_connections = 10

  # Space separated list of plugins to load (none known to be useful so far).
  # Do NOT try to load IMAP plugins here.
  #mail_plugins =

  # MANAGESIEVE logout format string:
  #  %i - total number of bytes read from client
  #  %o - total number of bytes sent to client
  #managesieve_logout_format = bytes=%i/%o

  # To fool ManageSieve clients that are focused on CMU's timesieved you can
  # specify the IMPLEMENTATION capability that Dovecot reports to clients.
  # For example: 'Cyrus timsieved v2.2.13'
  #managesieve_implementation_string = Dovecot Pigeonhole

  # Explicitly specify the SIEVE and NOTIFY capability reported by the server
  # before login. If left unassigned these will be reported dynamically
  # according to what the Sieve interpreter supports by default (after login
  # this may differ depending on the user).
  #managesieve_sieve_capability =
  #managesieve_notify_capability =

  # The maximum number of compile errors that are returned to the client upon
  # script upload or script verification.
  #managesieve_max_compile_errors = 5

  # Refer to 90-sieve.conf for script quota configuration and configuration of
  # Sieve execution limits.
}

 

Ora modificare il file conf.d/90-sieve.conf. Queste impostazioni funzionano per me (questo file dovrebbe essere anche nell tua directory di configurazione se hai scaricato la mia tarball):

##
## Settings for the Sieve interpreter
##

# Do not forget to enable the Sieve plugin in 15-lda.conf and 20-lmtp.conf
# by adding it to the respective mail_plugins= settings.

plugin {
  # The path to the user's main active script. If ManageSieve is used, this the
  # location of the symbolic link controlled by ManageSieve.
  sieve=~/.sieve/dovecot.sieve

  # The default Sieve script when the user has none. This is a path to a global
  # sieve script file, which gets executed ONLY if user's private Sieve script
  # doesn't exist. Be sure to pre-compile this script manually using the sievec
  # command line tool.
  # --> See sieve_before fore executing scripts before the user's personal
  #     script.
  #sieve_default = /var/lib/dovecot/sieve/default.sieve

  # Directory for :personal include scripts for the include extension. This
  # is also where the ManageSieve service stores the user's scripts.
  sieve_dir = ~/.sieve

  # Directory for :global include scripts for the include extension.
  #sieve_global_dir =

  # Path to a script file or a directory containing script files that need to be
  # executed before the user's script. If the path points to a directory, all
  # the Sieve scripts contained therein (with the proper .sieve extension) are
  # executed. The order of execution within a directory is determined by the
  # file names, using a normal 8bit per-character comparison. Multiple script
  # file or directory paths can be specified by appending an increasing number.
  #sieve_before =
  #sieve_before2 =
  #sieve_before3 = (etc...)
  sieve_before = /usr/local/dovecot/etc/sieve/

  # Identical to sieve_before, only the specified scripts are executed after the
  # user's script (only when keep is still in effect!). Multiple script file or
  # directory paths can be specified by appending an increasing number.
  #sieve_after =
  #sieve_after2 =
  #sieve_after2 = (etc...)

  # Which Sieve language extensions are available to users. By default, all
  # supported extensions are available, except for deprecated extensions or
  # those that are still under development. Some system administrators may want
  # to disable certain Sieve extensions or enable those that are not available
  # by default. This setting can use '+' and '-' to specify differences relative
  # to the default. For example `sieve_extensions = +imapflags' will enable the
        # deprecated imapflags extension in addition to all extensions were already
  # enabled by default.
  #sieve_extensions = +notify +imapflags
  sieve_extensions = +spamtest +spamtestplus +relational +comparator-i;ascii-numeric

  # Which Sieve language extensions are ONLY available in global scripts. This
  # can be used to restrict the use of certain Sieve extensions to administrator
  # control, for instance when these extensions can cause security concerns.
  # This setting has higher precedence than the `sieve_extensions' setting
  # (above), meaning that the extensions enabled with this setting are never
  # available to the user's personal script no matter what is specified for the
  # `sieve_extensions' setting. The syntax of this setting is similar to the
  # `sieve_extensions' setting, with the difference that extensions are
  # enabled or disabled for exclusive use in global scripts. Currently, no
  # extensions are marked as such by default.
  #sieve_global_extensions =

  # The Pigeonhole Sieve interpreter can have plugins of its own. Using this
  # setting, the used plugins can be specified. Check the Dovecot wiki
  # (wiki2.dovecot.org) or the pigeonhole website
  # (http://pigeonhole.dovecot.org) for available plugins.
        # The sieve_extprograms plugin is included in this release.
  #sieve_plugins =

  # The separator that is expected between the :user and :detail
  # address parts introduced by the subaddress extension. This may
  # also be a sequence of characters (e.g. '--'). The current
  # implementation looks for the separator from the left of the
  # localpart and uses the first one encountered. The :user part is
  # left of the separator and the :detail part is right. This setting
  # is also used by Dovecot's LMTP service.
  #recipient_delimiter = +

  # The maximum size of a Sieve script. The compiler will refuse to compile any
  # script larger than this limit. If set to 0, no limit on the script size is
  # enforced.
  #sieve_max_script_size = 1M

  # The maximum number of actions that can be performed during a single script
  # execution. If set to 0, no limit on the total number of actions is enforced.
  #sieve_max_actions = 32

  # The maximum number of redirect actions that can be performed during a single
  # script execution. If set to 0, no redirect actions are allowed.
  #sieve_max_redirects = 4

  # The maximum number of personal Sieve scripts a single user can have. If set
  # to 0, no limit on the number of scripts is enforced.
  # (Currently only relevant for ManageSieve)
  #sieve_quota_max_scripts = 0

  # The maximum amount of disk storage a single user's scripts may occupy. If
  # set to 0, no limit on the used amount of disk storage is enforced.
  # (Currently only relevant for ManageSieve)
  #sieve_quota_max_storage = 0
}

 

Ora riavviare dovecot

dovecotctl restart

Impostazione dei file dot-qmail per abilitare Dovecot LDA e Sieve

Leggere questo per maggiori informazioni su come funzionano i file dot-qmail.

La cosa importante da capire è che se si vogliono usare le Sieve rules, vdelivermail non dovrà più avere in carico il recapito dei messaggi ma questo sarà un compito che dovrà essere assolto da Dovecot LDA. In altre parole, in ogni dominio dove si vuole abilitare le regole sieve si deve modificare  .qmail-default come segue:

|/var/qmail/bin/preline -f /usr/local/dovecot/libexec/dovecot/deliver -d $EXT@$USER

Naturalmente si può decidere di limitare le regole sieve solo a certi utenti, in questo caso è sufficiente ritoccare il file .qmail-utente nella cartella del dominio o nella cartella home dell'utente stesso.

Se si è deciso di abilitare sieve per default, si può sempre modificare /var/qmail/control/defaultdelivery a condizione che si lasci vuoto il file .qmail-default dei domini appena creati (basta rimuovere la prima riga, mai cancellare il file se non si vuole compromettere il funzionamento di vpopmail), anche se ciò non è una buona idea. Infatti, modificare defaultdelivery e svuotare .qmail-default comporta il rischio di mandare in confusione qmailadmin quando si elencano le mailing-lists, poichè una mailing-list "default" fittizia appare in qualche caso (per lo meno questo è ciò che ho osservato io :-). Ogni commento su questo sarebbe gradito.

Impostare una regola sieve anti-spam

Info: http://tools.ietf.org/html/rfc5235 - http://wiki2.dovecot.org/Pigeonhole/Sieve/Examples

Se si è deciso di far in modo che simscan lasci passare lo spam con un punteggio al di sotto di spam_hits (file qmail/control/simcontrol), sarà il caso di metterlo nella cartella Spam. In tal caso sieve eseguirà uno script prima di processare gli script degli utenti cosicchè i messaggi di spam saranno scartati o spostati in Spam e le altre regole ignorate.

Prima di tutto creiamo una cartella dove salvare i nostri script globali e assegnamo all'utente vpopmail i privilegi di scrittura in questa cartella:

cd /usr/local/dovecot/etc/dovecot
mkdir sieve
chown -R vpopmail.vchkpw sieve

Modifichiamo conf.d/90-sieve.conf per abilitare le estensioni necessarie di sieve e caricare lo script che vogliamo eseguire prima di quelli dell'utente:

sieve_extensions = +spamtest +spamtestplus +relational +comparator-i;ascii-numeric
sieve_before = /usr/local/dovecot/etc/dovecot/sieve/

Ora creiamo lo script /usr/local/dovecot/etc/dovecot/sieve/move-spam.sieve (l'estensione deve essere .sieve altrimenti il file sarà ignorato):

require ["fileinto"];
if anyof (header :contains "X-Spam-Flag" "YES")
{
 fileinto "Junk";
}
/* Other messages get filed into INBOX */

Ogni volta che si modificano i file globali si deve pre-compilarli usando il programma sievec (maggiori info qui):

su vpopmail
cd /usr/local/dovecot/etc/dovecot/sieve
/usr/local/dovecot-pigeonhole/bin/sievec .

Test di managesieve

Prima di tutto controlliamo se il server risponde alla porta 4190 via telnet:

# telnet 0 4190

Trying 0.0.0.0...
Connected to 0.
Escape character is '^]'.
"IMPLEMENTATION" "Dovecot Pigeonhole"
"SIEVE" "fileinto reject envelope encoded-character vacation subaddress comparator-i;ascii-numeric relational regex imap4flags copy include variables body enotify environment mailbox date spamtest spamtestplus"
"NOTIFY" "mailto"
"SASL" "PLAIN LOGIN CRAM-MD5"
"STARTTLS"
"VERSION" "1.0"
OK "Dovecot ready."

Se si crea una sieve rule con il proprio client email (Mozilla Thunderbird ad esempio fornisce un add-on qui https://addons.mozilla.org/en-US/thunderbird/addon/2548/) o attraverso la webmail (leggere la prossima pagina riguardante Roundcube webmail), questo è ciò che si dovrebbe vedere nel log nel caso di un semplice filtro per redirect:

Oct 22 00:03:13 lda(test@yourdomain.net): Info: sieve: msgid=<c3445037f979a8cb793df1f858b7a4f9@somedomain.com>: forwarded to <someone@somewhere.net>

Commenti

Update Upload per questo pagina che comincia con un link Wrong

La pagina originale per upload del pluging è cambiata  va usata quella del sito ufficale del plugin pigeonhole su dovecot.org.

wget http://pigeonhole.dovecot.org/releases/2.2/dovecot-2.2-pigeonhole-0.4.3.tar.gz

Rispondi | Permalink

grazie dell'avviso

grazie dell'avviso, ora aggiorno :)

Rispondi | Permalink

Sbaglio o gli alias smettono di funzionare?

Ciao Roberto, apprezzo molto il tuo lavoro di documentazione per unire dovecot e vpopmail nel delivery locale delle email. Ma mi sbaglio o togliendo vdelivermail dal .qmail-default si perde la possibilità di gestire gli alias (valias) in quanto il delivery di dovecot non ne sa niente della loro esistenza?

Rispondi | Permalink

vpopmail e --enable-valias

Ciao Alessio, si l'ho notato anch'io. Ho scoperto però che si può ovviare al problema mettendo gli alias su mysql, ovvero compilando vpopmail con --enable-valias

Rispondi | Permalink

Io ho valias e non funziona,

Io ho valias e non funziona, solo vdelivermail sa se gli alias sono nel DB o nei file .qmail e se il delivery delle email lo fa dovecot-lda questa funzionalità è ignorata.

Sei sicuro che a te funzioni con valias? Chi dice a dovecot-lda di cercare e come cercare gli alias nel DB?

Rispondi | Permalink

Scusa la confusione

Scusa la confusione, ma è da un po' che non installo nuovi mail server.

Come ho scritto nella pagina di vpopmail:

--disable-valias Do not store aliases in MySQL, but as dot-qmail files. Note: it appears that dovecot-lda fails to deliver emails when valias is enabled.

Quindi è il contrario. dovecot-lda funziona senza valias. Ho infatti ricontrollato ed è cosi che sto compilando vpopmail

Rispondi | Permalink