VExim alapú levelező szerver (Wheezy)

Innen: AdminWiki

Ez a leírás házirend szerinti Debian Wheezy komponensekből felépített levélfogadó és levéltovábbító szerver telepítését mutatja be. Technikailag nem használ olyan megoldást, amely miatt dedikált gépre vagy virtuális környezetbe kellene helyezni a szolgáltatást.

Komponensek:

Szolgáltatások:

  • virtuális domainek és userek, user és domain aliasok webfelületű (https) adminisztrációval
  • levélfogadás a fentiek számára SMTP-vel
  • levélküldés a fentiektől SMTP authentikációval (TLS)
  • levél tárolása Maildir-ben, külső hozzáférés IMAP(s), POP3(s) és webmail (https)
  • saját jelszó, forward, vacances adminisztrációja a felhasználók által, webfelületen
  • forrásszűrésen alapuló spamfilter
  • DOS elleni intézkedések

TODO:

  • Exchange-like maildir automatikus létrehozatala
  • felhasználó törlésekor a levelező tárterület automatikus törlése
  • shared folders
  • tartalomszűrésen alapuló spamfilter
  • malware filter

Squeeze megoldás alapján átírás alatt - még ne vedd komolyan!

A megoldás vázlata

  • Egy szervergépen csak egy VExim példányt futtatunk (elvileg lehetséges lenne multiplikálni, TODO!).
  • A leveleket a filerendszerben a mail:mail Linux felhasználó birtokában lévő /var/mail/.vexim gyökerű tárhelyen, domain/user/Maildir alkönyvtárakban maildir formátumban tároljuk.
  • A levélfogadást és az SMTP authentikáció utáni levélküldést az Exim MTA végzi.
  • A virtuális felhasználók authentikációs és egyéb (maildir path, alias, forward, stb.) adatai dedikált MySQL adatbázisban tárolódnak, amihez a VExim PHP alkalmazás nyújt kizárólag https-en elérhető webes adminisztrációs felületet. Az Exim számára az adatbázis használatához szükséges router és transport konfigurációs állományokat a vexim-addons csomag szolgáltatja.
  • A maildir-ekhez a Courier segítségével lehet hozzáférni IMAP(s) és POP3(s) protokollal. A Courier a VExim-mel azonos authentikációs adatbázist használ.
  • A RoundCube MUA kizárólag https-en elérhető web felületen biztosít IMAP klienst, ezzel webmail szolgáltatást.
  • A webmail és az adminisztrációs webfelület azonos virtualhoston üzemelnek (pl. https://mail.mydomain.com/ a webmail, https://mail.mydomain.com/admin az adminisztrációs web).

A megoldás nem befolyásolja az Exim által a helyi Linux (rendszer)felhasználók (pl. smartd, sensord, logcheck és egyéb cron jobok) számára egyébként biztosított levelezést.

Megjegyzés: a megoldás kevés saját elemet tartalmaz, zömmel a közösség által javasolt módszerekre épül (köszönet!), ld. Irodalom.

Előfeltételek

A jelen leírás szerinti levelező szerver egy házirend szerinti szerint LAMP környezetet igényel, a következő kiegészítésekkel:

  • wsm2 LAMP, a php.ini-ben (/etc/php5/conf.d/wsm2-php5.ini) a mail és include funkciók engedélyezve;
  • fix IP cím;
  • Exim4 telepítve, beállítva Internet hostnak, a HELO hostnév megegyezik a DNS reverse-zel.

Gonosz hibalehetőségek (gotchas):

  • az /etc/hosts-ban a gép hostneve (ld. hostname --fqdn kimenete) nincs a localhost-hoz rendelve.
    A vexim-addons exim4-routere a hostnévre a localhost-ra feloldást jelentő@ indirekcióval hivatkozik, hogy ne kelljen a konkrét hostnevet ide beírni. Ha a hostnév nem a localhostra mutat, akkor nem számít local domain-nek és az admin levelekre az Exim4 a dnslookup routert fogja hívni, ami a (publikus IP-n) saját gépre mutató névfeloldás esetén hibát ad.
  • az Exim4 telepítésekor nem split configuration-t választottunk.
    Ilyenkor az /etc/exim4/update-exim4.conf.conf-ban dc_use_split_config='false' szerepel. Így a vexim-addons által hozott plusz konfigurációs állományok beállításait - pl. az adatbázis-kapcsolatot - az Exim4 nem fogja figyelembe venni.

Ezeket jobb már most ellenőrizni :-).

Telepítés

A komponensek telepítését az alábbi sorrendben fogjuk elvégezni:

  • MySQL adatbázis és adatbázis-felhasználó elkészítése
  • VExim (az Exim működését vezérlő MySQL adminisztráció webfelületen) + vexim-addons (az Exim és a VExim kapcsolatát megteremtő eszközök, valamint egyéb kiegészítők)

Megjegyzendő, hogy a VExim semmilyen file műveletet nem végez, kizárólag a hozzá tartozó Exim router és transport MySQL-en keresztüli vezérlésével működik! Nézetem szerint ez egy igen biztonságos megközelítés.

  • Courier IMAP, POP3 (felhasználói levélkezelés levelező klienssel)
  • RoundCube (felhasználói levélkezelés webfelületű IMAP klienssel)

VExim és vexim-addons telepítése

MySQL adatbázis elkészítése

Készítsük el a MySQL adatbázist, amelynek egyetlen, az adatbázisra nézve teljes jogú felhasználója van. Az adatbázist és a felhasználót a MySQL root hozzáféréssel hozzuk létre.

mysql --defaults-file=/etc/mysql/root.cnf

mysql> CREATE DATABASE vexim character set utf8;
mysql> GRANT ALL PRIVILEGES ON vexim.* TO 'vexim'@'localhost' IDENTIFIED BY 'PASSWORD';
mysql> FLUSH PRIVILEGES;

ahol a PASSWORD egy megfelelő jelszó. Relatív megjegyezhető, mégis erős jelszó a pwgen segédprogrammal is generálható, pl. a következőképpen:

/usr/bin/pwgen -s -n -c 12 1

Ellenőrizzük, hogy a felhasználó megfelelően létrejött-e:

mysql> SELECT host, user, password FROM mysql.user;
+-----------+------------------+-------------------------------------------+
| host      | user             | password                                  |
+-----------+------------------+-------------------------------------------+
| localhost | vexim            | *A9.............censored................E |
[...]
+-----------+------------------+-------------------------------------------+

mysql> quit

Ezután próbáljunk a létrehozott felhasználó nevében és jelszavával belépni. Az alábbi parancsokkal ellenőrizhetjük, hogy a felhasználó jogosultságai valóban csak erre az adatbázisra terjednek ki:

mysql -u vexim -p
Enter password:

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| vexim              |
+--------------------+

mysql> quit

A felhasználó felvételét és kipróbálását követően töröljük le a .mysql_history állományt, mert ebben a jelszó szabad szöveges formában benne van:

rm ~/.mysql_history

Az adatbázis iniciális feltöltését a telepítő script végzi.

A kódkészlet telepítése

Még alakul!

A VExim a jelen megoldás egyetlen, nem Debian komponense. A jelen leírás készítésekor a VExim aktuális fejlesztői webhelye még nem tartalmaz stabil verziót, így egy (a leírás készítésének idején 2014 májusi állapotú), kódbázisként használt, archivált vexim2 2.2 verziót fogunk használni a saját fejlesztésű vexim-addons tarball-ban található kódkiegészítésekkel. Az egyszerűbb telepíthetőség kedvéért a vexim-addons tartalmazza a módosított és újracsomagolt VEximet, valamint egy ennek telepítésére szolgáló shell scriptet is. A vexim-addons-ban fejlesztői segítségként megtalálható az eredeti kódbázis és a változtatásokat tételesen leíró patch állomány is (ezek a telepítéshez és használathoz nem szükségesek).

Töltsük le a vexim-addons legfrissebb változatát, és rendszergazdaként, a /usr írhatóan újracsatolása után, csomagoljuk ki /usr/local/share/vexim-addons könyvtárba! Ezután indítsuk el a telepítő scriptet a

/usr/local/share/vexim-addons/update_vexim.sh

paranccsal. A telepítő script igyekszik biztonságosan dolgozni, azaz minden lényeges lépéshez engedélyt kér, meglévő telepítést, adatbázist, stb. nem ír felül, így akár többször is, biztonsággal elindítható.

  • Az elindított telepítő engedélyt kér a PHP kód kicsomagolására, és ha engedjük (y), létrehozza az alábbi könyvtárstruktúrát:
/usr/local/share/vexim-versions
                               /vexim2-X.Y-pYYYYMMDD

ahol X.Y a kódbázis verziószáma, pYYYYMMDD az alkalmazott patch azonosítója. A későbbi frissítések hasonló könyvtárakba kerülnek, ezek közül az aktuálisan használt kódverziót symlinkeléssel választhatjuk ki (mivel a telepítő még fut, a symlinket egy másik ablakban, vagy később, a telepítő lefutása után készíthetjük el):

# Symlink az aktuális verzióra
ln -s vexim-versions/vexim2-vexim2-X.Y-pYYYYMMDD /usr/local/share/vexim
chown -h root:www-data /usr/local/share/vexim  # Csak szépség :-)

Ez a symlink biztosítja, hogy esetleges frissítés után is a mindenkori webszolgáltatás kódkészlete a /usr/local/share/vexim útvonalon látsszék.

  • A PHP kód kicsomagolása után a telepítő engedélyt kér a MySQL adatbázis feltöltésére.

Jelenleg a telepítő ezt a lépést csak akkor tudja végrehajtani, ha a MySQL root hozzáférés a házirendünk szerinti /etc/mysql/root.cnf állománnyal biztosított és a vexim adatbázis létezik (más helyzetek kezelése: TODO!). Engedjük az adatbázis feltöltését (y), de a telepítő további lépéseit (Exim4 és Courier konfigurációk beállítása) most még ne futtassuk le (n).