Elektronická pošta
Petr Bartel, xbartel@fi.muni.cz
Obsah
Historie:
1965 | MAILBOX - posílání zpráv v rámci
jednoho počítače, ve formě ukládání zpráv do souboru a umístění souboru
do adresáře uživatele |
1971 | SNDMSG, READMAIL - Ray Tomlinson |
1971 | znak @, jméno_uživatele@jméno_počítače |
1971 | příkazy MAIL, MLFL přidány do protokolu FTP
RFC(385) |
1982 | protokol SMTP definovány v RFC821, později
RFC2821 a následně RFC5321 SMTP (Simple Mail Transport Protocol) - cílem je
přenášet zprávy efektivně a spolehlivě |
1980's | UUCP unix to unix copy, RFC976 UUCP Mail
Interchange Format Standard. Počítače spojené do UUCP projektu, jej používaly
pro přesun zpráv mezi systémy. Definuje obálku (informace pro MTA) a zprávu
(hlavička + tělo, informace o odesílateli i příjemci) |
1980's | Sendmail vyvinutý na UC Berkeley, a
poskytováno s prvním BSD (4.0 a 4.1), co podporovalo TCP/IP,
v roce 1983. Derivát derivermailu z ARPANETU |
1984 | X.400 konkurent SMTP, používá se do dnes v
komerčních systémech jako např. MS Exchange, jiný formát adresy
G=Georg; S=Hansen; O=sintef; OU=delab; PRMD=uninett; ADMD=uninett; C=no
(zárodek LDAPu), verze X.400/84 a X.400/88 |
1986 | IMAP, Internet Mail Access Protocol
|
1995 | Qmail, napsaný Danielem J. Bernsteinem,
jako bezpečnější náhrada sendmailu |
1996 | Exchange Server Beta 1, Microsoft, první
veřejná verze vyšla téhož roku pod názvem Exchange 4.0 (X.400
client-server, X.500 adresářové služby) |
1998 | Postfix, Wietse Venema, IBM |
Jak zjistit kde hledat SMTP server?
Příkazy SMTP
komunikace mezi MUA a MTA
+----------+ +----------+
+------+ | | | |
| User |<-->| | SMTP | |
+------+ | Client- |Commands/Replies| Server- |
+------+ | SMTP |<-------------->| SMTP | +------+
| File |<-->| | and Mail | |<-->| File |
|System| | | | | |System|
+------+ +----------+ +----------+ +------+
SMTP client SMTP server
HELO EHLO MAIL RCPT DATA
RSET NOOP QUIT HELP VRFY
EXPN VERB ETRN DSN AUTH
STARTTLS
možné odpovědi příkazu EHLO (ESMTP)
SEND | Send as mail |
[RFC821] |
SSOML | Send as mail oř terminal |
[RFC821] |
SSAML | Send as mail and terminal |
[RFC821] |
SEXPN | Expand the mailing list |
[RFC821] |
SHELP | Supply helpful information |
[RFC821] |
STURN | Turn the operation around |
[RFC821] |
S8BITMIME | Use 8-bít data |
[RFC1562] |
SSIZE | Message size declaration |
[RFC1870] |
SVERB | Verbose |
Allman |
SCHUNKING | Chunking |
[RFC1830] |
SBINARYMIME | Binary MIME |
[RFC1830] |
SPIPELINING | Command Pipelining |
[RFC1854] |
SDSN | Delivery Status Notification |
[RFC1891] |
SETRN | Remote Message Queue Starting |
[RFC1985] |
SSTARTTLS | Secure SMTP |
[RFC2487] |
SAUTH | Authentication |
[RFC2554] |
SENHANCEDSTATUSCODES | Enhanced status codes |
[RFC2034] |
SDELIVERBY | Deliver By | [RFC2852] |
ukázková SMTP komunikace
telnet mail.example.com 25 nebo netcat mail.example.com 25
S: server
C: client
C: navázání spojení se serverem (zpravidla na TCP portu 25)
S: 220 mail.example.com ESMTP Postfix
C: HELO example.net
S: 250 Hello example.net
C: MAIL FROM:
S: 250 Ok
C: RCPT TO:
S: 250 Ok
C: DATA
S: 354 End data with .
C: Subject: test message
C: From: sender@example.net
C: To: friend@example.com
C:
C: Hello,
C: This is a test.
C: Goodbye.
C: .
S: 250 Ok: queued as 12345
C: QUIT
S: 221 Bye
kódy odpovědi SMTP
kód | význam |
2xx | příkaz byl přijat |
3xx | příkaz byl přijat, ale čeká se na další informace |
4xx | příkaz nebyl přijat, dočasná chyba |
5xx | příkaz nebyl přijat, pernamentni chyba |
Koho můžeme potkat v souvislosti s el. poštou?
- alias postmaster@ je povinný podle RFC2142
MTA | vlastnosti |
postfix |
- modulární
- nízká oprávnění
- chroot /var/spool/postfix
- snaží se nepoužívat statické buffery pro dynamická data
- kontroluje proměnné prostředí
- DSN, IPv6, LDAP, SQL, MIME, SASL, TLS
- pluginy SPF, DomainKeys, DKIM, SenderID, sendmail milter
|
sendmail |
- nepříliš čitelná konfigurace, makrojazyk M4
- podpora milteru (od v8.12)
- vývoj postupně převzal MeTA1
- monolitický
- nízká bezpečnost (hlavně dříve)
|
qmail |
- bezpečný (proti přetečeny zásobníků, haldy, formátovacím řetězcům
- modulární
- nízká oprávnění jednotlivých procesu (každý proces jiná)
- nízká až mizivá četnost update (viz. odměna za odhalení bezp. chyby)
- zavedl Maildir
|
exim |
- monolitický, ale relativně bezpečný
- content filter
- ACL listy
- nemá vlastního správce fronty (výkonnost)
|
Microsoft Exchange |
- sdílení zdrojů (kalendáře, kontakty, úlohy)
- mobilní a webový přístup
- antispam, antivirus
- podpora clusteringu a replikace dát
- MAPI, uzavřeny RPC protokol
|
MDA | vlastnosti |
procmail |
- filtrování a třídění zpráv do složek dle hlaviček
- autoodpovidac
- spuštění procmailu na příchozí postu v souboru ~/.forward
- nastavení v souboru ~/.procmailrc
- pravidlo ve tvaru :0 [flags] [ : [locallockfile]]
- flags (H - hledej v hlavičce /default/, c - výtvor kopii,
! - opak podmínky)
- 0 nebo více podmínek, podmínka začíná *
|
maildrop |
- filtrování a třídění zpráv do složek dle hlaviček
- napsaný v C++, větší než procmail, ale efektivnější při práci
se zdroji.
- velké maily skenuje jako soubor /tmp a nenačitá je do paměti
- jazyk pro filtrování je strukturovaný (if, $size, regexp,
foreach)
- adresář ~/.mailfilters se používá v embedded módu
- maildrop -m nebo maildrop -M (spuštěno jinou aplikaci
- nastavení v souboru ~/.mailfilter
- maildirmake, podpora kvót
|
MUA | implementace |
textové |
|
grafické |
- Mozilla Thunderbird
- Evolution
- Microsoft Outlook
- Kmail
|
webmail |
|
MSA | vlastnosti |
MSA |
- mezi MUA a MTA
- provádí kontroly FQDN, relay, hlaviček, existence lokálních
jmen
- RFC 4409, RFC 5068, port 587
- požaduje, aby byl klient autorizovaný a autentifikovany
|
Kde můžeme o poště zaslechnout?
25 | SMTP |
80 | HTTP (webmail) |
110 | POP3 |
143 | IMAP4 |
443 | HTTPS (webmail) |
465 | SSMTP |
587 | SUBMISSION |
993 | IMAPS |
995 | POP3S |
viz. /etc/services
Jak se MUA k poště dostane?
- POP3
- protokol pro získání pošty že vzdáleného serveru (TCP/IP)
- možnost "nechat zprávy na serveru", používá POP3 UIDL
- standardně nešifrované spojení
- autentizace APOP / SASL
- pomoci TLS/SSL a ESMTP odpověď STLS - POP3S
- příkazy LIST, RETR, DELE, QUIT, USER, PASS, UIDL, ...
- odpovědi +OK nebo -ERR
- telnet mail.example.net 110 nebo netcat mail.example.net 110
- UW IMAP, Cyrus IMAP, Dovecot, Qpopper, Courier Mail Server
- IMAP4
- dovoluje přistupovat ke schránce na vzdáleném serveru
- online / offline mód
- trvale připojení k serveru
- stažení jen části zprávy / části přílohy
- pomoci příznaků se udržuje stav zprávy
- přístup více uživatelů k jednomu mailboxu současné
- příkazy LIST, STATUS, CREATE, EXPUNGE, ...(nejsou čase-sensitive)
- . list "" "*" vypsání všech složek, . logout odhlášení
- znak '.' na začátku každého příkazu je identifikátor spojení,
např. a01
- telnet mail.example.net 143, netcat mail.example.net 143
- openssl s_client -connect mail.example.net:993 (šifrované)
- lokální přístup
- přístup přímo k mailboxu (mbox/Maildir) pomoci filesystemu
Jak vypadá zpráva?
- formát emailové adresy:
- místní část - obvykle jméno uživatele
- oddělovač @
- název domény
- obálka (envelope)
- hlavička (header)
- hlavičky (záhlaví) - To, From, Subject, Date
Content-type, Message-Id, Reply-to, Received
- Received není povinné záhlaví, ale obvykle je přidáno každým
MTA, přes který zpráva projde
- jednotlivá záhlaví jsou oddělena od informace znakem ':'
- záhlaví může být víceřádkove - každá další řádky začíná ' '
nebo '\t'
- oddělit od těla prázdným řádkem
- tělo (body)
- vyžaduje ASCII text
- max. 998 řádku
- max. 78 znaků na řádek
- netextové informace musí být kódovaný - uuencode nebo MIME
Kam se zpráva uloží?
- Maildir
- 1 zpráva = 1 soubor, nejsou problémy se zamykáním
- unikátní jméno v /tmp/unique přesun do /new/unique
- adresář Maildir, podadresáře /cur, /new, /tmp
- Maildir++, quoty, podslozky, název začíná '.'
- link(), unlink(), stat()
- mbox
- celý mailbox = 1 soubor
- začátek zprávy From:
- zamykání fcntl(), flock(), dot locking
- některé MUA vkládají Status (je-li zpráva přečtena)
Nevyžádaná pošta?
Struktura Postfixu
Schéma architektury (převzato z http://www.akadia.com/services/postfix_mta.html)
Během svého průchodu systémem Postfix se zprávy nacházejí v různých frontách
zpráv. O jejcih přesun mezi nimi se stra správce fronty (qmgr).
- postqueue - dokáže odeslat zprávy z fronty
- postsuper - dokáže smazat / pozastavit zprávu
- postcat - dokáže vypsat zprávu
- mailq / pfqueue - nástroje pro práci s frontami
Fronty zpráv
název | význam |
maildrop |
sem se vloží nová zpráva, která vznikla lokálně v systému |
incoming |
příchozí lokální nebo z Internetu, prošly očistou a čekají na
zpracování |
active | přesunuté z incoming, právě zpracovávané |
deferred | dočasně odložené, z důvodů chyby |
Celý systém řídí residentni démon Master, který spouští jednotlivé démony
(služby) podle potřeby. Neboť přistupuje k službám systému vyžadujícím
oprávnění administrátora (root) i proces sám, toto oprávnění potřebuje. Ostatní
démoni běží pod neprivilegovaným uživatelem definovaným v konfiguraci (postfix).
Existuje čtvero způsobu jak se může zpráva objevit v systému.
- zpráva přijata lokálně
- zpráva přijata přes síť
- zpráva znovu vložena do fronty k dalšímu zpracování
- systém generuje chybovou zprávu
Komponenty systému Postfix
název | funkce |
sendmail |
slouží pro odeslání (vytvoření) zprávy Postfixu, je kompatibilní se
Sendmailem |
pickup |
sleduje adresář (frontu) maildrop. V případě že se objeví nová zpráva,
ujme se ji a předá ji démonů cleanup |
cleaner |
přidává chybějící hlavičky; může překládat podle kanonických nebo
virtuálních mapování; informuje qmgr o nové zprávě v incoming frontě |
qmgr |
správce fronty; kontaktuje démony doručení (local, pipe, smtp);
informuje o přesunutí adresy |
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;
příp. (procmail/maildrop) |
pipe | posílá zprávy rourou pro jiné transporty;
např. UUCP |
resolve |
rozlišuje mezi lokálním a vzdáleným doručením; může se orientovat podle
transport_table |
Konfigurace Postfixu
O konfiguraci postfixu rozhodují převážně dva soubory master.cf a main.cf
(obvykle umístěné v /etc/postfix).
formát master.cf
# ==========================================================================
# service type private unpriv chroot wakeup maxproc command + args
# (yes) (yes) (yes) (never) (100)
# ==========================================================================
smtp inet n - - - - smtpd
název sloupce | význam |
service | název služby |
type | transport type, inet, fifo, unix |
private | omezení přístupu pouze pro Postfix |
unpriv | nízká oprávnění |
chroot | změna kořenového adresáře |
wakeup | jak často kontrolovat |
maxproc | max. počet procesů |
command + args | příkaz, -o parametry, -v upovídanost |
důležité volby main.cf
soubor se dá editovat ručně pomocí textového editoru nebo pomocí příkazu
postconf -e "volba = hodnota". S volbou -d dostaneme defaultní nastavení a
s volbou -n nastaveni, které je změneno oproti defaultnímu nastavení.
Systém Postfix je v podstatě schopen ihned fungovat s defaultním
nastavenim, pokud nastavíme alespoň doménu, kterou spravujeme
Postfix používá několik způsobů pro ukládání hodnot. Mohou být odděleny
mezerou, čárkou, novým řadkem, ... nebo mohou být uloženy ve vyhledávacích
tabulkách. Podporované typy zjistíme pomoci postconf -m, tabulku v
požadovaném formátu vytvoříme pomocí postmap
typ_tabulky:/cesta/k/tabulce/tabulka. V případě aliasů se používá
postalias, příp. newaliases
- postfix reload - znovu načte konfigurační soubory
- postfix stop/postfix start - vypne/spusti Postfix
- postfix check - zkontroluje konfiguraci
název volby | význam, hodnota |
myhostname | název stroje, FQDN, gethostbyname |
mydomain | doména, příp. vynechá první část myhostname |
myorigin | standardně myhostname, dá se nastavit mydomain |
mydestination | které domény přijímáme |
mynetworks | které stroje, sítě jsou autorizované |
queue_directory | zapíná chroot |
local_recipient_maps | definuje, které uživatele systém má (zná) |
relay_domains | pro které domény děláme backup MX |
Open Relay - je systém, který dovoluje odesílání pošty pro kteroukoliv doménu
Jak se Postfixu prokážeme?
SASL je metoda, která zpřístupňuje externí ověřovací mechanismy. Jejím
účelem je ověření klientů při snaze pracovat se serverem (zdrojem).
- PLAIN
- LOGIN
- OTP
- DIGEST-MD5
- KERBEROS
- ANONYMOUS
Některé volby SASL
volba | význam,hodnota |
smtpd_sasl_auth_enable | povoluje používání SASL (SMTP AUTH) |
broken_sasl_auth_clients | podpora pro klienty,
co neumí poznat SMTP AUTH |
smtpd_sasl_security_options | můžeme vypnout např. mechanismus ANONYMOUS
pomocí volby noanonymous |
Postfix komunikuje šifrovaně
Postfix umužnuje používat šifrovanou komunikaci jak pro spojení mezi
servery, tak při spojení mezi klientem a serverem. (ve smyslu smtp a
smtpd). Používá certifikáty podepsané certifikační autoritou. Pomáhá
zabezpečit hesla v plain textu i komunikaci samotnou.
Některé volby SSL
volba | význam,hodnota |
smtpd_tls_auth_only | vyžaduje komukaci TLS |
smtp_use_tls | TLS pro klienta |
smtpd_use_tls | TLS pro server |
smtpd_tls_*file | umístění souborů s cert. |
Jak se umí Postfix vypořádat se nevyžádanou poštou
ukazkova komunikace SMTP
server: 220 smtp.example.com ESMTP Postfix -- smtpd_client_restrictions
klient: HELO mail.ora.com
server: 250 smtp.exmaple.com -- smtpd_helo_restrictions
klient: MAIL FROM:
server: 250 OK -- smtpd_sender_restrictions
klient: RCPT TO:
server: 250 OK -- smtpd_recipient_restrictions
klient: DATA
server: 354 End data with . -- smtpd_data_restrictions
klient: To: Kyle Dent
From:
Subject: SMTP Example -- header_checks
This is a message body.
It continues until a dot
is typed on a line by itself.
. -- body_checks
Některé zajímavé volby
volba | význam,hodnota |
permit_mynetworks | považuje hosty uvedéne v
mynetworks za oprávněné |
reject_rbl_list | definuje server s RBL listem |
reject_uknown_client | zakáže klienty bez PTR |
smtpd_helo_required | požaduje záhájení komunikace
příkazem HELO |
reject_unknown_hostname | zakáže klienty,
kteří nemají A nebo MX záznam |
reject_non_fqdn_hostname | zakáže klienty bez FQDN |
permit_mx_backup | přijme poštu, pokud je náš
mailserver uveden v DNS pro tuto doménu |
Literatura
- Archív referátů
- Postfix: kompletní průvodce, Kyle D. Dent, Wietse Venema, Ludvík
Roubíček, Vydavatel: Grada Publishing a.s., 2005, ISBN 8024710293,
9788024710297, 237s
- RFC1562,
RFC1830,
RFC1854,
RFC1870,
RFC1891
- RFC1985,
RFC2034,
RFC2142,
RFC2487,
RFC2554
- RFC2821,
RFC2852,
RFC385,
RFC4409,
RFC5068
- RFC5321,
RFC821,
RFC976
- Wikipedia Dovecot
- Wikipedia Exim
- Wikipedia IMAP4
- Wikipedia Mail Delivery Agent
- Wikipedia Mail Transport Agent
- Wikipedia Mail Submission Agent
- Wikipedia Maildrop
- Wikipedia Maildir
- Wikipedia Mail User Agent
- Wikipedia Mailbox
- Wikipedia MIME
- Wikipedia Microsoft Exchange Server
- Wikipedia Postfix (software)
- Wikipedia POP3
- Wikipedia Procmail
- Wikipedia Qmail
- Wikipedia SMTP
- Wikipedia Spamassassin
- Wikipedia Transport Layer Security
- Wikipedia Sendmail
- Accessing
an IMAP email account using telnet :: bobpeers.com:
- Postfix -
the Sendmail replacement
- Email History, How
Email Was Invented
-
The history of email