Zjednodušený model elektronické pošty (zdroj):
MUA: Mail User Agent.
Aplikace koncového uživatele (často přímo na jeho stroji), která umožňuje číst a posílat zprávy.
Příklady: mutt
, thunderbird
, elm
, exmh
.
MTA: Mail Transfer Agent.
Program zajišťující přenos zpráv po síti. Běží na serveru, spravuje ji správce. Uživatel k MTA přistupuje skrze protokol E/SMTP ze svého MUA. Komunikuje s dalšími MTA pomocí E/SMTP.
Příklady: postfix
, sendmail
, exim
.
MDA: Mail Delivery Agent.
Program zajišťující doručení do schránky. Typicky běží na serveru. Pracuje v součinnosti s MTA, který běží na stejném serveru. Pokud MTA vyhodnotí, že zpráva je pro uživatele na lokálním serveru, předá ji MDA. MDA se postará o doručení uživateli, typicky pomocí protokolu POP3 nebo IMAP.
Příklady: mail
, deliver
, dovecot
, procmail
(obsolete).
zpráva je složena
Obálku tvoří
MAIL FROM
),MAIL TO
).Obálku generuje MUA, z kterého se zasílá zpráva. Obálka je směrována přes (potenciálně více) MTA až k MDA. MDA buď email doručí nebo generuje chybovou zprávu, kterou zasílá zpět obálkovému odesílateli. MDA se do obsahu zprávy nedívá.
Obsah zprávy tvoří:
Obsah zprávy je textový.
Hlavička je od těla zprávy oddělená prázdným řádkem.
Hlavička obsahuje na každém řádku položku klíč: hodnota. Řádky začínající bílým znakem jsou pokračováním předchozího řádku. Příklad:
From: xhorace4@fi.muni.cz
Received: from aisa.fi.muni.cz (aisa.fi.muni.cz [147.251.48.1])
by arethusa2.fi.muni.cz (Postfix) with ESMTP
for <horacekj@mail.muni.cz>; Sat, 14 Nov 2020 00:06:43 +0100 (CET)
Hlavičky mohou obsahovat pouze ascii znaky → kódování: From: =?UTF-8?Q?Veronika_Burgerov=C3=A1?= <484947@mail.muni.cz>
. Různé způsoby kódování [UAE].
Příklad dat odeslaných MUA:
To: hiddenmail@gmail.com
Subject: Test
MIME-Version: 1.0
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: 8bit
Test Message.
Stejná zpráva na straně příjemce (zkráceno):
Delivered-To: hiddenmail@gmail.com
Received: by 2002:a4f:f142:0:0:0:0:0 with SMTP id y2csp1939743ivn;
Sat, 14 Nov 2020 03:58:38 -0800 (PST)
Return-Path: <root@enygma.cz>
Received: from mail.enygma.cz (enygma.cz. [185.8.236.134])
by mx.google.com with ESMTPS id q11si10505147wrm.30.2020.11.14.03.58.38
for <hiddenmail@gmail.com>
(version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);
Sat, 14 Nov 2020 03:58:38 -0800 (PST)
Received: by mail.enygma.cz (Postfix, from userid 0)
id A9A593F9CA; Sat, 14 Nov 2020 12:57:46 +0100 (CET)
To: me@apophis.cz
Subject: Test
MIME-Version: 1.0
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: 8bit
Message-Id: <20201114115837.A9A593F9CA@mail.enygma.cz>
Date: Sat, 14 Nov 2020 12:57:46 +0100 (CET)
From: root <root@enygma.cz>
Test Message.
Vybrané hlavičky:
From
: mailbox autora/autorů zprávy.Sender
: skutečný odesílatel, je-li ve From
více adres.Reply-To
To
Cc:
carbon copy.Bcc:
blink carbon copy. Odstraní se při odesílání.Message-Id
: unikátní id.References
: ID předchozích zpráv.Received
: každý MTA po cestě přidá jeden takovýto řádek se služebními informacemi.Return-Path
Date
Subject
Keywords
X-*
: nestandardní hlavičky.Umožňuje:
MIME definuje hlavičku Content-Type
, kde mohou být různé věci:
text/plain
: následuje surové tělo zprávy (text/html
).
image/jpeg
, audio/mp3
, video/mpeg
, application/pdf
, …
multipart/*
: zpráva obsahuje více částí. Například text + přílohy (multipart/mixed
), plaintext + html text (multipart/alternative
), … Zpráva obsahuje stromovou hierarchii těchto částí, multiparts lze zanořovat.
Příklad multipart/alternative
:
Content-Type: multipart/alternative; boundary="===============1365185269197219650=="
MIME-Version: 1.0
Subject: Test mail
From: ksi@fi.muni.cz
To: me@apophis.cz
Message-Id: <20201114121018.4F33162145@anxur.fi.muni.cz>
Date: Sat, 14 Nov 2020 13:10:18 +0100 (CET)
--===============1365185269197219650==
Content-Type: text/plain; charset="utf-8"
MIME-Version: 1.0
Content-Transfer-Encoding: quoted-printable
test mail
Hezk=C3=BD den p=C5=99eje\
![KSI Web](https://ksi.fi.muni.cz/img/karlik_color.png){width=3D"40"}
Tady je plaintextov=C3=A1 verze unsubscribe, ale tu snad nikdo ne=C4=8Dte...
--===============1365185269197219650==
Content-Type: text/html; charset="utf-8"
MIME-Version: 1.0
Content-Transfer-Encoding: quoted-printable
<html><p>test mail kyzikos</p>Hezk=C3=BD den p=C5=99eje<br><img src=3D"http=
s://ksi.fi.muni.cz/img/karlik_color.png" alt=3D"KSI Web" width=3D"40" /><hr=
><p style=3D"font-size: 70%;">Na tomto m=C3=ADst=C4=9B je p=C5=99=C3=ADm=C3=
=BD odkaz na odhl=C3=A1=C5=A1en=C3=AD odb=C4=9Bru, kter=C3=BD vypad=C3=A1 t=
akto:<br>Pokud nechce=C5=A1 dost=C3=A1vat tyto notifikace, zm=C4=9B=C5=88 s=
i nastaven=C3=AD na <a href=3D"">KSI webu</a> nebo klikni na <a href=3D"">o=
dhl=C3=A1sit se</a>.</p></html>
--===============1365185269197219650==--
Content-Disposition
:
inline
attachment
Příklad:
$ telnet localhost 25
> Connected to localhost.
> Escape character is '^]'.
> 220 mail.enygma.cz ESMTP Postfix (Debian/GNU)
< HELO enygma.cz
> 250 mail.enygma.cz
< MAIL FROM: apophis@enygma.cz
> 250 2.1.0 Ok
< RCPT TO: me@apophis.cz
> 250 2.1.5 Ok
< DATA
> 354 End data with <CR><LF>.<CR><LF>
< From: apophis@enygma.cz
< To: me@apophis.cz
< Subject: Test mail
<
< This is test message.
< .
> 250 2.0.0 Ok: queued as 8AC963F625
< QUIT
> 221 2.0.0 Bye
Příkazy:
HELO
: navázání spojení.EHLO
: použij ESMPT.AUTH
: autentizace klienta vůči serveru.MAIL FROM
: obálka: odesílatel.RCPT TO
: obálka: příjemce, lze specifikovat vícekrát.DATA
: data zprávy.QUIT
: ukončení relace.VRFY
: ověření validity email schránky.EXPN
: dotaz na členství adresy v mailing listu (vrací obvykle list schránek).SIZE
: dotaz na maximální možnou velikost zprávy.PIPELILING
8BITMIME
Několik možností:
mbox
xhorace4@aisa:~ $ cat /var/spool/mail/xhorace4
From someone@gmail.com Fri Jan 4 17:06:43 2019
Return-Path: <someone@gmail.com>
X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on anxur.fi.muni.cz
...
From ...
From ...
mbox
, ve kterém jsou emaily uloženy za sebou.Maildir
tmp
, new
, cur
.MMDF folder
MH-folder
Kam směrovat poštu pro xhorace@fi.muni.cz
? Tam, kam vede MX
záznam fi.muni.cz
$ dig gmail.com MX
gmail.com. 376 IN MX 5 gmail-smtp-in.l.google.com.
gmail.com. 376 IN MX 40 alt4.gmail-smtp-in.l.google.com.
gmail.com. 376 IN MX 30 alt3.gmail-smtp-in.l.google.com.
gmail.com. 376 IN MX 20 alt2.gmail-smtp-in.l.google.com.
gmail.com. 376 IN MX 10 alt1.gmail-smtp-in.l.google.com.
Více možných serverů – servery se kontaktují vzestupně.
Pozor: gmail-smtp-in.l.google.com
nemůže být CNAME!
…je schránka, do které chodí zprávy pro adresy před zavináčem, které nejsou definovány.
Jak vzniká SPAM?
Open-relay servery.
To jsou servery, které umožňují doručení zprávy komukoliv bez autentizace klienta. Open-relay server je považován za chybu konfigurace serveru. SPAMboti skenují internet a hledají open-relay servery.
Ukradené přístupové údaje uživatele.
I když server přijímá zprávy k odeslání pouze od autentizovaných uživatelů, může těmto uživatelům být odcizen login.
Local-relay
Každý server musí přijímat zprávy pro své uživatele od kohokoliv. To je základní princip SMTP. Proto, pokud se připojíme k relay.muni.cz
, můžeme odeslat SPAM na jakoukoliv adresu @muni.cz bez nutnosti autentizace.
Všechny mechanismy níže, ač se může zdát, že mají zásadní vady, se dnes používají.
Blacklisting https://www.dnsbl.info/
Databáze open-relat serverů a serverů, které rozesílají SPAM. Mailserver lze nakonfigurovat tak, aby nepřijímal zprávy od blacklistovaných serverů.
Graylisting [GRAY]
Mailserver odmítne každý příchozí mail od serveru, který nezná. Pokud se jedná o legitimní zprávu z legitimního serveru, serve se pokusí po nějaké době zprávu odeslat znovu. Po nějakém čase je taková zpráva akceptována (typicky minuty).
SPF – Sender Policy Framework
Mechanismus umožňující e-mail z konkrétní adresy odeslat jen konkrétním počítačům.
$ dig fi.muni.cz TXT
fi.muni.cz. 300 IN TXT "v=spf1 a:minas.ics.muni.cz mx/24 a:relay.fi.muni.cz ip6:2001:718:801:230::3 a:arethusa1.fi.muni.cz a:arethusa2.fi.muni.cz ?all"
Velký problém: přeposílání pošty.
DKIM – Domain Keys Identified Mail
Nesvazuje adresy s konkrétními serveru, místo toho používá mechanismus elektronického podepisování.
$ dig mail._domainkey.enygma.cz TXT
mail._domainkey.enygma.cz. 1658 IN TXT "v=DKIM1;k=rsa;p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDKB+wtXFBQmZBcezAGohHFH9qwnqEWeIdBtGB0CMPSk/vEWn5mfC8vCL5LjSGRjU8HFdNnu12j4oCZaYvqhY8pX0y7P4asdocrFga88OwKR5+luXqhprrxjMDtwU78LB+b7/Cl81rp0N6qFTkPD2zzOkx/AOEIxS3cAV3WbKybkwIDAQAB"
ARC – Authenticated Received Chain [ARC]
Umožňuje přidat hlavičku říkající něco jako “já server X jsem přijal tuto zprávu a ověřil, že DKIM i SPF jsou platné”.
DMARC
Definuje, co má dělat klient, pokud přijme zprávu od sereru a ta neprojde nějakou validací. Uloženo v DNS záznamech.
Úplný příklad příchozí zprávy ze začátku referátu:
Delivered-To: hiddenmail@gmail.com
Received: by 2002:a4f:f142:0:0:0:0:0 with SMTP id y2csp1980638ivn;
Sat, 14 Nov 2020 05:15:00 -0800 (PST)
ARC-Seal: i=1; a=rsa-sha256; t=1605359700; cv=none;
d=google.com; s=arc-20160816;
b=o4ZbLokjmNmhjkCoyVSC1okhFHAZqhzk/dRpqWFnSPTaXH4nxWWJWjD5cbnIyN4F3R
YDvtWk8ScKtPJSdLGxPsIR4re0bZkOSsME52SiRbEUBBvy5DLkuL2PO59iHTG4GqgqH+
NgOsnZmmccpee9P83wYLzGoaKgNZNgdy0ObfEPlfEVYOSzCazMHPc6XElyrMP90/QiFd
Bspp3LHb+WzDCGf1yZ88pSIZu57kGhEg8o/BOECM4ywsvDakml5M6eYUIxRwxtmxrVzM
cDuva9w834xbyCpd19Ca/aUUDUd63HOizZ3GsgkvNAGZZW0lpcxCPVdegD1UeaGIX2ah
po1w==
ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816;
h=date:message-id:subject:to:from:dkim-signature;
bh=C9sWUzGjD5jaBF94rxd7v23cmWPEnAKJgzeQ51cJxXk=;
b=F0o5yumr8+zfaXaVI/M5y0HNMQKekEqb7FrAAmHU61qwQvrb8wWJAD/6wIzvpmrbZu
q1+t6HV0VXDHvOjwP2LBdVx66jN0rUkpstN2C6QC9LnP+BMQg93Gr1QyS+FeBGMZsQLM
oU4J0J6JlWYVyHkN5k4R0SNe1DKo4TsfBtuuF+zMmrjPd1DTFDYFP7LBgRRRd40FuoAs
6rdFqYYVHuAAv/dTVlhsOgae/MGqT06JuhoktbvZD3hq3kl4775Myv/8XrZOK7jJPxqC
DKKRO1FjKwXFjXliybPoOm+GtzlDaEz4voGBqvs2k5vPINe6QKg4fGw5IaOzXYoB5ymn
1Blw==
ARC-Authentication-Results: i=1; mx.google.com;
dkim=pass header.i=@enygma.cz header.s=mail header.b=UE8iA5WA;
spf=pass (google.com: domain of apophis@enygma.cz designates 185.8.236.134 as permitted sender) smtp.mailfrom=apophis@enygma.cz
Return-Path: <apophis@enygma.cz>
Received: from mail.enygma.cz (enygma.cz. [185.8.236.134])
by mx.google.com with ESMTPS id n14si12263514wre.323.2020.11.14.05.14.59
for <hiddenmail@gmail.com>
(version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);
Sat, 14 Nov 2020 05:15:00 -0800 (PST)
Received-SPF: pass (google.com: domain of apophis@enygma.cz designates 185.8.236.134 as permitted sender) client-ip=185.8.236.134;
Authentication-Results: mx.google.com;
dkim=pass header.i=@enygma.cz header.s=mail header.b=UE8iA5WA;
spf=pass (google.com: domain of apophis@enygma.cz designates 185.8.236.134 as permitted sender) smtp.mailfrom=apophis@enygma.cz
Received: from enygma.cz (localhost [127.0.0.1])
by mail.enygma.cz (Postfix) with SMTP id 8AC963F625
for <me@apophis.cz>; Sat, 14 Nov 2020 14:14:37 +0100 (CET)
DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=enygma.cz; s=mail;
t=1605359699; bh=C9sWUzGjD5jaBF94rxd7v23cmWPEnAKJgzeQ51cJxXk=;
h=From:To:Subject:Date:From;
b=UE8iA5WAnxFNqW9frSIvdmT1+LqnjYeQAmkJn2vOMrBUg760vkMOdjuxY9I7Y2dQt
pEDNhdyqavCEH9NB7w6QKGV23jbnGB6R4f9lsTs934oPMovQccgFtZy6XC8PElPpAm
BpPpJZDWB5ogieAmD2k6XR1SD5s0InDN2vhNE0kM=
From: apophis@enygma.cz
To: me@apophis.cz
Subject: Test mail
Message-Id: <20201114131440.8AC963F625@mail.enygma.cz>
Date: Sat, 14 Nov 2020 14:14:37 +0100 (CET)
This is test message.
Všechny předchozí techniky neřešily problém (3) local-relay. Tento problém bohužel nelze řešit jinak, než naučit se rozpoznávat SPAM na základě obsahu zprávy. Dnes různé techniky – např. Spam Assasin.
Spam Assasin = antispamový filter
Nejpožívanější [MCU]:
Postfix = open source nástroj, který se snaží řešit nedostatky Sendmailu.
Konfigurace: typicky v /etc/postfix
.
master.cf
: definuje, které služby mají být zapnuté.
main.cf
: hlavní konfigurace služeb.
myhostname
: jméno SMTP serveru.mydomain
: doména, pro kterou server zpracovává poštu.myorigin
: jméno, které se přidá za @
pro lokálně doručované zprávy.mydestination
: doménová jména, která zpracovává tento server.relayhost
: pokud se má všechan pošta směrovat na jeden server, tady je server uvedený.mynetworks
, inet_interfaces
, inet_protocols
, …smtpd_tls_security_level
, smtpd_use_tls=yes
, smtpd_tls_cert_file
, smtpd_tls_key_file
, smtpd_tls_auth_only
, …virtual_mailbox_domains
, virtual_mailbox_maps
, virtual_alias_maps
, …
virtual_mailbox_domains = mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf
milter
: rozšíření Sendmail / Postfix, které umožňuje řešit filtrování zpráv (SPAM). Umožňuje do Postfix integrovat generování a ověřování DKIM.
Užitečné nástroje:
postqueue
– manipulace s frontrou zpráv.
postqueue -p
: tisk fronty zpráv.postqueue -f
: flush fronty (třeba když chcete znovu zkusit graylisting) :).postsuper
postsuper -d ID
postsuper -d ALL
postsuper -d ALL deferred
postcat
– zobrazit zprávu.
postcat -vq ID
postconf
– validace konfigurace apod., typicky není třeba.Logy:
každá distribuce má jinde, na Debianu v /var/log/mail.log
.
Příklad:
Nov 15 12:26:19 enygma postfix/smtpd[16691]: connect from mxa1.seznam.cz[2a02:598:a::78:90]
Nov 15 12:26:20 enygma postfix/smtpd[16691]: 17DDE3FA46: client=mxa1.seznam.cz[2a02:598:a::78:90]
Nov 15 12:26:20 enygma postfix/cleanup[16698]: 17DDE3FA46: message-id=<24969305-726f-4dac-9e38-d750f5786cd7@email.android.com>
Nov 15 12:26:20 enygma opendkim[534]: 17DDE3FA46: s=beta d=email.cz SSL
Nov 15 12:26:20 enygma postfix/qmgr[8941]: 17DDE3FA46: from=<loskarlos@email.cz>, size=1878, nrcpt=1 (queue active)
Nov 15 12:26:20 enygma postfix/smtpd[16691]: disconnect from mxa1.seznam.cz[2a02:598:a::78:90] ehlo=2 starttls=1 mail=1 rcpt=1 data=1 quit=1 commands=7
Nov 15 12:26:20 enygma postfix/smtp[16700]: 17DDE3FA46: to=<honzah@gmail.com>, orig_to=<me@apophis.cz>, relay=gmail-smtp-in.l.google.com[2a00:1450:400c:c0c::1b]:25, delay=0.75, delays=0.2/0.04/0.23/0.28, dsn=2.0.0, status=sent (250 2.0.0 OK 1605439580 q25si16911083wmq.128 - gsmtp)
Nov 15 12:26:20 enygma postfix/qmgr[8941]: 17DDE3FA46: removed
+