E-posti serveri paigaldus

From EIK wiki


Lembit Elmik AK21

Ühte mailiserverit on ikka ja alati vaja. Domeeninimed on meil ka nüüd vabad ju. See on väike juhend sellest, kuidas paigaldada mailiserver, mille kasutajaid hoitakse lokaalse masina kasutajate asemel hoopis MySQL andmebaasis. Selles juhendis ei kaeta paljusid selliseid pisikesi, kuid olulisi vidinaid, mis muudaksid serveri vastupidavamaks. Näiteks võiks olla serveril SASL autentimine, viirusekontroll, rämpspostifilter jne. Meilide lugemiseks näiteks Mozilla Thunderbirdiga kasutan IMAP protokolli. See on POP3 asemel pisut toimivam näiteks juhul, kui postkast on silmini kirju täis. Lisavõimaluste kohta saab lugeda selle teksti kirjutamise (ja minu serveri konfimisel) abiks olnud veebiküljest. Kõigi seadistuste äratoomine siin poleks ilmselt eriti mõistlik.

Eeldan, et kasutaja oskab elementaarsel tasemel kasutada tekstiredaktorit "vi"; saab aru, mis on meiliserver; teab, milleks on DNS jms. Muus osas on tegemist üsna täpselt sihile viiva juhendiga. Kõik siin kasutatavad pakid on ka ametlikult tasuta kättesaadavad.


Paigaldus

Alustuseks tuleks siis installeerida operatsioonisüsteem. Mina valisin selleks Ubuntu. Tundus lihtne ja pakihaldus pole ka hullu moodi keeruline.

Nüüd tuleb kontrollida, kas vajalikud allikad on lubatud.

sudo vi /etc/apt/sources.list

Põhimõtteliselt on vaja main ja universe pakke. Kuid ka multiverse ja restricted peaks olema piisavalt turvalised kasutada.

Enne spetsiifiliste pakkide paigaldamist tuleb kindlasti süsteemi turva- ja muud paigad peale lasta.

sudo aptitude update 
sudo aptitude safe-upgrade


MySQL - andmebaasimootor

sudo aptitude install mysql-client mysql-server

Postfix - meiliserver

sudo aptitude install postfix postfix-mysql

phpMyAdmin - veebikonsool MySQL haldamiseks

sudo aptitude install phpmyadmin

Vali Yes, et seadistada. Sisesta root mysql password, sisesta phpmyadmin kasutaja password kaks korda. Nõustu, et veebiserverina kasutatakse apache2 veebiserverit. Courier - IMAP kasutamiseks

sudo aptitude install courier-base courier-authdaemon courier-authlib-mysql courier-imap courier-imap-ssl courier-ssl 

Küsitakse web-kaustu. Võid vastata No. Samuti hoiatatakse sertifikaadi asukohast. Ära tee välja.

Nüüd on vajalikud pakid paigaldatud.

Seadistamine

Alustuseks tuleks kontrollida, millised tegevused on tulemüüri poolt üldse lubatud. Tulemüüri tarkvarasid on ka mitmeid ning seetõttu tuleks vajalik seadistamine teha vastavalt sellele, millist müüri kasutatakse. Põhimõtted on ikkagi samad - vajalikud pordid peavad olema väljast sisse liikluseks avatud - SMTP, HTTP, IMAP, SSH

  • Postfix

Pane oma serveri nimi kirja. Näiteks mail.minudomeen.ee kus minudomeen asenda oma domeeninimega.

sudo vi /etc/mailname

Nüüd ava peamine postfixi konfiguratsiooni fail.

sudo vi /etc/postfix/main.cf

Alustuseks määra ära oma serveri nimi

# This is already done in /etc/mailname 
#myhostname= mail.example.com 

Järgmisena määra ära domeen, millelt saadetakse kirju. See võib olla terve serveri nimi või lihtsalt domeeninimi.domain name.

# myorigin=/etc/mailname 
myorigin=example.com

Nüüd otsusta, mida kirjutada tervituse bannerisse. Ei midagi sellist, mis potensiaalsele häkkerile abiks oleks...

smtpd_banner = $myhostname ESMTP $mail_name

Nüüd otsusta, kuidas kirjade saatmine toimub. Selleks on põhiliselt kaks võimalust. Saadad ise või läbi oma teenusepakkuja SMTP serveri. See sõltub ka sellest, mida sinu teenusepakkuja võimaldab. Ise saatmise võimalikud tagasilöögid on, et teenusepakkuja ei luba sul omal SMTP teenust jooksutada (pordid kinni), paljud meiliserverid ei võta dünaamilise DNS kirjega serveritelt kirju vastu ja sul on suurem võimalus enda paljastamiseks ründajatele. Ehk siis rohkem tööd oma serveriga. Samas on sul võimalik kirjade saatmist paremini manageerida.

# leave blank to do it yourself 
relayhost =
# or put it an accessible smtp server 
relayhost = smtp.yourisp.com

Järgnusena võrgu seadistamine. Võta vastu ühendusi igalt poolt ja usalda vaid seda masinat.

inet_interfaces = all
mynetworks_style = host

Sa võid maskeerida väljuvaid aadresseid. Näiteks sinu masina nimi on mail.domain.com aga sa ei taha, et väljuvale kiri saadetakse aadressilt username@mail.domain.com, vaid sa eelistad username@domain.com.

# masquerade_domains = mail.example.com www.example.com !sub.dyndomain.com 
# masquerade_exceptions = root

Kuna kasutame virtuaalseid domeene peavad need olema tühjad.

local_recipient_maps =
mydestination =

Nüüd mõned numbrid.

# kui pikalt oodata enne saatja teavitamist ebaõnnestunud saatmisest 
delay_warning_time = 4h
# on see ajutine või lõplik viga 
unknown_local_recipient_reject_code = 450
# kui kaua hoida kirja järjekorras enne vea andmist
maximal_queue_lifetime = 7d
# max ja min aeg sekundites enne kordussaatmist kui ühendus katkeb
minimal_backoff_time = 1000s
maximal_backoff_time = 8000s
# kui kaua oodata serveriga ühenduse loomist
smtp_helo_timeout = 60s
# kui palju adressaate võib olla ühel kirjal - aitab masspostituse vastu
smtpd_recipient_limit = 16
# vigade arv taandumiseks
smtpd_soft_error_limit = 3
# vigade arv blokeerimiseks
smtpd_hard_error_limit = 12

Nüüd mõned piirangud. Iga seadistus on tegelikult ainult ühel real.

# HELO sõnumi piirangud
smtpd_helo_restrictions = permit_mynetworks, warn_if_reject reject_non_fqdn_hostname, reject_invalid_hostname, permit
# Saatja detailide piirangud
smtpd_sender_restrictions = permit_mynetworks, warn_if_reject reject_non_fqdn_sender, reject_unknown_sender_domain, reject_unauth_pipelining, permit
# Piirangud ühenduvale serverile
smtpd_client_restrictions = reject_rbl_client sbl.spamhaus.org, reject_rbl_client blackholes.easynet.nl, reject_rbl_client dnsbl.njabl.org
# Saaja aadressi piirangud
smtpd_recipient_restrictions = reject_unauth_pipelining, permit_mynetworks, reject_non_fqdn_recipient, reject_unknown_recipient_domain, reject_unauth_destination, permit
smtpd_data_restrictions = reject_unauth_pipelining
# Nõua korrektset HELO sõnumit
smtpd_helo_required = yes
# Kuluta spämmerite aega enne tagasilükkamist
smtpd_delay_reject = yes
disable_vrfy_command = yes

Virtuaalse domeeni seadistused.

alias_maps = hash:/etc/postfix/aliases
alias_database = hash:/etc/postfix/aliases
# kus asuvad virtuaalse postkasti kaustad
virtual_mailbox_base = /var/spool/mail/virtual
# iga postkasti asukoht igale kasutajale
virtual_mailbox_maps = mysql:/etc/postfix/mysql_mailbox.cf
# aliastele
virtual_alias_maps = mysql:/etc/postfix/mysql_alias.cf
# domain lookups
virtual_mailbox_domains = mysql:/etc/postfix/mysql_domains.cf
# transport_maps = mysql:/etc/postfix/mysql_transport.cf

Võid otsida üles kirja failide omaniku ja siis vaadata tema uid ja gid väärtused. Mina tegin selleks eraldi kasutaja (virtual) ja lisasin sellise rea:

virtual_uid_maps = static:5000
virtual_gid_maps = static:5000

Näitena minu /etc/passwd faili sisu selle kasutaja kohta:

virtual:x:5000:5000::/home/virtual:/bin/sh

Vaja on seadistada ka aliase fail. Seda kasutatakse vaid lokaalselt.

sudo cp /etc/aliases /etc/postfix/aliases
sudo postalias /etc/postfix/aliases

Näitena minu /etc/aliases faili sisu:

# See man 5 aliases for format
postmaster:    root
clamav: root

Nüüd tuleb luua kaust, kuhu virtuaalne post pannakse See võib olla ka juba apt-get poolt tehtud. Kindlasti loo ka kasutaja, kes oleks nende kaustade omanik.

sudo mkdir /var/spool/mail/virtual
sudo groupadd --system virtual -g 5000
sudo useradd --system virtual -u 5000 -g 5000
sudo chown -R virtual:virtual /var/spool/mail/virtual


  • Postfix'i MySQL seadistus

Meil on vaja luua failid (hiljem ka kasutaja mysql'i), et teha päringuid andmebaasis.

Loo (või vajadusel muuda) kasutaja mailbox'i asukoht

sudo vi /etc/postfix/mysql_mailbox.cf
user=mail
password=mailPASSWORD
dbname=maildb
table=users
select_field=maildir
where_field=id
hosts=127.0.0.1
additional_conditions = and enabled = 1

Kust leida emaili alias

sudo vi /etc/postfix/mysql_alias.cf
user=mail
password=mailPASSWORD
dbname=maildb
table=aliases
select_field=destination
where_field=mail
hosts=127.0.0.1
additional_conditions = and enabled = 1

Kust leida domeenid

sudo vi /etc/postfix/mysql_domains.cf
user=mail
password=mailPASSWORD
dbname=maildb
table=domains
select_field=domain
where_field=domain
hosts=127.0.0.1
additional_conditions = and enabled = 1

Pea meeles, et kui asendad hosts=127.0.0.1 hosti reaalse IP'ga, siis käib suhtlus üle TCP protokolli, mitte üle mysql liidese. Kindlasti kirjuta parooli kohale reaalne parool.


  • Andmebaas

Nüüd on meil vaja luua reaalsed tabelid sellistele päringutele, mis me just kirjeldasime. Alustuseks on vaja luua kasutaja MySQL tarbeks. Siis tuleb luua andmebaas.

Kui see ei ole juba tehtud paki installatsiooni käigus...

mysqladmin -u root password new_password

Logi root kasutajana sisse

mysql -u root -p

Sisesta root kasutaja parool

Enter password:

Loo maili andmebaas

create database maildb;

Loo uus kasutaja "mail"

GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP ON maildb.* TO 'mail'@'localhost' IDENTIFIED by 'mailPASSWORD';
GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP ON maildb.* TO 'mail'@'%' IDENTIFIED by 'mailPASSWORD';
exit;

Ilmselgelt tuleb mailPASSWORD asendada selle parooliga, mis eespool kirjeldatud :)

Nüüd oleks vaja luua andmebaasi järgmised tabelid:

   * aliases
   * domains
   * users

Hiljem saab neid vajadusel juurde luua. Praegu teeme ainult need, mida kohe on vaja.


Logi sisse kasutades "mail" kontot

mysql -u mail -p maildb
Enter password:

Jooksute läbi need käsud, et luua tabelid:

CREATE TABLE aliases (
pkid smallint(3) NOT NULL auto_increment,
mail varchar(120) NOT NULL,
destination varchar(120) NOT NULL,
enabled tinyint(1) NOT NULL default '1',
PRIMARY KEY (pkid),
UNIQUE KEY mail (mail)
);
CREATE TABLE domains (
pkid smallint(6) NOT NULL auto_increment,
domain varchar(120) NOT NULL,
transport varchar(120) NOT NULL default 'virtual:',
enabled tinyint(1) NOT NULL default '1',
PRIMARY KEY (pkid)
);
CREATE TABLE users (
id varchar(128) NOT NULL,
name varchar(128) NOT NULL,
uid smallint(5) unsigned NOT NULL default '5000',
gid smallint(5) unsigned NOT NULL default '5000',
home varchar(255) NOT NULL default '/var/spool/mail/virtual',
maildir varchar(255) NOT NULL default 'blah/',
enabled tinyint(3) unsigned NOT NULL default '1',
change_password tinyint(3) unsigned NOT NULL default '1',
clear varchar(128) NOT NULL default 'ChangeMe',
crypt varchar(128) NOT NULL default 'sdtrusfX0Jj66',
quota varchar(255) NOT NULL,
procmailrc varchar(128) NOT NULL,
spamassassinrc varchar(128) NOT NULL,
PRIMARY KEY (id), UNIQUE KEY id (id)
);

Et näha seda, mis sai just tehtud:

describe aliases;
describe domains;
describe users;

Väljumiseks

exit;

Järgmiseda muudame MySQL'i my.cnf faili. Ubuntus on see juba vaikimisi loodud. Mandrakes tuleb see fail endal tekitada. Konfigureerida on seda igal juhul vaja.

sudo vi /etc/mysql/my.cnf

Eelmistes versioonides oli vaja välja kommenteerida rida

#skip-networking

Tänapäeval seotakse bind-aadress localhostiga.

bind-address = 127.0.0.1 

Üsna heaks abiks on alguses logida üles kõik SQL päringud. Seega luba järgnevad read.

general_log_file = /var/log/mysql/mysql.log
general_log = 1 

Paari nädala pärast, kui kõik on korras, võid need uuesti välja kommenteerida. Logimine muudab MySQL'i lihtsalt aeglasemaks.

Restardi MySQL, et see korjaks külge uued seadistused.

sudo /etc/init.d/mysql restart


  • Courier IMAP

Järgnevalt mõned asjad, mida on tarvis muuta:

sudo vi /etc/courier/authdaemonrc 

Autentimine MySQL-põhiseks

authmodulelist="authmysql" 

Luba logimine.

DEBUG_LOGIN=2
sudo vi /etc/courier/authmysqlrc 

Kasutajanimi

MYSQL_USERNAME mail 

Parool

MYSQL_PASSWORD mailPASSWORD 

Baasi nimi

MYSQL_DATABASE maildb 

Kasutajate tabeli nimi

MYSQL_USER_TABLE users 

Krüptitud parooli hoidmine olgu sisse kommenteeritud

MYSQL_CRYPT_PWFIELD crypt 

Teksti kujul paroolide hoidmine kommenteeri välja

# MYSQL_CLEAR_PWFIELD clear 

Maildir asukoht

MYSQL_MAILDIR_FIELD maildir
MYSQL_WHERE_CLAUSE enabled=1

Lõpetuseks võid vaadata IMAP'i konfi faili, kuid seal pole muudatusi vaja teha.

vi /etc/courier/imapd


Sul on nüüd olemas oma esmane meiliserver! Aga see ei tööta, sest sul pole ühtegi kasutajat ega domeeni...

Kõigepealt tuleks natuke andmeid baasi lisada.

Enne kirjade saatmist proovi kirju vastu võtta. (Mõnelt teiselt aadressilt saates.) Kui kirjad jõuavad kohale ja maili-kaustad on automaatselt loodud, alles siis proovi reaalselt ka lugeda kohale tulnud kirju.

Andmete lisamine baasi

  • Kasutajate ja domeenide lisamine

Meil on nüüd täitsa oma mailiserver püsti pandud. Ainult, et seal pole tegelikult suurt midagi - ei kasutajaid, ei domeene... Alustuseks lisamine mõned vaikeväärtused, siis nõutud andmeid ja siis veidi neid, mis on lihtsalt mõistlikud. Siis lisame oma kasutajad ja domeenid

  • Nõutud domeenid ja kasutajad

Alustuseks nõutud domeenid kohaliku maili jaoks Siin saad kasutada näiteks phpMyAdmin liidest või siis käsurea MYSQL'i

INSERT INTO domains (domain) VALUES
('localhost'),
('localhost.localdomain');

Nüüd mõned vaikimisi aliased. Kõiki neid pole ehk isegi vaja, kuid viisakas on need siiski luua.

INSERT INTO aliases (mail,destination) VALUES
('postmaster@localhost','root@localhost'),
('sysadmin@localhost','root@localhost'),
('webmaster@localhost','root@localhost'),
('abuse@localhost','root@localhost'),
('root@localhost','root@localhost'),
('@localhost','root@localhost'),
('@localhost.localdomain','@localhost');

Root kasutaja.

INSERT INTO users (id,name,maildir,crypt) VALUES
('root@localhost','root','root/', encrypt('apassword') );


  • Domeenid ja kasutajad

Nüüd lisame juba õiged oma andmed. Oletame, et sa soovid, et see sinu server teenindaks väljamõeldud domeeni kirju: "itk.org". Sel juhul ütled , et selle masina nimi on "mail.itk.org".

INSERT INTO domains (domain) VALUES
('itk.org'), ('mail.itk.org');
INSERT INTO aliases (mail,destination) VALUES
('@mail.itk.org','@itk.org'),
('postmaster@itk.org','postmaster@localhost'),
('abuse@itk.org','abuse@localhost');

Sul on ka kasutajad Malle ja Kalle.

INSERT INTO users (id,name,maildir,crypt) VALUES
('malle@itk.org','malle','malle/', encrypt('apassword') ),
('kalle@itk.org','kalle','kalle/', encrypt('anotherpassword') );
INSERT INTO aliases (mail,destination) VALUES
('malle@itk.org','malle@itk.org'),
('kalle@itk.org','kalle@itk.org');

Eksisteerib ka kasutaja Karl, aga ta tahab, et kõik tema kirjad saadetaks edasi välisele meiliaadressile.

INSERT INTO aliases (mail,destination) VALUES ('karl@itk.org','karl@gmail.com');

Mõned seletused kasutatud muutujate kohta.

Kasutaja loomine täidab ära 4 välja. ID on kasutaja e-maili aadressi. See on ka kasutajanimi sisselogimisel. NAME on kasutaja kirjeldus. MAILDIR on /var/spool/mail/virtual sees olev kaust. see peab lõppema / märgiga, vastasel juhul ei osata seda maildir'na kasutada. CRYPT on siis parool krüptitud kujul.


Seadistuste kontroll

Kõikide kontrolltegevuste käigus tekkinud tõrgete puhul on tungivalt soovitav vaadata /var/log/syslog faili lõppu ja sealt otsida teemakohaseid kirjeid!

Postfix'i seadistuste õigsuse kontrolliks saada käsurealt mõnele andmebaasis olevale kliendile kiri ja vaata kas selle peale tekitati kausta /var/spool/mail/virtual kasutaja nimega kaust koos alamkaustadega. Kirja saatmiseks näiteks kasutajale 'kalle' on selline käsk:

mail -s "Tere Kalle" kalle@itk.org

Käsu sisestamise tulemusena tekib võimalus sisestada tekst, millest saab kirja sisu ja kui see on tehtud siis kaks korda vajutada Control+D klahvikombinatsiooni. LIsaks leiab selel tegevuse kohta infot siit

Courier e. IMAP serveri kontrolliks tuleb teha telnet ühendus serveri IMAP porti:

telnet localhost 143

Kui selle käsu tulemusena ühendus serveri õnnestub luua, siis proovida sealt juba baasis oleva kasutajana sisse logida:

0 login kasutaja parool

NB! Ennem, kui postfix test ei ole selle kasutaja aadressil õnnestunult läbi viidud ehk siis kaustas /var/spool/mail/virtual puudub kasutaja nimele vastav kaust, see test ei õnnestu, kuna üritatakse sisse logida olematusse kausta, see kehtib iga kasutaja kohta. Pikemalt leiab infot IMAP testimise kohta siit

Lisaks oleks kasulik installida programm nimega Gamin, muidu annab IMAP sisselogimisel veateate.

sudo apt-get install gamin

Ja ongi server valmis. Kõigi eelduste kohaselt ka toimiv. Veaotsingul aitab jällegi kasutatud kirjanduse all esimene link.

Kasutatud kirjandus

http://flurdy.com/docs/postfix/
Väga tugevalt aitab antud juhendit ellu viia Antti Andreimann'i materjal Linuxi administreerimise kohta.
http://www.postfix.org/
http://www.courier-mta.org/
http://www.howtoforge.com/virtual-users-domains-postfix-courier-mysql-squirrelmail-ubuntu8.04