Elektronicka posta

Martin Kudlej, xkudlej@aurora.fi.muni.cz


Obsah


Posielanie emailov

Od cias vzniku elektronickej posty(e-mail, email) sa postovy system sklada zo styroch casti, ktore zarucovali odoslanie a dorucenie emailu.

Dnes su ulohy plnene tymito agentami vacsinou do istej mieri integrovane a spojovane do jednoho programu. Cim sa moze napriklad pri spojeni MUA a MSP objavit nutnost konfigurovat klientsku aplikaciu pre spravne odosielanie posty. Prikladom programu, ktory je "cistym", MUA je mail. Dnes su vsak castejsie pouzivane programy ako napr. mutt, pine alebo graficky klienti KMail alebo Mozilla Thunderbird. Ako historicky standart programu pre odesielanie posty mozeme jednoznacne povazovat program Sendmail, ktory spojuje funkcie MSP a MTA(pozor nie standart v tom, ako ma vyzerat konfiguracny subor). Inymi zastupcami su napr. QMail alebo Postfix. Agentom MDA je program Procmail alebo Maildrop.
Takze postup zaslania spravy je zvycajne jej vytvorenie v MUA(+MSP), ten ju preda MTA. MTA bud priamo spravu doruci do schranky prijemcu(pomocou MDA) alebo zasle dalsiemu MTA. Posledny MTA spravu preda MDA, ktory spravu doruci do prijemcovej schranky. Komunikacia medzi tymito programami prebieha pomocou protokolu SMTP(vid nizsie). Prijemca si svoju postu z postovej schranky vybera bud priamo, alebo castejsie pomocou specialnych protokolov. Najpouzivanejsie su IMAP a POP3 a ich zabezpecene varianty pomocou asymetrickeho sifrovania.


Podoba emailu

Najprv je treba zdoraznit, ze odlisujeme obalku spravy a telo spravy s hlavickami. Obalka obsahuje adresu prijemcu a odosielatela. V zavislosti od toho kadial email prechadza, mozu sa menit aj udaje na obalke(MTA prida stareho odosielatela do hlavicky a noveho zapise do obalky). Obalka zanika v okamihu jej dorucenia a uzivatel sa o nej nedozvie. Telo spravy sa deli na hlavicku a vlastne telo spravy. Specifikacia struktury spravy je uvedena v RFC 822(alebo novsie v RFC 2822) a specifikacia MIME(Multipurpose Internet Mail Extensions) v RFC 2045 az 2047, 4288, 4289, 2049, 2231, 2387. Hlavicka obsahuje doplnkove informacie dopisu. Su tu ulozene informacie o odosielatelovi a prijemcovi, predmet spravy, cas odoslania atd. Telo spravy je urcene pre ludskeho prijemcu a nesie vlastnu spravu. Telo a hlavicka su oddelene prazdnym riadkom. Obvykle hlavicka obsahuje:

Kazda polozka hlavicky ma tvar nazov:hodnota a je ukoncena znakmi(om) ukoncenia riadku. Pokial je hlavicka prilis dlha, moze pokracovat na nasledujucom riadku, ktory zacina znakom TAB(9) alebo medzery(32). Nazov sa striktne sklada zo znakov tlacitelnej ASCII-7(medzi 33 a 126). Vynimkou je prva polozka From , kde su uvedene informacie o smerovani spravy. Tieto informacie obnovuje kazdy system, ktory spravu spracovava. specialnymi hlavickami su hlavicky zacinajuce na X-, ktore si moze kazdy pridat ake chce. Pouzivaju sa napriklad na zaznamenanie informacii antispamoveho filtra, ako je vidiet nizsie.

Priklad emailovej spravy:

From xstancel@aurora.fi.muni.cz Sun Oct 29 22:03:13 2006
Return-path: 
Envelope-to: xkudlej@aurora.fi.muni.cz
Delivery-date: Sun, 29 Oct 2006 22:03:13 +0100
Received: from mail by aurora.fi.muni.cz with spam-scanned (Exim 3.36 #1 (Debian))
  id 1GeHoC-0001Kb-00
  for ; Sun, 29 Oct 2006 22:03:13 +0100
Received: from xstancel by aurora.fi.muni.cz with local (Exim 3.36 #1 (Debian))
  id 1GeHoC-0001KY-00
  for ; Sun, 29 Oct 2006 22:03:08 +0100
Date: Sun, 29 Oct 2006 22:03:08 +0100
From: Radovan =?utf-8?Q?=C5=A0tancel?= | ravas 
To: Martin Kudlej 
Subject: Re: co si si zobral za smtp server na referat?
Message-ID: <20061029210308.GA5069@aurora.fi.muni.cz>
References: 
Mime-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: 
User-Agent: Mutt/1.5.9i
Sender: =?iso-8859-1?Q?Radovan_=A9tancel?= 
X-Spam-Checker-Version: SpamAssassin 3.0.3 (2005-04-27) on aurora.fi.muni.cz
X-Spam-Level: 
X-Spam-Status: No, score=-2.6 required=5.0 tests=AWL,BAYES_00 
  autolearn=disabled version=3.0.3
Status: RO
X-Status: 
X-Keywords:                 
X-UID: 2192

postfix

On Sun, Oct 29, 2006 at 08:09:45PM +0100, Martin Kudlej wrote:
> 

-- 
---------------
Radovan Stancel
email: xstancel@fi.muni.cz
icq: 160770612
be kind to your local god
---------------

Obmedzenie specifikacie RFC 822(zachovalo sa aj do RFC 2822) vsak je fakt, ze dopis moze obsahovat iba textove data. Preto bol vytvoreny novy standart MIME. Tento standart umoznuje prenasat aj multimedialne subory, ale zachovava kompatabilitu s RFC 822. To znamena, ze sa robi konverzia vnutra dopisu tak, aby bolo mozne ho odoslat a dorucit standartnou cestou. Specifikacia sa nachadza v RFC 2045-2047. To ci je email kodovany pomocou MIME zistime z hlavicky dopisu, pokial obsahuje polozku MIME-Version. Ostatne MIME hlavicky zacinaju slovom Content. Content-Type: Urcuje typ a podtyp obsahu, napr. text/plain oznacuje holy text, multipart/mixed oznacuje spravu skladajucu sa z podsprav, ktore maju rozdielny typ obsahu.

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

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--
Slova hlavicky, ktore nie su v ASCII-7, alebo nie su sucastou mime typu, ktory neobsahuje kodovanie, kodujeme vo formate: =?charset?encoding?encoded text?=, napr.
Subject: =?utf-8?Q?=C2=A1Hola,_se=C3=B1or!?=


DNS

Elektronicka adresa se sklada z dvoch casti oddelenych zavinacom. Udaj pred zavinacom sluzi na identifikaciu uzivatela na danom systeme a je spracovavany dorucovacim agentom. Za zavinacom je adresa domeny, kam ma byt zadany email odoslany. Stroj ktoremu sa ma posta pre tuto domenu odoslat je zistitelny z DNS zaznamu danej domeny. Pokial v DNS zaznamoch neexistuje MX zaznam, posta bude odoslana na stroj podla DNS zaznamu(A zaznam). Pokial, ale chceme nastavit postovy server pre celu domenu a nechceme, aby posta prechadzala priamo na uzivatelske stroje, je treba uviest MX zaznamy, ktore specifikuju stroj na ktory ma byt odoslana posta danej domeny ci skupinu strojov. MX zaznamy su urcene prioritou a to tak, ze prenosovy system sa pokusi najprv spojit so strojom, ktory ma najnizsiu prioritu. Pocitace s vyssimi prioritami byvaju zalozne a casto sluzia iba ako docasne uloziste, pokial nie je funkcny hlavny mail server.

$ host -t mx fi.muni.cz
fi.muni.cz mail is handled by 50 relay.muni.cz.

$ dig MX +short=yes fi.muni.cz
50 relay.muni.cz.

$ nslookup 
> set type=mx
> fi.muni.cz
Server:         81.27.192.33
Address:        81.27.192.33#53

Non-authoritative answer:
fi.muni.cz      mail exchanger = 50 relay.muni.cz.

Authoritative answers can be found from:
fi.muni.cz      nameserver = anxur.fi.muni.cz.
fi.muni.cz      nameserver = ns.muni.cz.
fi.muni.cz      nameserver = aisa.fi.muni.cz.
relay.muni.cz   internet address = 147.251.4.35
ns.muni.cz      internet address = 147.251.4.33
aisa.fi.muni.cz internet address = 147.251.48.1
anxur.fi.muni.cz        internet address = 147.251.48.3

Prenos sprav - protokol SMTP

SMTP je protokol, ktory je urceny pre prenasania elektronickej posty. Je definovany normou RFC 821(RFC 1123). Jeho rozsirenim je protokol ESMTP(RFC 2821), ktory definuje niekolko dalsich prikazov, ktore si medzi sebou servery vymienaju. SMTP pracuje na porte 25 protokolu TCP. Minimalna implementacia protokolu musi byt schopna odpovedat na tito prikazy: HELO, MAIL, RCPT, DATA, RSET, NOOP a QUIT.

Priklad spojenia pri pouziti programu telnet:

telnet aurora.fi.muni.cz 25
Trying 147.251.50.200...
Connected to aurora.
Escape character is '^]'.
220 aurora.fi.muni.cz ESMTP Exim 3.36 #1 Mon, 30 Oct 2006 22:23:52 +0100
EHLO
501 Syntactically invalid EHLO argument(s)
EHLO aurora.fi.muni.cz
250-aurora.fi.muni.cz Hello xkudlej at aurora [147.251.50.200]
250-SIZE
250-PIPELINING
250 HELP
MAIL FROM: xkudlej@aurora.fi.muni.cz
250  is syntactically correct
RCPT TO: xkudlej@aisa.fi.muni.cz
250  is syntactically correct
DATA
354 Enter message, ending with "." on a line by itself
Subject: pozdrav od anonyma

Ahoj, ako sa mas?
.
250 OK id=1GeedC-0000rP-00
QUIT
221 aurora.fi.muni.cz closing connection

Protokol SMTP je neautentizovaný a nesifrovany. Server, ktory nema nastavenu ziadne pravidla pre preposielanie a preposiela vsetku postu, o ktorej preposlanie je poziadany, sa nazyva open relay. Taketo servery su/boli pouzivane pre rozosielanie spamu. Existuju databaze takychto serverov, ktore mozu byt potencionalnymi povodcami nevyziadanej posty, napr. ORDB (Open Relay Database). Dalsim riesenim, ako sa branit proti nevyziadanej poste su tzv. black listy, co su zoznamy uzivatelov a domen, ktore su filtrovane, pretoze z nich prichadza nevyziadana posta. Sofistikovanejsou metodou su spamove filtre. Jednym z programov, ktory takuto filtraciu robi je spam assassin. Ten prechadza prichodziu postu a v jej obsahu hlada znaky nevyziadanej posty. Kazdej podobnosti je priradena urcita "trestna bodova hodnota" a pokial sucet tychto trestnych bodov dosiahne administratorom urcenu hodnoty, je mail oznaceny za spam. Dalsou moznostou, ako odhalit spam, su tzv. databaze spamu. Prichodzi email je zahashovany nejakou funkciou a vysledok je porovnany s databazou.


Exim server

Po nainstalovani eximu(pre jednoduchost verzie < 4) pomocou apt-get, uzivatela nasmeruje sprievodca instalaciou(opatovne spustenie je mozne programom /usr/sbin/eximconfig). Pre zakladne vygenerovanie konfiguracnych suborov, je tato moznost postacujuca. Sprievodca podla volieb(mailovy server) zmenil subory /etc/exim/exim.conf /etc/aliases /etc/mailname. V subore /etc/mailname sa nachadza meno domeny. V subore /etc/aliases sa nachadzaju alternativne pomenovania pre mailove schranky uzivatelov, napr. mail zaslany na nobody sa doruci do schranky postmaster, pricom mozu byt uvedene aj plne adresy do cudzich domen.

##Hlavna konfiguracia

#Specifikuje domenu
qualify_domain = kybela.localdomain
#lokalne domeny
local_domains = localhost:kybela.localdomain
#vykonavanie reverznych DNS dotazov
host_lookup = *
#pre ktore IP adresy povolujem prenos sprav
host_accept_relay = 127.0.0.1 : ::::1 : 192.168.0.0/24
#povolenie prikazu VRFY
smtp_verify = true
#maximalny pocet sprav na jedno pripojenie
smtp_accept_queue_per_connection = 100
#pokial je sprava neprijata, tak ju poslat postmastrovi
freeze_tell_mailmaster = true
#Podoba polozky Received v hlavicke
received_header_text = "Received: \
         ${if def:sender_rcvhost {from ${sender_rcvhost}\n\t}\
         {${if def:sender_ident {from ${sender_ident} }}\
         ${if def:sender_helo_name {(helo=${sender_helo_name})\n\t}}}}\
         by ${primary_hostname} \
         ${if def:received_protocol {with ${received_protocol}}} \
         (Exim ${version_number} #${compile_number} (Debian))\n\t\
         id ${message_id}\
         ${if def:received_for {\n\tfor <$received_for>}}"
#kontrola prijemcu pred prijatim spravy
receiver_try_verify = true

#########################
##Konfiguracia zasielania

#nastavenia lokalneho dorucovania
local_delivery:
  driver = appendfile
  group = mail
  mode = 0660
  mode_fail_narrower = false
  envelope_to_add = true
  return_path_add = true
  file = /var/mail/${local_part}

#nastavenie pre procmail
procmail_pipe:
  driver = pipe
  command = "/usr/bin/procmail"
  return_path_add
  delivery_date_add
  envelope_to_add
# check_string = "From "
# escape_string = ">From "
  suffix = ""

remote_smtp:
  driver = smtp
# authenticate_hosts = smarthost.isp.com

###########################3
##Konfiguracia spracovania lokalnych adries

#spracovanie aliasov
system_aliases:
  driver = aliasfile
  file_transport = address_file
  pipe_transport = address_pipe
  file = /etc/aliases
  search_type = lsearch

#spracovanie suboru uzovatelov .forward
userforward:
  driver = forwardfile
  file_transport = address_file
  pipe_transport = address_pipe
  reply_transport = address_reply
  no_verify
  check_ancestor
  check_local_user
  file = .forward
  modemask = 002
  filter

#nastavenie spustania procmailu, pokial uzivatel ma .procmailrc
procmail:
  driver = localuser
  transport = procmail_pipe
  require_files = ${local_part}:+${home}:+${home}/.procmailrc:+/usr/bin/procmail
  no_verify

#######################
#Autentifikacne nastavenie - priklad

# plain:
#   driver = plaintext
#   public_name = PLAIN
#   client_send = "^username^password"
#
# login:
#   driver = plaintext
#   public_name = LOGIN
#   client_send = ": username : password"
#
# cram_md5:
#   driver = cram_md5
#   public_name = CRAM-MD5
#   client_name = username
#   client_secret = password
Exim ma v sebe niekolko testovacich rezimov. Jednym z nich je kontrola prepisovania adries.
$ exim -brw user   
  sender: user@kybela.localdomain
    from: user@kybela.localdomain
      to: user@kybela.localdomain
      cc: user@kybela.localdomain
     bcc: user@kybela.localdomain
reply-to: user@kybela.localdomain
env-from: user@kybela.localdomain
  env-to: user@kybela.localdomain


Zdroje

Nastavení postovniho subsystemu v Linuxu - II
Nastavení postovniho subsystemu v Linuxu - I
Wikipedia
Archiv predmetu PV090
Testovani sluzeb mailserveru telnetem
Ako funguje e-mail
LINUX - Dokumentacny projekt; ISBN 80-7226-114-2, Computer Press 1998