Egyszerű email-szerver építése

A Unix/Linux szerverek üzemeltetése wikiből

Írta: Polgár Csaba

Tartalomjegyzék

1 Célkitűzés

A következőkben egy általam használt, egyszerű email-szerver építését, beállítását fogom bemutatni Debian operációs rendszer felett. A célunk egy egyszerű, mégis jól használható szerver megépítése, egyszerűen hozzáadható felhasználókkal, POP3- és IMAP-támogatással, valamint weben elérhető postafiókokkal. A szerver virtuális felhasználókkal dolgozik, amelyeket adatbázisból ér el (ld. később). A leírás során a mydomain.hu példa-domainnel fogom bemutatni a beállításokat.

A felhasznált programok:

2 Az adatbázis

Mint ahogy szó volt róla, virtuális fiókokat, felhasználókat fogunk alkalmazni. Ezt azt jelenti, hogy a "hagyományos" megoldással szemben, ahol minden e-mail címhez tartozik egy unix/linux felhasználó is, itt azok csupán egy adatbázisban léteznek. A megoldásnak sok előnye van:

  • egyszerű karbantartás, akár webes felületről: felhasználó hozzáadása, törlése, módosítása könnyen megoldható.
  • biztonságosabb: nincs adott esetben sokszáz potenciális behatolási pont a rendszerbe.
  • átláthatóbb: nem "szemeteli" össze a rendszert, nem keverednek össze a belépésre szinte sosem használt userek a valódi felhasználókkal.

A leveleket a /home/vmail/ könyvtárban tároljuk, ezen belül alkönyvtárakban domain és felhasználó-név szerint. Tehát a bela@mydomain.hu címre érkező levelek a /home/vmail/mydomain.hu/bela/ könyvtárba kerülnek.

2.1 Postgresql

Adatbázis-programnak a postgresql-t használtam. Természetesen mindez nagyon hasonlóan megoldható pl. MySQL alkalmazásával is.

Installáljuk a postgresqlt:

aptitude install postgresql

Váltsunk át a postgres rendszer-felhasználóra, hogy be tudjuk állítani az adatbázist:

su postgres

Hozzuk létre a tábla gazdáját, a vmail adatbázis-felhasználót, a titkosjelszo jelszóval védve. Megkérdezi, hogy milyen joggal hozza létre, nem kell neki semmi.

createuser -P vmail

Hozzuk létre a felhasználókat tároló mails adatbázist, amelynek gazdája a vmail adatbázis-felhasználó lesz:

createdb -O vmail mails

2.2 A tábla beállítása

A mails adatbázis users táblájában tároljuk az egyes felhasználókat. Felépítése nagyon egyszerű, mindössze három oszlopot tartalmaz:

  • username: az e-mail cím @-tól jobbra eső része
  • domain
  • password: a felhasználó jelszavának MD5 hashe.

Még mindig a postgres rendszer-felhasználó nevében lépjünk be az újonnan létrehozott mails adatbázisunkba:

psql -d mails

Itt tudunk SQL-parancsokat futtatni. Hozzuk létre a táblánkat:

CREATE TABLE users
(
   username character varying NOT NULL, 
   "domain" character varying NOT NULL, 
   "password" character varying NOT NULL, 
   CONSTRAINT primary_key PRIMARY KEY (username, "domain")
) WITH (OIDS=FALSE)
;
ALTER TABLE users OWNER TO vmail;

Végül lépjünk ki a postgresql konzoljáról, és a postgres felhasználó shelljéből is:

\q
exit

Ezután ízlés szerint írhatunk egy php scriptet, amivel új felhasználókat és domaineket adhatunk hozzá a rendszerünkhöz.

3 A fájlrendszer

Ahogy korábban láttuk, a leveleket a /home/vmail/ könyvtárban tároljuk, domain és user szerint csoportosítva. A könyvtár tulajdonosa a vmail felhasználó lesz. Hozzuk tehát létre őt és a csoportját is, előre beállított uid illetve gid-vel:

groupadd --gid 5000 vmail
useradd --create-home --gid 5000 --uid 5000 --shell /bin/false vmail

4 Postfix

A Postfix az SMTP-szerver, küldi és fogadja a leveleket. Debian alatt az alábbi paranccsal installálhatjuk, a postgresql támogatással együtt (ütközik a hasonló funkcionalitású exim csomaggal - nyugodtan távolítsuk el azt):

aptitude install postfix postfix-pgsql

A telepítő megkérdez néhány dolgot, ezekre válaszoljunk.

4.1 Konfigurálás

A konfiguráció fájl az /etc/postfix/main.cf. A meglévő, alap fájl módosításával tudjuk beállítani a szerverünket. A legfontosabb beállítások a következőek, ezeket írjuk át:

myhostname = mydomain.hu
mydestination =
relayhost =
mynetworks = 127.0.0.0/8
  • Az első sor a email-szerve domain-neve. Ezt használhatjuk egy sor másik beállításnál alapértelmezettként.
  • Mivel virtuális felhasználókal használunk, a mydestination paramétert hagyjük üresen. Ez csak UNIX-fehasználóknak szóló levelek esetén kellene.
  • Mivel célunk egy biztonságos és jól beállított szerver létrehozása, meg kell akadályoznunk, hogy nem kívánk leveleket (spamet) is küldjön a szerverünk, azaz ne legyen open relay. Ehhez az kell, hogy csak és kizárólag az tudjon a szerverünk segítségével levelet küldeni, akinek engedélyezzük.
    • Az engedélyezetteket a mynetworks paraméter beállításával tudjuk megadni. Ők azok, akiktől levélküldési kérelmet elfogadunk. A beállításunk miatt a localhoston kívül senki nem tud levelet küldeni, de ez nem baj, mert ez a megfelelő autentikáció után (POP3 vagy IMAP) már lehetséges, hiszen a Dovecot (a POP3/IMAP szerver) is ugyanazon a gépen (localhost) fut. Helyette használhatjuk a mynetworks_style = host beállítást is, a hatása ugyanaz.
    • relayhost: mivel nem továbbítunk olyan levelet, amit nem mi küldünk, vagy nem mi adunk föl, állítsuk üresre.

4.2 Postafiókok beállítása

A virtuális fiókok beállítása szintén az /etc/postfix/main.cf konfigurációs fájlban történik, adjuk hozzá a következő sorokat:

virtual_mailbox_domains = mydomain.hu
virtual_mailbox_base = /home/vmail
virtual_mailbox_maps = pgsql:/etc/postfix/pgsql-vmailbox.cf
virtual_minimum_uid = 100
virtual_uid_maps = static:5000
virtual_gid_maps = static:5000
  • virtual_mailbox_domains: ezeken a domainen szeretnénk virtuális fiókokat használni.
  • virtual_mailbox_base: a levelek tárolási helyének előtagja. Ehhez illeszti hozzá az adatbázisból lekérdezett útvonalat.
  • virtual_mailbox_maps: az adatbázis-kapcsolatot leíró fájl elérési útja
  • az utolsó három sorban állíthatjuk be, hogy milyen uid-t/gid-t használva olvassuk/írjuk a levelek könyvtárát. Használjuk azt, amivel korábban létrehoztuk a vmail rendszerfelhasználót (5000).

A pgsql-vmailbox.cf fájlban adjhatjuk meg, hogy milyen adatbázisból szeretnénk az adatokat lekérni. Tartalma:

user = vmail
password = titkosjelszo
dbname = mails
query = SELECT domain||'/'||username||'/' FROM users WHERE username=lower('%u') AND domain=lower('%d')

Talán csak az utolsó sor igényel némi magyarázatot. Postgresqlben a || jelenti két szöveg konkatenációját, így mikor a postgresql lekérdez egy e-mail címet (behelyettesíti a %u és a %d helyére a @ két oldalán álló szöveget, valamint a lower függvénnyel kisbetűsíti), megkapja azt a helyet, ahova a címhez tartozó leveleket tárolja. Persze ez elé odailleszti az előzőekben beállított virtual_mailbox_base-t. Így képezzük le a bela@mydomain.hu címet a /var/vmail/mydomain.hu/bela/ helyre a fájlrendszerben.

A változások életbe lépéséhez töltsük újra a postfix konfigurációját:

/etc/init.d/postfix reload

4.3 Teszt

Teszteljük le, hogy működik-e a mailszerverünk! Ehhez lépjünk be az adatbázisba:

su postgres
psql -d mails

Hozzunk létre az adatbázis users táblájában egy bejegyzést, például a proba@mydomain.hu címhez:

INSERT INTO users
       (username, "domain",      "password")
VALUES ('proba',  'mydomain.hu', MD5('titkosjelszo'));

Majd lépjünk ki:

\q
exit

Az SMTP szöveges protokoll, így pl. Windows alatt telnet segítségével a 25-ös portra csatlakozva le tudjuk tesztelni a helyes működést:

telnet 192.168.1.22 25
220 mydomain.hu ESMTP Postfix (Debian/GNU)
EHLO vendeg
250-mydomain.hu
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-STARTTLS
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN
MAIL FROM: aaa@felado.hu
250 2.1.0 Ok
RCPT TO: proba@mydomain.hu
250 2.1.5 Ok
DATA
354 End data with <CR><LF>.<CR><LF>
ez egy proba level!
.
250 2.0.0 Ok: queued as A094818143
QUIT
221 2.0.0 Bye

Az üzenet végén lévő ponttal jelezzük, hogy befejeztük a levelet. Ha minden rendben, akkor nézzünk el a /home/vmail/ könyvtárba. A postfix automatikusan létrehozta a megfelelő struktúrát, magát a levelünket a /home/vmail/mydomain.hu/proba/new/ könyvtárban találjuk meg. Hiba esetén nézzük meg a logokat, hátha segítenek felderíteni a forrását.

5 Dovecot

A Dovecot szolgálja ki a beérkező POP3 illetve IMAP kéréseket, letölthetjük a leveleinket, illetve újakat írhatunk. Enélkül csak magáról a szerverről tudnánk levelet küldeni, hiszen kikapcsoltuk a "relay"-funkciót.

Installáljuk a dovecot-ot IMAP- és POP3-támogatással:

aptitude install dovecot-common dovecot-pop3d dovecot-imapd

5.1 Konfigurálás

A dovecot nagyon sokféleképpen beállítható, pl. sokfajta autentikációt támogat. Nekünk csak az az egyszerű eset kell, amikor is az adatbázisból vesszük a jelszavakat. A konfigurációt a /etc/dovecot/dovecot.conf fájllal tudjuk elvégezni. Egy teljes példakonfiguráció, amivel felülírhatjuk a covecot.conf-ot:

protocols = pop3 pop3s imap imaps

log_path = /var/log/dovecot.log
info_log_path = /var/log/dovecot-info.log

disable_plaintext_auth = no
# pop3s-hez és imaps-hez a kulcsok
ssl_disable = no
ssl_cert_file = /etc/ssl/certs/dovecot.pem
ssl_key_file = /etc/ssl/private/dovecot.pem

mail_location = maildir:~/

# pop3-hoz kell
pop3_uidl_format = %08Xu%08Xv

auth_verbose = yes

auth default {
  # a jelszo nyilt szovegkent kozlekedik - SSL/TLS felett ez nem is olyan nagy baj
  mechanisms = plain
  # jelszoadatbazis
  passdb sql {
    args = /etc/dovecot/dovecot-pgsql.conf
  }
  # statikus felhasznalo-adatbazis
  userdb static {
    args = uid=5000 gid=5000 home=/home/vmail/%d/%n
  }
}
  • Felhasználó-adatbázis: mivel az egyes felhasználók leveleinek tárolási helye meghatározható az e-mail címekből, itt nem szükséges SQL lekérdezés. Egyszerűen megadjuk, hogy hol vannak a levelek. A %d az e-mail cím @-tól jobbra, míg a %n a balra eső részét jelenti.
  • A jelszavak lekérdezéséhez már SQL-t használunk. A dovecot-pgsql.conf tartalma:
driver = pgsql
# a jelszo MD5-hashet fogjuk visszaadni
default_pass_scheme = PLAIN-MD5
connect = host=localhost dbname=mails user=vmail password=titkosjelszo
password_query = SELECT password, username, domain FROM users WHERE username = lower('%n') AND domain = lower('%d')

Kis- és nagybetű-problémák miatt itt is kisbetűssé alakítunk mindent, majd ezeket vissza is adjuk a dovecotnak, így az a kisbetűs alakot fogja tovább használni.

A változások életbe lépéséhez töltsük újra a dovecot konfigurációját:

/etc/init.d/dovecot reload

5.2 Teszt

A POP3 szintén szöveges protokoll, így telnet segítségével, a 110-es porton tesztelhetjük a helyes működést.

telnet 192.168.1.22 110
+OK Dovecot ready.
USER proba@mydomain.hu
+OK
PASS titkosjelszo
+OK Logged in.
LIST
+OK 1 messages:
1 432
.
RETR 1
+OK 432 octets
Return-Path: <aaa@felado.hu>
X-Original-To: proba@mydomain.hu
Delivered-To: proba@mydomain.hu
Received: from vendeg (lenti [192.168.1.25])
        by mydomain.hu (Postfix) with ESMTP id A094818143
        for <proba@mydomain.hu>; Sat,  2 Jan 2010 18:39:40 +0100 (CET)
Message-Id: <20100102173948.A094818143@mydomain.hu>
Date: Sat,  2 Jan 2010 18:39:40 +0100 (CET)
From: aaa@felado.hu
To: undisclosed-recipients:;

ez egy proba level!
.
QUIT
+OK Logging out.

6 Roundcube

Szerverünkön a Roundcube lesz a webfelület, amin keresztül letölthetjük a leveleinket, illetve újakat írhatunk. Sajnos lennyn (a stable debianon) nincsen belőle csomag, ezért ha ezt használjuk, nekünk kell letölteni a honlapjáról. Mivel php-ban írták, kell még hozzá egy webkiszolgáló, például az apache2, php támogatással, és még néhány egyéb csomag:

aptitude install apache2 php5 php5-gd php5-pgsql php5-mcrypt

A letöltött, tömörített roundcube-t másoljuk fel a szerverünkre (vagy egyből oda töltsük le). Csomagoljuk ki, majd helyezzük át (és egyből át is nevezzük) a /var/www/webmail helyre:

tar -xzf roundcubemail-0.3.1.tar.gz
mv roundcubemail-0.3.1 /var/www/webmail

Adjuk az apache-nak írási jogokat a szükséges könyvtárakra:

chown -R www-data:www-data /var/www/webmail/logs
chown -R www-data:www-data /var/www/webmail/temp

Állítsuk be a /etc/postgresql/8.3/main/pg_hba.conf fájlban, hogy a postgresql-be minden felhasználóval minden adatbázisba be tudjunk lépni a megfelelő jelszóval. Ehhez a

local    all    all    ident sameuser

sor elé illesszük be ezt:

local    all    all    md5

Végül töltsük újra a konfigurációt:

/etc/init.d/postgresql-8.3 reload

Ezután menjünk a roundcube könytárába (később kelleni fog), és lépjünk be a postgresql konzolba:

cd /var/www/webmail
su postgres

Hozzuk létre a roundcube felhasználót (nem kell neki semmilyen jog):

createuser roundcube

Csináljunk egy adatbázist neki, majd lépjünk be:

createdb -O roundcube -E UNICODE roundcubemail
psql roundcubemail

Lépjünk be az adatbázisba, állítsuk be a roundcube felhasználó jelszavát:

ALTER USER roundcube WITH PASSWORD 'titkosjelszo';

Váltsunk át rá, írjuk be az újonnan beállított jelszót:

\c - roundcube

És illesszük be a táblákat létrehozó scriptet:

\i SQL/postgres.initial.sql

Ha minden rendben lefutott, akkor kiléphetünk:

\q
exit

Ezután menjünk a böngészővel a http://mydomain.hu/webmail/installer/welcome.html címre, majd kövessük az utasításokat. Ha minden kész, a webes felületet a http://mydomain.hu/webmail/ címen érhetjük el.

7 Továbbfejlesztési lehetőségek

Ezzel készen is van a szerverünk. Ezt az alapot igény szerint továbbfejleszthetjük, péládul rakhatunk alá spamszűrést, vagy vírusellenőrzést. De egy kis forgalmú szerveren így is használható megoldás.

Személyes eszközök