Egyszerű email-szerver építése
Tartalomjegyzék[elrejtés] |
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:
- postfix 2.5.5: SMTP-szerver
- dovecot 1.0.15: POP3/IMAP-szerver
- roundcube 0.3: webmail
- postgresql 8.3.8: adatbázis
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_style = host
- 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, ezért 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, ezért 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. Alapesetben tehát 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.
- relayhost: mivel nem továbbítunk olyan levelet, amit nem mi küldünk, vagy nem mi adünk föl, ezért állítsuk üresre.
- mynetworks_style: itt állítjuk be, hogy csak a localhostról fogadunk levélküldési kérelmet. Egyéb esetben a mynetworks paramétert kellene a kívánt címre állítani (ekkor a postfix nem veszi figyelembe a mynetworks_style beállítást).
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éi ú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élda konfigurá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, ezért 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. Így természetesen kell 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
Töltsük le a roundcube-t, csomagoljuk ki, majd helyezzük át 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.
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.