Konfigurace elektronické pošty

################################################
###  Ruleset 96 -- bottom half of ruleset 3  ###
################################################

SCanonify2=96

# handle special cases for local names
R$* < @ localhost > $*          $: $1 < @ $j . > $2             no domain at all
R$* < @ localhost . $m > $*     $: $1 < @ $j . > $2             local domain
R$* < @ localhost . UUCP > $*   $: $1 < @ $j . > $2             .UUCP domain

# check for IPv4/IPv6 domain literal
R$* < @ [ $+ ] > $*             $: $1 < @@ [ $2 ] > $3          mark [addr]
R$* < @@ $=w > $*               $: $1 < @ $j . > $3             self-literal
R$* < @@ $+ > $*                $@ $1 < @ $2 > $3               canon IP addr

# if really UUCP, handle it immediately

# try UUCP traffic as a local address
R$* < @ $+ . UUCP > $*          $: $1 < @ $[ $2 $] . UUCP . > $3
R$* < @ $+ . . UUCP . > $*      $@ $1 < @ $2 . > $3

# hostnames ending in class P are always canonical
R$* < @ $* $=P > $*             $: $1 < @ $2 $3 . > $4
R$* < @ $* $~P > $*             $: $&{daemon_flags} $| $1 < @ $2 $3 > $4
R$* CC $* $| $* < @ $+.$+ > $*  $: $3 < @ $4.$5 . > $6
R$* CC $* $| $*                 $: $3
# pass to name server to make hostname canonical
R$* $| $* < @ $* > $*           $: $2 < @ $[ $3 $] > $4
R$* $| $*                       $: $2

# local host aliases and pseudo-domains are always canonical
R$* < @ $=w > $*                $: $1 < @ $2 . > $3
R$* < @ $=M > $*                $: $1 < @ $2 . > $3
R$* < @ $* . . > $*             $1 < @ $2 . > $3

Co se bude dít?

Příště něco z:

Co se stane, když odešlete mail?

  1. Odešlete e-mail pomocí svého MUA (např. mutt nebo thunderbird).

    Takovéhle spamboty píšou malé děti a nepouští je z počítačů z [virt]labu, odkud je občas potřeba poslat něco důležitého. A lidi mají nastavený forwarding.

    $ echo "potazmo" | mail -f from@hea.der -s "Subject 1" test@enve.lope
    $ uuencode priloha.bin | mail -f from@head.er -s predmet test@enve.lope
    ### v Linuxu program base64
    
  2. Váš MUA předá zprávu svému (typicky přednastavenému) MTA, protokolem SMTP (RFC 5321).

    Někdy s uživatelem komunikuje MSP a provádí část rozhodování/pre-processingu sám, čímž méně zatěžuje MTA a zároveň klade menší nároky na jeho konfiguraci.
    Aneb jak "zmodulárnit" monolitický design Sendmailu...

    Zkuste si pomocí programu telnet poslat mail. Těmhle adresám se říká envelope, nebo "z obálky".

    HELO odesilateluv_stroj
    MAIL FROM:<odesilatel@obalka.domena>
    RCPT TO:<prijemce.obal.ka>
    DATA
    .
    QUIT
    
  3. MTA si (typicky) uloží zprávu do nějaké fronty a odtud se ji snaží doručit dále
  4. MTA si předávají zprávu mezi sebou (relaying), dokud se nenajde příjemce nebo ji někdo nezahodí.
    • DNS dotaz
      doména.cz IN MX
    • DNS odpovědi
      doména.cz IN MX 10 mail.doména.cz
      doména.cz IN MX 20 motýla.mámalý.tom
      ADDITIONAL:
      mail.doména.cz IN CNAME kobyla.mámalý.bok
    • "Distance (DJB)" vs. "Priority (RFC 5321)" of MX records.
    • Nenajde-li MTA záznam typu MX, fallbackne na A/AAAA (implicit MX). Nespoléhat na to, napr. qmail jednu dobu posilal dotazy na ANY, na ktere kdyz cachujici resolver vrati pouze obsah sve cache, ve ktere MX neni, mate problem.

      Protože na záznam @ IN A 192.0.2.259 občas lidi zapomenou. http://kolej.mff.cuni.cz/ vs. http://www.kolej.mff.cuni.cz/

    • Některé druhy ochrany proti spamu (graylisting) mohou způsobit i několikaminutové čekání ve frontách.
    • A některé (nolisting) taky nemusejí fungovat s některými SMTP klienty.
    • Ono to "si předávají" je trochu složitější. Role MSP (sm-msp), MSA (postdrop), "vzdáleností" MX záznamů, ...
    • Postfix umí vynutit cestu pomocí transport_maps, transport(5) a tím např. obejít MX lookup.
  5. Mail může bouncenout, tj. vygenerovat zprávu o nedoručitelnosti a zmizet.
  6. Příjemcův MTA předá zprávu MDA, které jej zpracuje a případně uloží na správné místo ve správném formátu.

Jak začít?

Serverem nebo klientem? Chicken-egg problem.

# pkg_add -iv mutt postfix
# yum install mutt postfix
# emerge -av mutt postfix

mail(8) - standardní a jednoduchý MUA

The mailx utility is compliant with the IEEE Std 1003.1-2008 (``POSIX.1'') specification.

Příkaz sendmail(8)

Z historických důvodů každý používá /usr/sbin/sendmail co se chová různě s různými argv[0].

Např. newaliases má v sendmailu ekvivalent sendmail -bi.

[blocks B      ] mail-mta/ssmtp[mta] ("mail-mta/ssmtp[mta]" is blocking mail-mta/opensmtpd-5.3.3.201310281424_p1)
[blocks B      ] mail-mta/postfix ("mail-mta/postfix" is blocking mail-mta/netqmail-1.06-r2, mail-mta/exim-4.82, mail-mta/sendmail-8.14.7-r1, mail-mta/opensmtpd-5.3.3.201310281424_p1)
[blocks B      ] mail-mta/exim ("mail-mta/exim" is blocking mail-mta/netqmail-1.06-r2, mail-mta/opensmtpd-5.3.3.201310281424_p1, mail-mta/sendmail-8.14.7-r1, mail-mta/postfix-2.10.2)
[blocks B      ] mail-mta/netqmail ("mail-mta/netqmail" is blocking mail-mta/exim-4.82, mail-mta/sendmail-8.14.7-r1, mail-mta/postfix-2.10.2, mail-mta/opensmtpd-5.3.3.201310281424_p1)
[blocks B      ] >=mail-mta/ssmtp-2.64-r2[mta] (">=mail-mta/ssmtp-2.64-r2[mta]" is blocking mail-mta/netqmail-1.06-r2, mail-mta/exim-4.82, mail-mta/sendmail-8.14.7-r1, mail-mta/postfix-2.10.2)
[blocks B      ] mail-mta/opensmtpd ("mail-mta/opensmtpd" is blocking mail-mta/exim-4.82, mail-mta/sendmail-8.14.7-r1, mail-mta/postfix-2.10.2)
[blocks B      ] mail-mta/exim ("mail-mta/exim" is blocking mail-mta/ssmtp-2.64-r2)
[blocks B      ] mail-mta/netqmail ("mail-mta/netqmail" is blocking mail-mta/ssmtp-2.64-r2)
[blocks B      ] mail-mta/sendmail ("mail-mta/sendmail" is blocking mail-mta/netqmail-1.06-r2, mail-mta/exim-4.82, mail-mta/postfix-2.10.2, mail-mta/opensmtpd-5.3.3.201310281424_p1)
[blocks B      ] mail-mta/postfix ("mail-mta/postfix" is blocking mail-mta/ssmtp-2.64-r2)
[blocks B      ] mail-mta/opensmtpd ("mail-mta/opensmtpd" is blocking mail-mta/ssmtp-2.64-r2)
[blocks B      ] mail-mta/sendmail ("mail-mta/sendmail" is blocking mail-mta/ssmtp-2.64-r2)

mutt

"All mail clients suck. This one just sucks less."
Jeremy Blosser

Můj ~/.muttrc, abyste neřekli

Neznamená to "musím to copypastnout"

set from = "username@gmail.com"
set realname = "Vaše Jméno"

set imap_user = "username@gmail.com"
set imap_pass = "hesloheslo"

set folder = "imaps://imap.gmail.com:993"
set spoolfile = "+INBOX"
set postponed = "+[Gmail]/Drafts"

set header_cache =~/.mutt/cache/headers                                         
set message_cachedir =~/.mutt/cache/bodies                                      
set certificate_file =~/.mutt/certificates

set smtp_url = "smtp://username@smtp.gmail.com:587/"
set smtp_pass = "hesloheslo"

macro index gi "<change-folder>=INBOX<enter>" "Go to inbox"                     
macro index ga "<change-folder>=[Gmail]/All Mail<enter>" "Go to all mail"       
macro index gs "<change-folder>=[Gmail]/Sent Mail<enter>" "Go to Sent Mail"     
macro index gd "<change-folder>=[Gmail]/Drafts<enter>" "Go to drafts"

# My Editor                                                                     
set editor='vim + -c "set textwidth=72" -c "set wrap" -c "set nocp"

set move = no  #Stop asking to "move read messages to mbox"!                    
set imap_keepalive = 900

set sort=threads

bind index \Cr imap-fetch-mail

Jaký MTA?

Sendmail (Eric Allman)

Postfix (Wietse Venema)

Exim

qmail (Daniel J. Bernstein)

Jaký MTA?

OpenSMTPD (Gilles Chehade a další)

...a co když mám webserver v chroot(2)u?

Postfix - architektura

Postfix v OpenBSD - jak nahradit sendmail?

Sendmail jako forwarder

Na klientských počítačích nebo routerech často stačí využít už existující server jen s drobnou modifikací: všechnu poštu předávej na jedno místo, odkud půjde do internetu.

# cd /usr/share/sendmail/cf
# vi openbsd-localhost.mc
define(`LOCALHOST_ONLY')dnl
define(`SMART_HOST', `centrální.smtp.server.swi')dnl
include(_CF_DIR_`cf/openbsd-proto.mc')dnl
# make openbsd-localhost.cf
# mv openbsd-localhost.cf /etc/mail/localhost.cf
# pkill -HUP sendmail

Postfix - main.cf, postconf(1)

Seznamy můžou být řetězce, absolutní cesta k souboru, nebo backend_type:table. Můžete používat např. Berkeley DB jako v Sendmailu, nebo třeba MySQL.

Aktuální konfiguraci vypíše postconf, včetně výchozích hodnot.

mydestination = $myhostname, localhost
Seznam domén, pro které je daný stroj koncový. Tedy, volá se MDA nastavený v local_transport. Na serveru, kde hostujete poštu ostatním (doména.swi), nastavte mydomain = doména.swi a přidejte na tenhle seznam $mydomain.
mynetworks = 127.0.0.0/8, 192.168.NN.0/24, 192.168.(NN+128).0/24
Seznam důvěryhodných SMTP klientů, kteří můžou relayovat maily do světa.
relay_domains = $mydestination, naše.stará.doména
Seznam domén, kam Postfix umožní relayovat nedůvěryhodným klientům.
relayhost = [mail.provajdr.cz]
Sendmailí SMART_HOST; všechno, pro co není záznam v transport(5), se forwardne tam. Ten už si poradí. Typicky je to mailserver Vašeho ISP (máte-li malou firmu a např. dynamické adresy po ADSL).
myorigin = $mydomain
Sendmailí masquerading; aby pošta vypadala, že jde z doména.swi a ne z pošťák.doména.swi. Server s názvem pošťák totiž nemusí být zítra naživu a MX může být přesměrované někam jinam. Toto je samozřejmě potřeba použít jen na mail serverech, které poštu i ukládají (mají MDA pro více lidí). Většinou nevhodné.
home_mailbox = Maildir/
Nastaví local(8) MDA v Postfixu, aby místo /var/spool/mail používal qmailí formát Maildir v home každého uživatele. mutt(1)u musíte odstranit proměnnou MAIL a nastavit MAILDIR:
echo "unset MAIL" >> ~/.profile
echo "export MAILDIR=~/Maildir/" >> ~/.profile
logout

aliases(5), forward(5)


Ladění

Backup MX

Kontrola přístupu

Jsem paranoik a nevěřím automatice. Chci do hloubky!

Filtrování mailů pomocí software třetích stran

Jak Postfixu říct "půjč mi ten mail na chvíli"?

amavis: A Mail Virus Scanner

SMTP AUTH

SASL: kde se to nastavuje?

SASL: jak to funguje?

klientserver
(je na houbách) (0) Načte konfiguraci ze <servicename>.conf
(1) Otevře spojení na SMTP server:
⇒EHLO klient
(2) Nové spojení accept(2)ne
sasl_server_new("<servicename>")
→ se nějak musí dostat k saslauthd(8) socketu
→ proto s Cyrus SASL nemůžu jen tak použít chroot
→ Dovecot umí AF_INET sockety, ale jiní neumí Dovecot
sasl_listmech(3)
⇐250-AUTH PLAIN LOGIN
(3) sasl_client_new(3)
Stáhnu si seznam mechanismů:
sasl_client_start(3)
a vyberu si, který umím:
⇒AUTH PLAIN (base64-encoded-data)
(4) Začnu se přihlašovat, jak řekl:
sasl_server_start(mech_od_klienta)
Odešlu další krok přihlašování:
sasl_server_step(3)
cyklím, dokud mi vrací SASL_CONTINUE
⇐334 (more-base64-encoded-crap)
(5) Tak dlouho volám sasl_client_step(3),
dokud mi vrací SASL_INTERACT
⇒(even-more-base64-encoded-data)
(6) Podle průběhu vrátím SASL_OK nebo SASL_CONTINUE
sasl_dispose(3)
MAIL FROM:
RCPT TO:
nebo taky
QUIT

SASL: jak do Postfixu?

TLS: Transport Level Security

TLS: do práce!

TLS: jak do Postfixu?

TLS: jak do OpenSMTPD?

# vi /etc/mail/smtpd.conf
pki mail.firma.cz certificate "/etc/ssl/mail.firma.cz.crt"
pki mail.firma.cz key "/etc/ssl/private/mail.firma.cz.key"
pki mail.firma.cz ca "/etc/ssl/superbezpecna-ca.crt"

listen on vic0 tls pki mail.firma.cz auth
# /etc/rc.d/smtpd restart

Více v smtpd.conf(5) u direktivy listen on.

Srovnání programů

Tučné příkazy jsou standardní a fungují všude. Ostatní jen někde.

věc Postfix Sendmail OpenSMTPD
vypsat fronty postqueue -p, qshape mailq smtpctl show queue
popostrčit fronty postqueue -f sendmail -q [-v] smtpctl schedule all
restartovat postfix reload /etc/rc.d/${service} restart
přegenerovat mapy postmap makemap
přegenerovat aliasy postalias sendmail -bi newaliases
vypsat konfiguraci postconf [-n] less + kýbl less
sledovat, co se děje tail -f /var/log/maillog smtpctl monitor

Srovnání konfigurace

věc Postfix Sendmail
domény, pro které se doručuje lokálně mydestination class $=w
/etc/mail/local-host-names
IP adresy, které mají povolený open relaying mynetworks, mynetworks_style mapa access
/etc/mail/access[.db]
jméno naší domény (používané dále) mydomain makro $j
define(`confDOMAIN_NAME', `doména.swi')
do kterých domén bude povolen relaying všem relay_domains class $=R
/etc/mail/relay-domains[.db]
na co se přepisují maily z lokálních domén myorigin makro M/class $=M
MASQUERADE_AS(`doména.cz') MASQUERADE_DOMAIN(`další.doména')
kam se tupě forwarduje všechna pošta relayhost makro S
define(`SMART_HOST', `mail.provajdr.cz')

Konfigurace Sendmailu

co vás zmate:sendmail cfm4
zpracování souborupo řádcíchjako stream
začátek komentáře#dnl
názvy definicjednopísmenné (historicky),
nebo {takovéto}
k nerozeznání od zbytku,
``úvozovkami proti expanzi''
příkaz "verze"příkaz V = verze syntaxe
makro {Z} = verze konfigurace
makro VERSIONID() = jen komentář
proměnná confCF_VERSION = $Z
pojem "mailer"příkaz M:
Mjabber, P=/bin/jabb,
F=lsDFMe, S=10
makro MAILER() includující
/usr/share/sendmail/mailer/název.m4
Může používat dříve definované proměnné!

m4 - velmi rychle

Konfigurace Sendmailu - soubory *.cf

Konfigurace Sendmailu - soubory *.cf

WIP: Interní proměnné Sendmailu

makraclassy
$jFQDN
m4: confDOMAIN_NAME
$=ttrusted users
$wshort hostname$=wnaše jména,
co s tím přijde, je lokální
$mlokální doména$=mnaše domény; Nepoužívá se v m4!
máte "domaintable" TODO a co relay_entire_domain??
$Ssmart host,
kam se vše relayuje
$=Ooddělovače uživatel/síť nebo doména

WIP: Proměnné Sendmailu používané m4 šablonami

makraclassy
$Zverze konfigurace$=Pjména, která končí tímhle,
jsou kanonická (TODO kanonizovaná?)
$MMASQUERADE_AS
na co se maškaráduje
$=MMASQUERADE_DOMAIN[_FILE]
jaké adresy se maškarádují
$RNepoužívá se!
a to ani LOCAL-RELAY
$=Rstroje mající povolený relay
/etc/mail/relay-domains
$LNepoužívá se?
a to ani LUSER_RELAY
$=Llokální uživatelé
LOCAL_USER[_FILE]

WIP: Sendmail - přepisovací systémy (rulesets)

nezbyde čas, naučte se ke zkoušce základy ze slidů

WIP: Mail Submission Program (MSP)

WIP: Sendmail - SMTP AUTH

WIP: Vybrané FEATUREs Sendmailu

FEATURE(`genericstable')
mění adresy odesilatelů, $=G
FEATURE(`domaintable')
překládá mezi doménami (při přechodu ze staré na novou) a adresa je lokální, mapa {domaintable}
FEATURE(`mailertable')
databáze vybírající nové MDA ??, mapa {mailertable}
FEATURE(`virtusertable')
podpora virtuálních domén; přesměrovává doručování na virtuální domény do skutečných míst, mapa {virtusertable}, virtuser_entire_domain + class {VirtHost}

WIP: Sendmail: potřebuji relay server. Hned.

FEATURE(`promiscuous_relay') NE!
kdokoli může posílat cokoli kamkoli → nebrat
FEATURE(`relay_local_from') NE!
kdo použije v obálce adresu z vaší domény (class {w}) (MAIL FROM:<nekdo@vase.domena>), může posílat cokoli kamkoli → nebrat, spamy se budou šířit pod Vaším jménem a adresou
FEATURE(`relay_mail_from') pozor!
je-li sender dané zprávy uvedený jako RELAY v access map, může posílat cokoli kamkoli → zbytečné a podvrhnutelné; použijte radši SMTP AUTH nebo starttls(8)
FEATURE(`relay_based_on_MX') ano!
má-li doména příjemce (z obálky??) jako MX uvedený Váš server, povolí se relay; při timeoutu DNS požadavku se dočasně odmítne → spammeři neuspějí, ale cizí domény Vás mohou využívat jako svůj relay server (nastaví-li si na něj MX (funguje nějaký trik s prioritama 0/mooc?))
FEATURE(`relay_entire_domain') ano!
kdokoli z jakékoli Vaší lokální domény (class {m}) má povolen relay (omezující featura tu taky je) -- dopsat význam slovního spojení _entire_domain v m4 konfiguraci
FEATURE(`access_db') ano!
nejlepší řešení je vyjmenovat v téhle mapě (/etc/mail/access) seznam sítí/strojů s hodnotou RELAY. Nepodporuje CIDR!
Jeden šikovně vysvětlující mail

WIP: Sendmail: soubory

Fronty: makro QUEUE_DIR, což je standardně /var/spool/mqueue/.

Konfigurace je v adresáři MAIL_SETTINGS_DIR, což je standardně /etc/mail/.

WIP: Co se zatím nevešlo

- uzitecna makra: SMTP_MAILER_MAX, SMTP_MAILER_MAXMSGS, SMTP_MAILER_MAXRCPTS
[LOCAL_*], [PROCMAIL_*], [CYRUS_*], [QPAGE_*],
- MODIFY_MAILER_FLAGS(`LOCAL'. `+e') craziness
- uzitecne FEATUREs: always_add_domain pro spolecna uloziste, *_entire_domain, use_client_ptr
[stickyhost]
mailertable - routovani domen,  ktere nejsou local (class {w})
rozdil mezi mailertable a domaintable? (ruleset 5 vs ruleset 3)

http://plug-and-pray.blogspot.com/2008/02/sendmail-maildir-format.html


- class {R}, RELAY_DOMAIN() nebo RELAY_DOMAIN_FILE() nebo access db

cela sekce "ochrana proti spamu" - aspon SPF (dkim se bral v seminari)
Spam Permitted From?
- FEATURE(`dnsbl') - vizte http://mail-abuse.org/ nebo RBL

LOCAL_RELAY nam umoznuje relayovat vsechnu postu na 1 misto (centralni server) bez individualniho nastavovani .forward nebo procmailu
LOCAL_USER a.k.a. $=L jsou uzivatele, ktere z toho chci vynechat

upravit a vymyslet vtipnou bounce msg (misto vychoziho otrepaneho mailure failure)


SRV zaznamy pro autokonfiguraci veci jako Thunderbird...
http://tools.ietf.org/html/rfc6186