Home Contact Download

asyd.net

Welcome to Bruno Bonfils's (aka asyd homepage).

Objectifs

Dans cet exemple, les objectifs sont les suivants :

  • Multidomaines entrant
  • Utilisateur unique1)
  • Utilisation de Cyrus pour le délivrement du courrier
  • Protection anti spam via dspam
  • Transfert entre les différents éléments via LMTP2)

Vue d'ensemble

cyrus_dspam.jpg

Discussion

  1. Postfix recoit le message
  2. Il délivre le message à dspam (via la directive mailbox_transport) en LMTP via une socket de type unix
  3. Dspam ouvre une connexion (toujours en LMTP/socket unix) avec Cyrus pour lui demander s'il peut effectivement délivrer le courrier en traitement (typiquement s'il l'utilisateur existe)
  4. Dspam envoie le mail à clamav
  5. Dspam traite le message
  6. Dspam délivre le courrier à Cyrus
  7. Cyrus stocke finalement le message dans son backend

Configuration

Postfix

main.cf

# local_recipient_maps =
virtual_alias_maps = hash:/etc/postfix/virtual

# Delivery to DSPAM
mailbox_transport = lmtp:unix:/var/run/dspam/dspam.sock

# Transport map (used for dspam-spam and dspam-ham delivery)
transport_maps = hash:/etc/postfix/transport

mailbox_transport

C'est la directive qui détermine comment postfix traitera les courriers pour les utilisateurs locaux. Dans ce cas, il délivrera le message en utilisant le protocole LMTP via une socket de type unix.

transport_maps

FIXME

virtual_alias_maps

La virtual_alias_maps me permet de définir des alias du genre :

bruno@asyd.net                           asyd@asyd.net
bbonfils@asyd.net                        asyd@asyd.net
asyd@solaris-fr.org                      asyd@asyd.net

En effet, dspam (du moins la version que j'utilise) le nom complet (user@domain.tld) comme identifiant. Si une seule même personne (en l'occurence moi dans l'exemple !) possède plusieurs adresses pour une même boîte, il y aura autant d'utilisateurs dspam, ce qui n'est pas voulou.

De plus, dans le cas d'utilise multidomaine de cyrus, le même problème se poserait. C'est pourquoi les alias se font au niveau du MTA.

A propos de local_recipients_maps

Postfix utilise cette map pour savoir dès le début d'une connexion SMTP (au RCTP TO: pour être exact) si l'utilisateur existe réllement. Dans le cas d'utilisateur virtuels vous avez deux solutions :

  • ne pas définir de recipient_map, la partie LMTP de dspam semblant bien écrite,

il ne traitera pas un message s'il ne peut pas le délivrer au MDA final (ici cyrus)

  • définir votre propre map
    • map SQL
    • map LDAP
    • fichier

Chaque solution à ses avantages/inconvénients, à vous d'estimer quelle solution utiliser.

Dspam

DeliveryHost        /var/imap/socket/lmtp
DeliveryPort        24
DeliveryProto       LMTP
DeliveryIdent       localhost

EnablePlusedDetail      on

OnFail error

Trust root
Trust mail
Trust mailnull
Trust smmsp
Trust daemon
Trust webservd
Trust asyd
Trust dspam

Debug *
DebugOpt process spam fp

TrainingMode teft
TestConditionalTraining on
Feature chained
Feature whitelist
Algorithm graham burton
PValue graham

Preference "spamAction=quarantine"
Preference "signatureLocation=headers"  # 'message' or 'headers'
Preference "showFactors=on"
Preference "spamAction=tag"
Preference "spamSubject=SPAM"

AllowOverride trainingMode
AllowOverride spamAction spamSubject
AllowOverride statisticalSedation
AllowOverride enableBNR
AllowOverride enableWhitelist
AllowOverride signatureLocation
AllowOverride showFactors
AllowOverride optIn optOut
AllowOverride whitelistThreshold

HashRecMax              100000
HashAutoExtend          on
HashMaxExtents          0
HashExtentSize          50000
HashMaxSeek             100
HashConnectionCache     10

Notifications   off

PurgeSignatures 14          # Stale signatures
PurgeNeutral    90          # Tokens with neutralish probabilities
PurgeUnused     90          # Unused tokens
PurgeHapaxes    30          # Tokens with less than 5 hits (hapaxes)
PurgeHits1S     15          # Tokens with only 1 spam hit
PurgeHits1I     15          # Tokens with only 1 innocent hit
LocalMX 127.0.0.1

SystemLog on
UserLog   on
Opt out

ClamAVPort      3310
ClamAVHost      127.0.0.1
ClamAVResponse  accept

ServerQueueSize 32
ServerPID              /var/run/dspam/dspam.pid
ServerMode standard
ServerParameters        "--deliver=innocent -d %u"
ServerIdent             "lei.asyd.net"
ServerDomainSocketPath  "/var/run/dspam/dspam.sock"

ClientHost      /var/run/dspam/dspam.sock

Cyrus

imapd.conf

configdirectory: /var/imap
partition-default: /var/spool/imap
sieveusehomedir: true
hashimapspool: false

admins: cyrus

sasl_pwcheck_method: saslauthd

tls_cert_file: /etc/ssl/certs/asyd.pem
tls_key_file: /etc/ssl/private/mail.key
tls_cacert_file: /etc/ssl/certs/cacert.pem

master.conf

START {
  recover       cmd="ctl_cyrusdb -r"

}

# UNIX sockets start with a slash and are put into /var/imap/socket
SERVICES {
  # add or remove based on preferences
  imap          cmd="imapd"    listen="127.0.0.1:imap" prefork=0
  pop3s         cmd="pop3d -s" listen="pop3s" prefork=0
  lmtpunix      cmd="lmtpd"    listen="/var/imap/socket/lmtp" prefork=0
}

EVENTS {
  # this is required
  checkpoint    cmd="ctl_cyrusdb -c" period=30

  # this is only necessary if using duplicate delivery suppression,
  # Sieve or NNTP
  delprune      cmd="cyr_expire -E 3" at=0400

  # this is only necessary if caching TLS sessions
  tlsprune      cmd="tls_prune" at=0400
}
1) l'utilisateur asyd@domaine.tld est le même que l'utilisateur asyd@autredomaine.tld
2) via des sockets Unix