Elektronická pošta

Filip Slunečko, filip.slunecko@mail.muni.cz

Obsah

Princip fungováni SMTP

SMTP je internetový standard pro zasílání elektronické pošty pomocí IP. Standard je definován RFC 821 (1982), a později rozšířen RFC 5321 (2008). SMTP využívá TCP port 25. SMTP je textový protokol tzn. komunikace probíhá pomocí textových řetězců.

Stavební kameny SMTP komunikace

SMTP transakce se skládá ze tří "příkazů"

Kódy odpovědi SMTP

kódvýznam
2xxpříkaz byl přijat
3xxpříkaz byl přijat, ale čeká se na další informace
4xxpříkaz nebyl přijat, dočasná chyba
5xxpříkaz nebyl přijat, permanentní chyba

DNS MX

MX je doménový záznam určující server zodpovědný za přijímání elektronických zpráv. Sada těchto záznamů určuje jakým způsobem se emaily budou doručovat. K MX záznamu musí být odpovídající A záznam. Pokud neexistuje MX záznam server by se měl pokusit doručit poštu na IP z A záznamu. MX záznamy umožňují definovat více mail serverů pro jednu doménu a tím zajistit failover a "load balancing". Každý MX záznam má prioritu určenou číslem. Čím vyšší číslo tím nižší prioritu má server při výběru. Tzn. server s prioritou 10 bude vybrán dříve než server s prioritou 20. Pokud mají servery prioritu stejnou odesílací server by měl vybrat cílový server náhodně.

Formát zpráv (RFC 2822, MIME)

RFC 2822 (Internet Message Format)

RFC 2822 specifikuje formát elektronické zprávy. Tento dokument nahrazuje dokument RFC 822. Elektronická zpráva se skládá z obálky a obsahu. Obálka obsahuje všechna potřebná data pro doručení a přenos zprávy a je popsána v RFC 2821. V obsahu jsou data určená pro příjemce. Obsah je specifikován RFC 2822. Obsah zprávy se skládá z US-ASCII (znaky 1-127). Řádky mohou být maximálně 988 znaků dlouhé.

Hlavička (Header Fields)

Hlavička se skládá z jednotlivých polí (header fields) ve formátu:

název pole: tělo pole

Název pole může obsahovat pouze tisknutelné znaky US-ASCII (33-126) kromě dvojtečky. Tělo se může skládat ze všech znaků US-ASCII kromě . Některé pole jsou strukturovaná a jejich struktura je popsaná v RFC 2822.

Povinné položky v hlavičce jsou: orig-date, from.

Příklad hlavičky

    From: John Doe 
    To: Mary Smith 
    Subject: Saying Hello
    Date: Fri, 21 Nov 1997 09:55:06 -0600
    Message-ID: <1234@local.machine.example>

    This is a message just to say hello.
    So, "Hello".

MIME (Multipurpose Internet Mail Extensions)

MIME standard (RFC 2045, RFC 2046, RFC 2049) popisuje mechanismy jak pomocí elektronické pošty definovaná v RFC 2822 posílat jiný než textový obsah (hudbu, video ....). Dokumenty RFC, specifikující MIME jsou:

Příklad MIME hlavičky

MIME-version: 1.0
Content-type: multipart/mixed; boundary="frontier"

This is a multi-part message in MIME format.
--frontier
Content-type: text/plain

This is the body of the message.
--frontier
Content-type: application/octet-stream
Content-transfer-encoding: base64

PGh0bWw+CiAgPGhlYWQ+CiAgPC9oZWFkPgogIDxib2R5PgogICAgPHA+VGhpcyBpcyB0aGUg
Ym9keSBvZiB0aGUgbWVzc2FnZS48L3A+CiAgPC9ib2R5Pgo8L2h0bWw+Cg==
--frontier--

Příklad komunikace přes SMTP

Komunikace pak tedy může probíhat tak, že MUA předá zprávu MSA to předá zprávu MTA. MTA předá zprávu MTA pro danou doménu (zjištěno přes DNS). MTA doručí pomocí MDA zprávu do schránku kde ji lze pomocí MUA zpracovat.
S: 220 smtp.example.com ESMTP Postfix
C: HELO relay.example.org
S: 250 Hello relay.example.org, I am glad to meet you
C: MAIL FROM:
S: 250 Ok
C: RCPT TO:
S: 250 Ok
C: RCPT TO:
S: 250 Ok
C: DATA
S: 354 End data with .
C: From: "Bob Example" 
C: To: "Alice Example" 
C: Cc: theboss@example.com
C: Date: Tue, 15 Jan 2008 16:02:43 -0500
C: Subject: Test message
C:
C: Hello Alice.
C: This is a test message with 5 header fields and 4 lines in the message body.
C: Your friend,
C: Bob
C: .
S: 250 Ok: queued as 12345
C: QUIT
S: 221 Bye

SPAM (relaying, open relay, black-listy, delayed bounce, greylisting, antispamové filtry)

SPAM

Nevyžádaná pošta.

Relaying

Přeposílání emailů přes další servery.

Open relay

Server, který umožní všem bez autentizace přeposlat email do jiných sítí.

Black listy

Seznam IP adres, které jsou podezřelé z odesílání SPAMových zpráv.

Bounce

Zpráva generovaná MTA o nedoručitelnosti zprávy.

Greylisting

Typ antiSPAMového opatření. Vychází z principu, že pokud zpráva bude jednou odmítnuta pak se ji spamer nepokusí odeslat znovu, ale "normální" MTA by se měl pokusit zprávu odeslat znovu.

Antispamové filtry

Programy snažící se rozeznat zda je email SPAM či HAM (vyžádaná zpráva). Rozpoznávání může probíhat buď na základě analýzy textu a hlaviček zprávy (checksum zprávy, pravidla hodnotící obsah zprávy) nebo dle IP ze, které se odesílá (Blacklisting).

Poštovní klienti (IMAP a POP3)

Uživatelé se k emailům mohou dostat buď přímo na serveru kam jsou zprávy doručeny nebo si je mohou stáhnout a prohlížet na svém osobním počítači. Ke vzdálené manipulaci s elektronickou poštou slouží mimo jiné protokoly IMAP a POP3.

Internet Mail Access Protocol (IMAP)

Poslední verze protokolu je definována RFC 3501. IMAP podporuje jak off-line tak on-line přístup k elektronické poště. IMAP nechává zprávy na mail serveru dokud je uživatel nesmaže. Klient si tedy může ukládat lokální kopie zpráv, ale na ty je pohlíženo jako na dočasné úložiště.

Post Office Protocol(POP3)

Poslední verze protokolu je definována RFC 2449. POP3 je stejně jako IMAP protokol určený k manipulaci s elektronickou poštou. Na rozdíl od protokolu IMAP umožňuje pouze operaci stáhni a smaž.

Postfix

Postfix je jeden z mnoha MTA. Je šířen pod svobodnou licencí. Byl napsán v roce 1997 ve firmě IBM.

Vlastnosti

Architektura - přijímání zpráv

trivial-
rewrite
Network -> smtpd
^
|
|
v
\
Network -> qmqpd -> cleanup -> incoming
/
pickup <- maildrop
^
|
Local -> sendmail -> postdrop

Architektura - doručování zpráv

trivial-
rewrite
smtp(8) -> Network
/
^
|
|
v
- lmtp(8) -> Network
/
incoming -> active -> qmgr --- local -> File, command
^
|
|
v
\
- virtual -> File
deferred \
pipe -> Command

Fronty zpráv

Při příchodu zprávy do systému je zpráva přeposlána přes několik front.

názevvýznam
maildrop zpráva, odeslaná z lokálního systému
incomingpříchozí lokální nebo z Internetu
activepřesunuté z incoming, právě zpracovávané
deferreddočasně odložené, z důvodů chyby

Celý systém řídí démon Master, který spouští jednotlivé démony další služby dle potřeby.

Komponenty Postfixu

názevfunkce
sendmail slouží pro odeslání (vytvoření) zprávy Postfixu, je kompatibilní se Sendmailem
pickup Bere zprávy z fronty maildrop a předá ji programu cleanup
cleaner přidává chybějící hlavičky; informuje queue manažera o nové zprávě
qmgr správce fronty; kontaktuje démony doručení (local, pipe, smtp)
bounce generuje zprávu o nedoručitelnosti, případně vrátí zprávu
defer generuje zprávu o nedoručitelnosti, z důvodů chyby nebo nedosažitelnosti cíle
smtp zjišťuje cíl pro doručení zprávy
smtpd přijímá síťová spojení; provádí kontroly
local doručuje místním uživatelům
pipe posílá zprávy rourou pro jiné transporty
resolve rozlišuje mezi lokálním a vzdáleným doručením; může se orientovat podle transport_table

Základní konfigurace

Konfiguraci postfixu je uložena převážně v souborech master.cf a main.cf.

Formát master.cf

# ==========================================================================
# service type  private unpriv  chroot  wakeup  maxproc command + args
#               (yes)   (yes)   (yes)   (never) (100)
# ==========================================================================
127.0.0.1:smtp      inet  n       -       n       -       -       smtpd
10.0.0.2:smtp       inet  n       -       n       -       -       smtpd -o content_filter=spamassassin

spamassassin        unix  -       n       n       -       -       pipe
   user=spamassassin argv=/usr/bin/spamc -f -e /usr/lib/sendmail.postfix -oi -f ${sender} ${recipient}


pickup    fifo  n       -       n       60      1       pickup
cleanup   unix  n       -       n       -       0       cleanup
qmgr      fifo  n       -       n       300     1       qmgr
tlsmgr    unix  -       -       n       1000?   1       tlsmgr
rewrite   unix  -       -       n       -       -       trivial-rewrite
bounce    unix  -       -       n       -       0       bounce
defer     unix  -       -       n       -       0       bounce
trace     unix  -       -       n       -       0       bounce
verify    unix  -       -       n       -       1       verify
flush     unix  n       -       n       1000?   0       flush
proxymap  unix  -       -       n       -       -       proxymap
smtp      unix  -       -       n       -       -       smtp
# When relaying mail as backup MX, disable fallback_relay to avoid MX loops
relay     unix  -       -       n       -       -       smtp
  -o fallback_relay=
showq     unix  n       -       n       -       -       showq
error     unix  -       -       n       -       -       error
discard   unix  -       -       n       -       -       discard
local     unix  -       n       n       -       -       local
virtual   unix  -       n       n       -       -       virtual
lmtp      unix  -       -       n       -       -       lmtp
anvil     unix  -       -       n       -       1       anvil
scache    unix  - - n - 1 scache
maildrop  unix  -       n       n       -       -       pipe
  flags=DRhu user=vmail argv=/usr/local/bin/maildrop -d ${recipient}

old-cyrus unix  -       n       n       -       -       pipe
  flags=R user=cyrus argv=/usr/lib/cyrus-imapd/deliver -e -m ${extension} ${user}
cyrus     unix  -       n       n       -       -       pipe
  user=cyrus argv=/usr/lib/cyrus-imapd/deliver -e -r ${sender} -m ${extension} ${user}

uucp      unix  -       n       n       -       -       pipe
  flags=Fqhu user=uucp argv=uux -r -n -z -a$sender - $nexthop!rmail ($recipient)
ifmail    unix  -       n       n       -       -       pipe
  flags=F user=ftn argv=/usr/lib/ifmail/ifmail -r $nexthop ($recipient)
bsmtp     unix  -       n       n       -       -       pipe
  flags=Fq. user=foo argv=/usr/local/sbin/bsmtp -f $sender $nexthop $recipient



127.0.0.1:10026 inet n    -       n       -       100     smtpd
        -o smtpd_delay_reject=no
        -o smtpd_client_restrictions=permit_mynetworks,reject
        -o smtpd_recipient_restrictions=permit_mynetworks,reject
        -o smtpd_data_restrictions=reject_unauth_pipelining
        -o mynetworks=127.0.0.0/8
        -o smtpd_error_sleep_time=0
        -o smtpd_soft_error_limit=100
        -o smtpd_hard_error_limit=120
        -o smtpd_client_connection_count_limit=0
        -o smtpd_client_connection_rate_limit=0
        -o receive_override_options=no_header_body_checks,no_unknown_recipient_checks,no_milters

název sloupcevýznam
servicenázev služby
typetransport type, inet, fifo, unix
privateomezení přístupu pouze pro Postfix
unprivnízká oprávnění
chrootzměna kořenového adresáře
wakeupjak často kontrolovat
maxprocmax. počet procesů
command + argspříkaz, -o parametry, -v upovídanost

Formát main.cf

disable_vrfy_command = yes

queue_directory = /var/spool/postfix
command_directory = /usr/sbin
daemon_directory = /usr/libexec/postfix
mail_owner = postfix
unknown_local_recipient_reject_code = 550
debug_peer_level = 2
debugger_command = 
     PATH=/bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin
     xxgdb $daemon_directory/$process_name $process_id & sleep 5
sendmail_path = /usr/sbin/sendmail.postfix
newaliases_path = /usr/bin/newaliases.postfix
mailq_path = /usr/bin/mailq.postfix
setgid_group = postdrop
html_directory = no
manpage_directory = /usr/share/man
sample_directory = /usr/share/doc/postfix-2.3.3/samples
readme_directory = /usr/share/doc/postfix-2.3.3/README_FILES

###################################################################

alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases

###################################################################

mydomain = test.com
myorigin = $myhostname
myhostname = test2.test.com

mynetworks = 127.0.0.0/8

maps_rbl_domains=sbl.spamhaus.org

# definice pro jake domeny prijima lokalne
mydestination = $myhostname, localhost.$mydomain, localhost

relay_domains = $mydestination

soft_bounce = no

# propust pouze povolene site
smtpd_recipient_restrictions = permit_mynetworks, 
  reject_unauth_destination
smtpd_client_restrictions    =
   permit_mynetworks,
   reject_rbl_client sbl.spamhaus.org,
   permit


smtpd_delay_reject = yes
smtpd_helo_required = yes
smtpd_helo_restrictions = warn_if_reject, 
  reject_non_fqdn_hostname, reject_invalid_hostname, permit

# namapovani prichozich uzivatelu na lokalni uzivatele
virtual_alias_maps = hash:/etc/postfix/virtual

# header soubor
header_checks = regexp:/etc/postfix/header_checks
# transporty
transport_maps = hash:/etc/postfix/transport
# relay rc list
relay_recipient_maps = hash:/etc/postfix/relay_recipients

alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases

maildrop_destination_recipient_limit = 1
mailbox_command = /usr/bin/procmail -a  
  "$EXTENSION" DEFAULT=$HOME/Maildir/ MAILDIR=$HOME/Maildir

Doménový koš

Je e-mailová schránka, kam dojdou e-maily, které byly poslány do neexistující schránky na stejné doméně.

Literatura