Il file di configurazione principale è /etc/postfix/main.cf. Per vedere tutti i parametri di configurazione in uso (le impostazioni di default e quelle specificate) si esegue postconf(1). Per vedere solo le impostazioni modificate rispetto al default aggiungere l'opzione -n.
La stessa utility postconf(1) può essere usata per editare da riga di comando il file di configurazione.
Per mettere Postfix in ascolto su tutte le interfacce includere in /etc/postfix/main.cf:
inet_interfaces = all
La configurazione predefinita di Postfix è di consegnare la posta locale nella Unix mbox /var/mail/login, per utilizzare la $HOME/Maildir basta aggiungere in /etc/postfix/main.cf:
home_mailbox = Maildir/
Attenzione alla posta per root, se in /etc/aliases non viene definito un alias, Postfix decide di consegnarla a nobody che probabilmente non ha un home directory né una Maildir, pertanto va a finire in /var/mail/nobody.
Sempre in main.cf si imposta la dimensione massima della mailbox (file) e del singolo messaggio. Utilizzando le Maildir non ha molto senso la dimensione della mailbox perché non viene gestita come singolo file, pertanto si disabilita impostando zero:
mailbox_size_limit = 0 message_size_limit = 52428800
Per indicare a Postfix di effettuare la consegna locale tramite procmail si aggiunge la seguente direttiva in /etc/postfix/main.cf:
# Use procmail for local delivery. mailbox_command = /usr/bin/procmail
Per una configurazione minimale basta dichiarare l'elenco dei domini virtuali gestiti e memorizzare la mappa degli alias in un file Berkeley DB. Queste le direttive da mettere in /etc/postfix/main.cf:
virtual_alias_domains = virtual.domain1.com virtual.domain2.com virtual_alias_maps = hash:/etc/postfix/virtual_alias_maps
Il file virtual_alias_maps.db (l'estensione .db è sottointesa nel file di configurazione) viene compilato a partire dal file di testo virtual_alias_maps, di questo tipo:
user.name@virtual.domain1.com username1 user.name@virtual.domain2.com username2, username3 user.name@virtual.domain2.com email@other.host.com
La compilazione avviene con il il comando
postmap virtual_alias_maps
Una configurazione più complessa prevede che l'elenco dei domini sia in un file separato e l'elenco degli alias sia suddiviso in tanti file, uno per dominio.
virtual_alias_domains = /etc/postfix/virtual_alias_domains virtual_alias_maps = hash:/etc/postfix/virtual_alias_maps
L'elenco dei domini è un semplice file di testo /etc/postfix/virtual_alias_domains.
Gli alias per ogni dominio sono contenuti in altrettanti file di testo /etc/postfix/virtual_alias/*.map. Per assemblare tutti i virtual alias map in un unico DB Berkley si può usare il seguente Makefile:
all: virtual_alias_maps.db
virtual_alias_maps.in:
touch virtual_alias_maps.in
virtual_alias_maps.db: virtual_alias_domains virtual_alias/*.map virtual_alias_maps.in
@echo '#' > virtual_alias_maps.in
@echo '# WARNING!!! This file is auto-generated: do not edit!' >> virtual_alias_maps.in
@echo '# Edit instead .map files under virtual_alias directory and re-run the "make" command.' >> virtual_alias_maps.in
@echo '#' >> virtual_alias_maps.in
cat virtual_alias/*.map >> virtual_alias_maps.in
postmap virtual_alias_maps.in
mv virtual_alias_maps.in.db virtual_alias_maps.db
In questo caso l'aggiunta di un dominio richiede il reload di Postfix, mentre l'aggiunta di un alias richiede solo la ricompilazione del virtual_alias_maps.db.
Per abilitare il TLS bisogna anzitutto generare il certificato (autofirmato). L'installazione predefinita di Postfix usa il certificato /etc/ssl/certs/ssl-cert-snakeoil.pem e la corrispondente chiave /etc/ssl/private/ssl-cert-snakeoil.key, noi creeremo due file:
/etc/postfix/ssl/postfix.crt/etc/postfix/ssl/postfix.keyQuesto è uno script basato sull'analogo exim-gencert:
#!/bin/sh -e DIR=/etc/postfix/ssl CERT=$DIR/postfix.crt KEY=$DIR/postfix.key # valid for four years DAYS=1461 if [ [ -f $CERT ] && [ -f $KEY ]; then echo "[*] $CERT and $KEY exists!" exit 0 fi SSLEAY="$(tempfile -m600 -pexi)" cat > $SSLEAY <<EOM RANDFILE = $HOME/.rnd [ req ] default_bits = 1024 default_keyfile = postfix.key distinguished_name = req_distinguished_name [ req_distinguished_name ] countryName = Country Code (2 letters) countryName_default = US countryName_min = 2 countryName_max = 2 stateOrProvinceName = State or Province Name (full name) localityName = Locality Name (eg, city) organizationName = Organization Name (eg, company; recommended) organizationName_max = 64 organizationalUnitName = Organizational Unit Name (eg, section) organizationalUnitName_max = 64 commonName = Server name (eg. ssl.domain.tld; required!!!) commonName_max = 64 emailAddress = Email Address emailAddress_max = 40 EOM echo "[*] Creating a self signed SSL certificate for Postfix!" echo " Please enter the hostname of your MTA at the Common Name (CN) prompt!" echo " " openssl req -config $SSLEAY -x509 -newkey rsa:1024 -keyout $KEY -out $CERT -days $DAYS -nodes rm -f $SSLEAY chown root:postfix $KEY $CERT $DH chmod 640 $KEY $CERT $DH echo "[*] Done generating self signed certificates for postfix!"
Editare /etc/postfix/main.cf e impostare:
# TLS parameters smtpd_tls_security_level = may smtpd_tls_cert_file = /etc/postfix/ssl/postfix.crt smtpd_tls_key_file = /etc/postfix/ssl/postfix.key
Riavviare Postfix e verificare che il server annunci STARTTLS tra le opzioni disponibili:
server:~# telnet localhost 25 Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. 220 mail.rigacci.org ESMTP Postfix (Debian/GNU) EHLO test 250-mail.rigacci.org 250-PIPELINING 250-SIZE 20480000 250-VRFY 250-ETRN 250-STARTTLS 250-ENHANCEDSTATUSCODES 250-8BITMIME 250 DSN
Installare i pacchetti sasl2-bin e libsasl2-modules.
Attenzione: Debian fa girare Postfix in un chroot, quindi il socket di sasl2 deve stare in esso. Eventualmente Leggere le istruzioni in /usr/share/doc/sasl2-bin/README.Debian.gz.
Configurare /etc/default/saslauthd impostando:
START=yes OPTIONS="-c -m /var/spool/postfix/var/run/saslauthd"
Se si fanno girare altri clienti di saslauthd (ad esempio l'autenticazione Apache con libapache2-mod-authn-sasl conviene rendere raggiungibile il socket anche dal suo percorso tradizionale, con un symlink:
/etc/init.d/saslauthd stop rmdir /var/run/saslauthd ln -s /var/spool/postfix/var/run/saslauthd /var/run /etc/init.d/saslauthd start
Invece di PAM si potrebbe utilizzare direttamente il file /etc/shadow impostando l'opzione MECHANISMS=“shadow”, ma non c'è alcun reale vantaggio.
Poiché abbiamo spostato il socket nella chroot di postfix, informiamo il gestore dei pacchetti Debian:
dpkg-statoverride --add root sasl 710 /var/spool/postfix/var/run/saslauthd
Per vedere se l'opzione è stata attivata si usa dpkg-statoverride --list.
Testare il funzionamento del demone di autenticazione (l'utente che chiede l'autenticazione deve appartenere al gruppo sasl):
testsaslauthd -u myusername -p mypassword -f /var/spool/postfix/var/run/saslauthd/mux
ATTENZIONE! Il test usa il MECHANISMS di autenticazione SASL indicato in /etc/default/saslauthd (default PAM), non l'eventuale metodo authdaemond configurato in /etc/postfix/sasl/smtpd.conf. Quindi il test con indirizzo email come login non funziona.
Aggiungere l'utente postfix al gruppo sasl:
adduser postfix sasl
Configurare postfix mettendo in /etc/postfix/sasl/smtpd.conf
pwcheck_method: saslauthd mech_list: PLAIN LOGIN
Aggiungere nella configurazione principale /etc/postfix/main.cf
# Enable authentication via saslauthd. smtpd_sasl_auth_enable = yes # Set the service name passed to saslauthd. smtpd_sasl_local_domain =
Riavviare postfix con /etc/init.d/postfix restart.
Verificare che l'autenticazione sia annunciata, deve comparire la stringa AUTH LOGIN PLAIN:
telnet localhost 25 Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. 220 mail.rigacci.org ESMTP Postfix (Debian/GNU) EHLO test 250-mail.rigacci.org 250-PIPELINING 250-SIZE 20480000 250-VRFY 250-ETRN 250-STARTTLS 250-AUTH LOGIN PLAIN 250-ENHANCEDSTATUSCODES 250-8BITMIME 250 DSN
Per consentire il relay della posta agli utenti autenticati si aggiunge in /etc/postfix/main.cf:
smtpd_recipient_restrictions =
permit_sasl_authenticated,
...
reject_unauth_destination
Per richiedere obbligatoriamente l'uso della crittografia durante l'autenticazione, si aggiunge anche la direttiva (ATTENZIONE! in questo modo AUTH viene annunciato solo dopo STARTTLS):
smtpd_tls_auth_only = yes
Il parametro di cui sopra è implicito se si attiva smtpd_tls_security_level = encrypt.
Il demone saslauthd invece di utilizzare PAM può chiedere l'autenticazione al Courier Authdaemon.
Questo può tornare utile se è attiva l'autenticazione /etc/courier/userdb (per es. quando si usa l'indirizzo di posta elettronica come login); con una semplice configurazione anche Postfix può utilizzare Courier Authdaemon per l'autenticazione SMTP.
La configurazione è del tutto simile al caso PAM, cambia solo il file /etc/postfix/sasl/smtpd.conf:
pwcheck_method: authdaemond authdaemond_path: /var/run/courier/authdaemon/socket mech_list: PLAIN LOGIN
ATTENZIONE: Postfix (in Debian Lenny e Squeeze) gira in ambiente chroot (/var/spool/postfix/), così anche saslauthd; pertanto il socket di Authdaemon deve trovarsi in esso.
mkdir -p /var/spool/postfix/var/run/courier/authdaemon chmod 0750 /var/spool/postfix/var/run/courier/authdaemon chown daemon:daemon /var/spool/postfix/var/run/courier/authdaemon dpkg-statoverride --add daemon daemon 750 /var/spool/postfix/var/run/courier/authdaemon adduser postfix daemon
La directory authdaemon appartiene a daemon:daemon (almeno in Debian Lenny), nel nostro caso deve essere accessibile a saslauthd che viene eseguito da postfix.
Postfix troverà il socket di courier authdaemon nel suo chroot, chi cerca lo stesso socket nel path tradizionale lo troverà grazie ad un symlink:
/etc/init.d/courier-authdaemon stop cd /var/run/courier rm -r authdaemon ln -s /var/spool/postfix/var/run/courier/authdaemon authdaemon /etc/init.d/courier-authdaemon start
Per consegnare tutta la posta in uscita ad un relay SMTP si aggiunge in /etc/postfix/main.cf:
relayhost = smtp.example.org
Se lo smarthost richiede autenticazione con login e password questi sono i parametri necessari:
relayhost = smtp.example.org smtp_sasl_auth_enable = yes smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd smtp_sasl_mechanism_filter = plain, login smtp_sasl_security_options = smtp_tls_security_level = may
L'opzione smtp_tls_security_level definisce se deve essere usata una connessione TLS.
Le credenziali per l'autenticazione vanno messe nel file /etc/postfix/sasl_passwd che deve essere compilato con postmap:
smtp.example.org login:password
Per bloccare il relaying non autorizzato e per proteggersi con la blacklist zen.spamhaus.org sono state aggiunte le seguenti opzioni in /etc/postfix/main.cf:
# Restrictions upon recipient address.
smtpd_recipient_restrictions =
permit_sasl_authenticated,
permit_mynetworks,
reject_rbl_client zen.spamhaus.org,
reject_non_fqdn_sender,
reject_non_fqdn_recipient,
reject_unknown_sender_domain,
reject_unauth_destination
È possibile aggiungere una whitelist/blacklist locale che agisce prima della blacklist basata su DNS:
smtpd_recipient_restrictions =
permit_sasl_authenticated,
...
check_sender_access hash:/etc/postfix/sender_access,
reject_rbl_client zen.spamhaus.org,
...
Il file sender_access deve essere compilato con postmap ed avere il seguente formato:
myfriend@example.com OK junk@spam.com REJECT marketing@ REJECT theboss@ OK deals.marketing.com REJECT somedomain.com OK
Per accettare la posta e farne il relay da un particolare indirizzo IP o network si usa la direttiva mynetworks di /etc/postfix/main.cf:
mynetworks = 127.0.0.0/8 192.168.2.0/24 82.61.251.143
Esempio: come nascondere uno header Received: per non mostrare che la mail passa da un IP dinamico? Si aggiunge un file /etc/postfix/maps/header_checks con l'espressione regolare e l'azione:
/^Received: from mail.private.com/ IGNORE
quindi si aggiunge questo in /etc/postfix/main.cf:
# Filter unwanted headers. # See http://www.postfix.org/header_checks.5.html header_checks = regexp:/etc/postfix/maps/header_checks
È possibile riscrivere l'indirizzo di provenienza di una mail, utile soprattutto per le mail generate in automatico da account locale, che altrimenti potrebbero avere indirizzi brutti e poco graditi ai filtri antispam, del tipo root@localhost oppure nagios@hostname.
Postfix dispone della direttiva sender_canonical_maps; basta aggiungere in main.cf qualcosa del genere:
# Rewrite some sender addresses. sender_canonical_maps = hash:/etc/postfix/sender_canonical
e predisporre il file /etc/postfix/sender_canonical:
root user@domain.tld
Il file deve essere compilato con postmap(1) per creare il relativo .db.
Ad un destinatario privo di dominio (es. backup o root) viene aggiunto il dominio specificato dall'opzione myorigin, in Debian questo equivale al contenuto del file /etc/mailname.
Questa riscrittura avviene prima di applicare il contenuto di /etc/aliases. Pertanto gli alias specificati in /etc/aliases funzionano solo se il dominio specificato in /etc/mailname è uno di quelli riconosciuti come locali, cioè inclusi nell'opzione mydestination.
I messaggi di notifica grave vengono inviati a postmaster, essendo un destinatario non qualificato viene trattato come descritto al paragrafo precedente.
Un host che non riceve mail da internet ma che vuole generare messaggi di sistema con mittente valido (quindi non locale) probabilmente ha myorigin non contenuto in mydestination. In questo caso c'è il rischio che i messaggi di notifica perpostmaster@myorigin non arrivino a destinazione, in quanto non locali.
Conviene quindi dichiarare in /etc/postfix/main.cf:
mydestination = naxos.rigacci.org, localhost # myorigin is not in mydestination and we use a smarthost: # assure that notification messages can land somewhere locally. bounce_notice_recipient = postmaster@localhost 2bounce_notice_recipient = postmaster@localhost
e in /etc/aliases:
postmaster: user@localhost root: user@localhost
To relay mail for non-local domains (domains not in mydestination and not in local virtual domains), use the relay_domains setting:
# Relay mail for non-local domains, separated by commas and/or whitespace: relay_domains = www.mydomain.org, mydomain.org
If you want to relay mail to a specific host - eventually not the one listed in MX records - you must provide a specific transport map, writing a file /etc/postfix/transport with something like this:
mydomain.org smtp:real.mx.host
Compile the file with postmap(1) and inform Postfix that you want to use it, in main.cf add:
# Some specific transports (e.g. smtp relay) are listed in this file: transport_maps = hash:/etc/postfix/transport
Some MTAs require that the HELO or EHLO hostname is a FQDN name that resolves to an A resource record or an address literal (see RFC2821).
Postfix will use the myhostname value for the HELO command, in a default Debian installation that is the simple hostname, without domain.
You can change the myhostname in /etc/postfix/main.cf or you can force the HELO name using smtp_helo_name setting, which defaults to myhostname:
smtp_helo_name = mail.mydomain.org # If we don't have the name registered as an A record, use an IP literal: #smtp_helo_name = [78.47.31.140]
Per rimuovere un singolo messagio in base al sui ID:
postsuper -d 75F6F10039B
Per rimuovere tutti i messaggi ritardati per qualche motivo e rimasti in coda:
postsuper -d ALL deferred
Questi sono alcuni parametri che si possono impostare per limitare le risorse messe a disposizione dal server:
# Maximal number of Postfix child processes that provide a given service. default_process_limit = 50 # The maximal size in bytes of a message, including envelope information. message_size_limit = 20971520 # Maximum number of recipients per message. smtpd_recipient_limit = 20 # Bounce headers only, not the message body (avoid to make backscatter SPAM). bounce_size_limit = 1
Il parametro default_process_limit può essere scavalcato dall'impostazione maxproc di master.cf.
La configurazione predefinita di Postfix prevede la possibilità di richiedere una DSN all'invio del messaggio, vedere la capability DSN annunciata all'EHLO. Alcuni clienti email fanno questa richiesta per impostazione predefinita.
Nei log si trova traccia dell'invio di tale notifica:
postfix/bounce[27741]: B39AE1002D1: sender delivery status notification: 69D4E1002A6
Per disattivare questa capability basta aggiungere in /etc/postfix/main.cf:
# Disallow all use of DSN requests from the network. smtpd_discard_ehlo_keywords = silent-discard, dsn
Per generare un messaggio di notifica si può usare l'interfaccia di compatibilità sendmail di Postfix. Ad esempio per generare un messaggio di notifica senza effettivamente mandare un messaggio ad un destinatario:
sendmail -bv name@domain.org Mail Delivery Status Report will be mailed to <root>.
Se invece si vuole effettivamente effettuare un invio e ricevere una notifica dell'esito:
sendmail -v name@domain.org Some text message... . Mail Delivery Status Report will be mailed to <root>.
Per avere una connessione cifrata è sufficiente attivare lo STARTTLS sulla porta standard 25, tuttavia può tornare utile abilitare una porta alternativa, ad esempio per quei provider che bloccano la porta 25 in uscita (notabilmente H3G dai suoi terminali mobili).
In questo caso si può usare la porta 465 TCP, storicamente usata per fare SMTP su SSL. SMTP su SSL differisce dal STARTTLS in quanto la connessione è cifrata via SSL da subito e non viene negoziata dal client con il comando STARTTLS.
ATTENZIONE poiché SMTP su SSL viene considerato superato da STARTTLS, alcuni decidono di fare STARTTLS sulla porta 465, forse una scelta un po' azzardata che contravviene il principio di minima sorpresa.
Con Postfix bisogna aver preparato il certificato SSL come visto sopra e quindi si aggiunge in /etc/postfix/master.cf:
smtps inet n - - - - smtpd -o syslog_name=postfix/smtps # Use the non-standard wrapper mode, i.e. direct SSL instead of STARTTLS. -o smtpd_tls_wrappermode=yes -o smtpd_sasl_auth_enable=yes # Allow only authenticated clients. -o smtpd_client_restrictions=permit_sasl_authenticated,reject
Riavviando Postfix si vedrà che si pone in ascolto anche sulla porta 465/tcp. Nel mail.log si troveranno righe identificate da postfix/smtps/smtpd.
postfix-mx/anvil[919]: statistics: max connection rate 8/60s for (62.48.51.61:25:110.52.2.253) at Oct 15 23:26:21 postfix-mx/anvil[919]: statistics: max connection count 8 for (62.48.51.61:25:110.52.2.253) at Oct 15 23:26:21