Kategória: Linux a sieť

Zmenené: 3. december 2011

SSL pre klienta Exim4

Pravdepodobne každý vie, že posielanie prihlasovacích údajov a dát v nezašifrovanej forme internetom umožňuje prakticky komukoľvek obsah komunikácie zachytiť a použiť. vedia to aj autori poštového servera Exim4, čo však robiť, keď sa vám do cesty postaví T-Com, ktorý šifrovanie zablokuje?

Nastaviť si vlastný poštový (SMTP) server nie je v Linuxe žiadny problém. Stačí mať splnených niekoľko podmienok:

  • mať pevnú verejnú IP adresu a
  • správne nastavený DNS záznam (MX).

Toto však nie je bežné pre domáce počítače, najmä pre tie, ktoré sa pripájajú pomocou ADSL. V takom prípade pomáha technológia priateľského (smarthost) SMTP servera, ktorým je poštový server, prostredníctvom ktorého posielate emaily z poštového klienta. V takomto prípade sa nemusíte o vyššie spomenuté podmienky vôbec starať.

Kde je problém?

Predvolený poštový server Debianu je Exim4, a samozrejme aj tento dokáže takto pracovať, teda vystupovať v roli klienta. Hoci toto nastavenie nevyužívam na reálne odosielanie emailov z poštového klienta, nastavujem takto Exim4, aby som dostával systémové správy (najmä chybové) na reálnu emailovú adresu. Východzie nastavenie Exim4 v Debiane používa bezpečné SMTP, tak ako je definované RFC 3207, teda komunikáciu začína nešifrovane, potom sa pomocou STARTTLS prepína na bezpečnú komunikáciu a až potom pokračuje v prihlásení a posielaní správ(y).

Ak váš smarthost neposkytuje STARTTLS, máte smolu, pretože Exim4 odmietne odoslať prihlasovacie údaje otvorene, teda v nešifrovanej forme. Práve toto mi v posledných dňoch spôsobilo trochu vrások, pretože nové pripojenie k internetu, ktoré do škôl za štátne peniaze zavádza T-Com, vstupuje do SMTP komunikácie a STARTTLS blokuje. Môžem síce len predpokladať, ale pochybujem že to bolo chybou technika, pretože toto blokovanie mi potvrdili viacerý kolegovia z rôznych škôl. No a ak to nebolo chybou technika, potom je to už len cielený útok na ochranu súkromia, pretože posielanie pošty cez internet nešifrovane ja ako posielanie pohľadníc – prakticky každý, kto s tým pracuje, si môže jednak prečítať vaše správy a jednak získať vaše prihlasovacie údaje.

Moja celkom prvá reakcia bola povoliť nešifrované prihlásenie, slúži na to konfiguračné makro, ktoré patrí do súboru /etc/exim4/exim4.conf.localmacros:

AUTH_CLIENT_ALLOW_NOTLS_PASSWORDS = true

Zdôrazňujem, toto riešenie je síce rýchle, ale v žiadnom prípade nie správne. Po reštarte už síce môj poštový server znova dokázal odosielať emaily, ale neuspokojilo ma to. Popátral som, čo že mi to môj server u poskytovateľa (hostingu) vlastne poskytuje a zistil som, že okrem štandardného portu SMTP (25/tcp), poskytuje aj neštandardné SMTPS na porte 465/tcp.

Bola to správa, ktorá ma potešila a okamžite som Eximu nastavil adresu smarthost aj s číslom portu (dve dvojbodky):

smtp.domena.sk::465

Reštartoval som server, ale na moje sklamanie to nefungovalo. zahĺbal som sa do dokumentácie Eximu a zistil som, že to fungovať ani nebude, pretože Exim tento neštandard (tls-on-connect) v režime klienta nepodporuje, no a po chvíľke ďalšieho pátrania sa začalo rysovať riešenie: Stunnel.

Stunnel

Stunnel je softvér, ktorý dokáže vytvárať bezpečné spojenie ako medzi nezabezpečnými klientom i serverom, tak i medzi klientom a serverom, z ktorých TLS nepodporuje len jeden. Keďže oficiálne úložisko balíkov Debianu Stunnel poskytuje, je inštalácia jednoduchá:

aptitude install stunnel4

Po nainštalovaní nie je Stunnel spustený, musíte jeho spustenie povoliť v súbore /etc/default/stunnel4 nastavením premennej:

ENABLED=0

A samozrejme, pred spustením musíte nastaviť príslušné tunely v súbore(och) v /etc/stunnel/*.conf (po nainštalovaní je tam len jeden). Keďže už v systéme Stunnel používam v režime server a na tunelovanie potrebujem režim klienta, nezasahoval som do týchto súborov, ale pridal som príkaz na spúšťanie stunnel do /etc/rc.local, pretože na takúto jednorázovú úlohu považujem vytváranie samostatného štartovacieho skriptu za zbytočne komplexnú úlohu.

Do spomínaného /etc/rc.local, ešte pred príkaz exit 0 na jeho konci, som pridal:

/usr/bin/stunnel -P/var/run/smtpstunnel.pid -c -d 127.0.0.10:465 -r smtp.domena.sk:465 || true

Prepínače tohoto príkazu sa postarajú o vytvorenie bezpečného tunela medzi adresami 127.0.0.10:465 na lokálnej strane a smtp.doména.sk:465 (doplňte si svoje) na strane vzdialenej. Prepínač -c sa postará o spustenie v režime klienta a prepínač -P sa postará o vytvorenie zadaného súboru s PID procesu. Príkaz true za dvojitou rúrou sa postará o to, aby vykonanie príkazu vždy vrátilo úspech, a to i v prípade, že z nejakého dôvodu nenaštartuje. Ak niekoho napadne, že to nie je najvhodnejšie riešenie, bude mať pravdu, avšak je plne postačujúce. Ak si chcete nastavenia ďalej vylepšiť, používajte na spustenie stunnel príkazový riadok, kým voľby príkazu nevyladíte k svojej spokojnosti a až potom príkaz prekopírujte do lokálneho štartovacieho skriptu, ktorý sa potom postará o vytvorenie tunela po štarte systému.

Že je bezpečný tunel spustený si môžete overiť pomocou príkazu netstat:

netstat -tnlp | grep stunnel
tcp 0 0 127.0.0.10:465 0.0.0.0:* LISTEN 820/stunnel4

Tip

Ak vás zaráža adresa 127.0.0.10, vrátim sa k nej neskôr.

Nastavenie Exim4

Po príprave tunela možno nastaviť Exim4 tak, aby namiesto skutočného smarthost používal ako vstupný bod lokálny koniec vytvoreného tunela, teda adresu a port 127.0.0.10:465. Keďže som nechcel aby bol vstup do tunela prístupný zo siete, zvolil som lokálnu adresu a využil som to, že na loopback je v Linuxe smerované všetko v sieti 127.0.0.0/255.0.0.0. Ak by som použil štandardnú adresu 127.0.0.1, musel by som Eximu zložito vysvetľovať, že má akceptovať smerovanie cez lokálneho hostiteľa, ale na šťastie Exim za lokálneho hostiteľa považuje len adresu 127.0.0.1, a tak použitím 127.0.0.10 toto nastavenie obchádzam.

V tomto okamihu teda možno do nastavenia Eximu zadať novú adresu adresu pre smarthost (v súbore /etc/exim4/update-exim4.conf.conf):

dc_smarthost='127.0.0.10::465'

Ak ste ešte nemali smarthost nastavený, treba nastaviť aj:

dc_eximconfig_configtype='smarthost'

Ak smarthost vyžaduje autentifikáciu, je treba pridať záznam do súboru /etc/exim4/passwd.client, pričom predchádzajúci záznam nemusíte mazať, stačí pridať nový riadok vo formáte:

127.0.0.10:meno:heslo

No a v prípade štandardného použitia tohoto neštandardu je potrebné nastaviť aj makro na posielanie nešifrovaného hesla v /etc/exim4/exim4.conf.localmacros:

AUTH_CLIENT_ALLOW_NOTLS_PASSWORDS = true

Nastavenie tohoto makra nemusí byť potrebné, v prípade, že na vzdialenom konci nie je reálny server, prijímajúci skutočné TLS pripojenia (tls-on-connect), ale len nejaká obdoba stunnel, ktorá celú komunikáciu predáva na reálny port nešifrovaného SMTP servera (v takom prípade SMTP server po nadviazaní spojenia oznámi používanie STARTTLS). V mojom prípade už smarthost nezačína ďalšie šifrovanie, pretože jeden šifrovaný kanál už otvorený je.

Po tomto hraní sa s nastavením je treba Exim reštartovať, aby sa prejavili zmeny:

invoke-rc.d exim4 restart

Overenie funkčnosti

Ak ste všetko správne nastavili – ak ste si správne nastavili svoje hodnoty, musí všetko fungovať, čo si najjednoduchšie overíte poslaním testovacej správy:

echo "Kontrola spojenia" | mail -s "Testovacia správa" adresa(at)domena.sk

Ak niečo nefunguje, môžete si pozrieť dôvod nedoručenia v zázname /var/log/exim4/mainlog. Ak tam nájdete text podobný tomuto:

550 relay not permitted

Pravdepodobne ste zle nastavili prihlasovacie údaje, ale okrem mena a hesla skontrolujte aj správne zadanú adresu alebo ste zabudli správne nastaviť makro, ktoré povoľuje nešifrované prihlásenie. V opačnom prípade by ste po chvíľke mali mať testovaciu správu vo svojej schránke.

Poslednou úlohou, ktorá mi ostala, je zmeniť si heslo poštovej schránky, pretože som sa k nej niekoľko dní prihlasoval nezabezpečeným spôsobom, a tak neviem, kto všetko teraz môže posielať emaily v mojom mene.