Postfix Mail Server Kurulum Dokumani (Postfix+Mysql +Courier Imap+ SMTP Auth)
Hazirlayan : Umut Besler <umutbesler [at] umutbesler.com>
28.01.2003

Bu dokuman Postfix mail server uzerinde virtual domain olusturarak mail hizmeti vermeyi aciklayacaktir.
Ayný sistemi Debian üzerinde çalýþtýrmak için Postfix Debian dökümanýmdan faydalanabilirsiniz.

Oncelikle belirtmeliyimki bu program paketini kurmaya karar verdiyseniz biraz sabirli olmalisiniz. Cunku kurulum sirasinda veya kurulum sonrasi nerden kaynaklandigini bilmediginiz hatalar cikabiliyor ve bunlar ile biraz ugrasmaniz gerekebiliyor. Ben kendi yasadigim sorunlar kapsaminda bu dokumani yazarak minimum duzeyde sorun yasmanizi saglamaya calisacagim.

Oncelikle kurulmasi gereken paketler:

Mysql
Postfix 1.1.12 (daha ust versiyonlardada ayni sekilde calisacaktir)
Courier Imap
Cyrus-sasl
Pam

Mysql : Domain bilgilerimizi mysql database’inde tutacagiz. Bunun avantaji kullanicilarin database’den direk eklenip silinebilmesidir. Boylece sistem icin web arayuzude yazilmasi kolaylasacaktir.

Postfix : Mail server olarak postfix kullanacagiz.
Courier Imap : Imap ve pop3 server olarak kullanacagiz.
Cyrus Sasl : SMTP Auth yapilabilmesi icin gerekli program.
Pam : SMTP Auth yapilirken cyrus-sasl programinin mysql’den verileri okumasi icin gerekli program.

MySql :
Mysql database yapimiz asagidaki gibi olacak:

mysql> show tables;
+------------------+
| Tables_in_maildb |
+------------------+
| transport        |
| users            |
| virtual          |
+------------------+
3 rows in set (0.00 sec)

mysql> describe transport;
+-----------+--------------+------+-----+---------+-------+
| Field     | Type         | Null | Key | Default | Extra |
+-----------+--------------+------+-----+---------+-------+
| domain    | varchar(128) |      | PRI |         |       |
| transport | varchar(128) |      | MUL |         |       |
+-----------+--------------+------+-----+---------+-------+
2 rows in set (0.00 sec)

mysql> describe virtual;
+---------+--------------+------+-----+---------+-------+
| Field   | Type         | Null | Key | Default | Extra |
+---------+--------------+------+-----+---------+-------+
| address | varchar(255) |      | PRI |         |       |
| goto    | varchar(255) |      |     |         |       |
+---------+--------------+------+-----+---------+-------+
2 rows in set (0.01 sec)

mysql> describe users;
+---------+----------------------+------+-----+---------+-------+
| Field   | Type                 | Null | Key | Default | Extra |
+---------+----------------------+------+-----+---------+-------+
| id      | varchar(128)         |      | PRI |         |       |
| address | varchar(128)         |      | UNI |         |       |
| crypt   | varchar(128)         |      |     |         |       |
| clear   | varchar(128)         |      |     |         |       |
| name    | varchar(128)         |      |     |         |       |
| uid     | smallint(5) unsigned |      |     | 0       |       |
| gid     | smallint(5) unsigned |      |     | 0       |       |
| home    | varchar(128)         |      |     | /       |       |
| domain  | varchar(128)         |      |     |         |       |
| maildir | varchar(255)         |      |     |         |       |
| imapok  | tinyint(3) unsigned  |      |     | 1       |       |
| bool1   | tinyint(3) unsigned  |      |     | 1       |       |
| bool2   | tinyint(3) unsigned  |      |     | 1       |       |
+---------+----------------------+------+-----+---------+-------+
13 rows in set (0.01 sec)

Transport taki alanlarin aciklamalari:

domain

Host edeceginiz domain adi. “virtual” ve “local” olarak host edecekleriniz dahil.

transport

Host edeceginiz domain tipi. Virtual domainler icin “virtual:”, local kullanicilar icin “local:” yazabilirsiniz.

Virtual daki alanlarin aciklamalari:

address

Gelen mail adresi

goto

Ustteki mail adresinden gelen maillerin yonlendirilecegi adres.

Users daki alanlarin aciklamalari:

id

Kullanici adi. [email protected] seklinde

address

Kullanici mail adresi. [email protected] seklinde

crypt

Sifrenin sifreli (crypted) hali. Eger sifrenin bu sekilde saklanmasini istemiyorsaniz bos birakabilirsiniz. Bu alana mysqlden veri girerken querinizi encrypt(‘password’) seklinde verebilirsiniz.

clear

Sifrenin acik hali.

name

Kullanicinin ismi. Postfix icin gerekli degil. Courier icin kullanacagiz.

uid

virtual uid

gid

virtual gid
Her domain icin tek gid kullanmanizi tavsiye ederim. 

home

Mail klasorunuz “/” veya “/var/spool/postfix” olabilir.

domain

Kullanici domain adi.

maildir

Kullanicinin maillerinin saklanacagi klasor. Burada tam yolu kullanmanizi tavsiye ederim. Maillerde Maildir yapisini kullanacagimiz icin mutlaka sonraki / isaretini koymak gerekmektedir. (“domain.com/user/Maildir/” seklinde)

imapok

Courier imap ile kullanicilarin maillerine ulasmayi saglayan bir ayar. 1 yaziniz. 0 yazan mailine courier uzerinden ulasamaz.

bool1

Ustteki ayar ile ayni

bool2

Ustteki ayar ile ayni

Simdi databasedeki tablolari tanitalim.

Transport: Bu tablo gelen maillerin domain bilgilerini tutan tablodur. Burada o domain’e ait maillerin virtual mi yoksa sistem uzerinde mi tutulacagi belirlenir.

Virtual: Bu tabloda aliases dosyasindakine benzer bir islem yapilmaktadir. Bir adrese gelen maillerin baska bir adrese/adreslere yonlendirilmesi bu tablodan yapilmaktadir. Mail adresleri arasina “,” konarak bu islem gerceklestirilebilir.

Users: Bu tablo sahip oldugumuz tum kullanicilarin tutuldugu tablodur.

Database’in kolayca yaratilmasi icin mysql kodu asagidadir:

#First Create the Database
CREATE DATABASE maildb;
use maildb;
#
# Table structure for table 'transport'
#

CREATE TABLE transport (
  domain varchar(128) NOT NULL default '',
  transport varchar(128) NOT NULL default '',
  UNIQUE KEY domain (domain)
) TYPE=MyISAM;

#
# Table structure for table 'users'
#

CREATE TABLE users (
  id varchar(128) NOT NULL default '',
  address varchar(128) NOT NULL default '',
  crypt varchar(128) NOT NULL default '',
  clear varchar(128) NOT NULL default '',
  name varchar(128) NOT NULL default '',
  uid smallint(5) unsigned NOT NULL default '1000',
  gid smallint(5) unsigned NOT NULL default '1000',
  home varchar(128) NOT NULL default '/',
  domain varchar(128) NOT NULL default '',
  maildir varchar(255) NOT NULL default '',
  imapok tinyint(3) unsigned NOT NULL default '1',
  bool1 tinyint(3) unsigned NOT NULL default '1',
  bool2 tinyint(3) unsigned NOT NULL default '1',
  PRIMARY KEY  (id),
  UNIQUE KEY id (id),
  UNIQUE KEY address (address),
  KEY id_2 (id),
  KEY address_2 (address)
) TYPE=MyISAM;

#
# Table structure for table 'virtual'
#

CREATE TABLE virtual (
  address varchar(255) NOT NULL default '',
  goto varchar(255) NOT NULL default '',
  UNIQUE KEY address (address)
) TYPE=MyISAM;


Database ve table’lar yaratildiktan sonra uzerinde arama yapacaginiz alanlardaki indexleri kendiniz ayarlayabilirsiniz.
MySql ayarlarimiz burada bitti. Simdi diger programlarin ayarlarina gecelim.

Cyrus SASL

Bu programi SMTP Auth ozelligi icin kullanacagiz.
Program kurulumu icin ftp://ftp.andrew.cmu.edu/pub/cyrus-mail den programi indirebilirsiniz. Eger elinizde rpm kurulum paketi varsa dagitimdan cikan onuda kurabilirsiniz. Yalniz burada onemli olan rpm kurulumda cyrus-sasl-devel paketinide kurmaniz gerekmektedir. Tar.gz kurulumu su sekildedir:

cd cyrus-sasl-<version>
./configure
make
make install

eger rpmden kurulum yaptiysaniz /usr/local/lib/sasl'a bir sembolik link olusturun ve hedefi /usr/lib/sasl olarak verin. Tar.gz den kurulum yaptiysaniz tam tersini yapin.

Or: ln -s /usr/local/lib/sasl /usr/lib/sasl

Postfix

Postfix mail programinin tum ayarlarini main.cf uzerinde yapacagiz daha sonrada 5 adet yeni dosya yaratacagiz. Ayrica main.cf dosyasinda kullanilabilecek komutlar icin /etc/postfix/ icinde sample- seklinde baslayan dosyalara bakabilirsiniz. Oncelikle portfix derlenmesi islemiyle baslayalim:
Postfix programini http://www.postfix.org/ adresinden cekebilirsiniz. Tam link olarak bu dokumanda kullandigim versiyonun linki su sekilde : ftp://ftp.porcupine.org/mirrors/postfix-release/official/postfix-1.1.12.tar.gz .
Bu adresten cekeceginiz dosyayi

tar zxvf postfix-1.1.12.tar.gz

komutuyla acabilirsiniz. Postfix'i mysql ve sasl destekli derleyebilmek icin MakeFile uzerinde degisiklik yapmamiz gerekmektedir. Bunun icin asagidaki komutu vermelisiniz.

make -f Makefile.init makefiles 'CCARGS=-DHAS_MYSQL -I/usr/include/mysql -DUSE_SASL_AUTH' 'AUXLIBS=-L/usr/lib/mysql -lmysqlclient -lz -lm -lsasl'

Bu komutun hepsini 1 satira yazmaniz gerekmektedir. Buradaki /usr/include/mysql kismi kurdugunuz dagitima gore degisiklik gosterebilir. Buraya mysql’in include dosyalarinin bulundugu dizini yazmalisiniz. Ayrica cyrus-sasl programinin library dosyalari icinde CCARGS kisminin sonuna “–I/usr/local/include” ve AUXLIBS in sonuna “–L/usr/local/lib“ ekleyebilirsiniz. Bu islem yapildiktan sonra MakeFile bastan olusturulacaktir.
Bundan sonraki islem:

make
make install

Make install asamasindan once sisteme postfix user ve postdrop groupunu acmaniz gerekmektedir. Bazi dagilimlarda bunlar acik halde gelmektedir.
Bu komutlardan sonra postfix mysql ve sasl destekli olarak kurulmus olacaktir.
Bu asamadan sonra /etc/postfix altindaki dosyalardan main.cf uzerinde degisiklikler ve eklemeler yapacagiz.

#main.cf

home_mailbox = Maildir/
mail_spool_directory = /var/spool/mail
transport_maps=mysql:/etc/postfix/transport.cf
virtual_mailbox_maps=mysql:/etc/postfix/mysql_virt.cf
virtual_uid_maps=mysql:/etc/postfix/uids.cf
virtual_gid_maps=mysql:/etc/postfix/gids.cf
virtual_mailbox_base=/
mydestination = $mydomain, $myhostname, $transport_maps
virtual_maps =mysql:/etc/postfix/virtual.cf

#master.cf dosyasinda eger yoksa asagidaki satiri eklememiz gerekmektedir

virtual unix - n n - - virtual

Simdi yeni yaratacagimiz dosyalarin iceriklerini sirayla yazalim:

# transport.cf
user=postfix
password=whatever
dbname=maildb
table=transport
select_field=transport
where_field=domain
hosts=localhost

# mysql_virt.cf
user=postfix
password= whatever
dbname=maildb
table=users
select_field=maildir
where_field=address
hosts=localhost

# uids.cf
user=postfix
password=whatever
dbname=maildb
table=users
select_field=uid
where_field=address
hosts=localhost

# gids.cf
user=postfix
password=whatever
dbname=maildb
table=users
select_field=gid
where_field=address
hosts=localhost

# virtual.cf
user=postfix
password=whatever
dbname=maildb
table=virtual
select_field=goto
where_field=address
hosts=localhost

Courier Imap:

Courier imap programini hem imap hemde pop3 icin kullanabilirsiniz. Ayrica pop3s ve imaps te icinde gelmektedir.
Courier imap programini http://www.inter7.com/courierimap/ adresinden cekebilirsiniz.
Courier imap programinin ilginc bir ozelligi var root olarak compile edemiyorsunuz. Onun icin oncelikle herhangi bir normal kullanicinin ulasabilecegi bir dizine programi kopyalayin. Sonra normal bir kullanici olarak sisteme girip tar.gz dosyasini acin

tar zxvf courier-imap.xxxxx.tgz

bunu actiktan sonra sirasiyla

./configure
make
make check

buradan sonra root olmamiz gerekecektir,

su root
make install
make install-configure

Bunlari yaptigimizda courier imap /usr/lib/courier-imap/dizinine kurulacaktir
Config dosyalari /usr/lib/courier-imap/etc dizininde yer almaktadir. Buradan config dosyalarinin 2 tanesinde degisiklik yapacagiz.

#authmysqlrc dosyasinda
MYSQL_SERVER localhost #mysql server adresi

MYSQL_USERNAME user
MYSQL_PASSWORD password

MYSQL_SOCKET /tmp/mysql.sock #localhosttan calisiyorsaniz bu gerekli
MYSQL_DATABASE maildb
MYSQL_USER_TABLE users
MYSQL_CRYPT_PWFIELD crypt
MYSQL_CLEAR_PWFIELD clear
MYSQL_UID_FIELD uid
MYSQL_GID_FIELD gid
MYSQL_LOGIN_FIELD id
MYSQL_HOME_FIELD home
MYSQL_NAME_FIELD name
MYSQL_MAILDIR_FIELD maildir
MYSQL_WHERE_CLAUSE imapok=1 AND bool1=1 AND bool2=1

Yukarda kullandigimiz MYSQL_MAILDIR_FIELD ile ilgili benim yasadigim bir sorun oldu. Program kullanicinin mail dizinini bulamiyordu. Eger boyle bir sorunla karsilasirsaniz mysql’de users tablosuna yeni bir alan ekleyip ornegin adini courierhome yapin ve oraya Maildir/ dizininin tam yolunu yazin. Or: /var/spool/postfix/virtual/domain.com/user/Maildir/ seklinde. Bu sekilde sorun cozulecektir.
Bu ayarlardan sonra birde
Authdaemonrc dosyasinda authmodulelist="authmysql" yapmamiz gerekiyor. Eger baglantiyi pam ile yapmak isterseniz burada uthmodulelist="authpam" kullanmaniz gerekecektir.

Programi calistirmak icin /usr/lib/courier-imap/libexec teki

imapd.rc start
pop3d.rc start

komutlarini vererek imap ve pop3u baslatmis olursunuz.

Cyrus Sasl

Postfix'in smtp auth ozelligini aktif hale getirmek icin main.cf ye asagidakileri eklemeliyiz.

#sasl
broken_sasl_auth_clients=yes
smtpd_sasl_auth_enable=yes
smtpd_sasl_security_options = noanonymous
smtpd_sasl_local_domain = $myhostname
smtpd_sender_restrictions = reject_unknown_sender_domain
smtpd_recipient_restrictions = permit_sasl_authenticated, check_relay_domains

ayarlarini yapmamiz gerekecektir.
Bundan sonra yapilmasi gereken /usr/local/lib/sasl/smtpd.conf diye bir dosya olusturmak ve icine pwcheck_method: pam yazmak. Bu sekilde kurulumumuz tamamlandi.

Not: Yeni linux dagitimlarinda genelde saslauthd gelmektedir. Bunu kullanabilmek icin smtpd.conf dosyasina:

pwcheck_method: saslauthd
mech_list: plain login

yazmalisiniz.

Pam

Mysql ile arada baglanti kurulmasini saglayacak pam programi dagitimlarin icinde rpm olarak gelmektedir. Onu kurmaniz yeterlidir. Daha sonra /etc/pam.d icinde eger yok ise smtp isimli bir dosya olusturmamiz ve icerigini su sekilde ayarlamamiz gerekmektedir.

auth optional pam_mysql.so user=postfix passwd=virtualdbmail db=maildb table=users usercolumn=address passwdcolumn=clear crypt=0
account required pam_mysql.so user=postfix passwd=virtualdbmail db=maildb table=users usercolumn=address passwdcolumn=clear crypt=0

Ustte yazilanlar auth satiri tek satir ve account satiri tek satir olmak uzere toplam 2 satira yazilmalidir.
Pam ayarlamamizda burada bitimstir.

Yukarida yapilan tum islemlerden sonra mail paketi kurulumumuz tamamlandi. Postfix icin /etc/init.d altina koyabileceginiz script /etc/postfix'in altinda vardir onu edit edip degisiklikler yapabilirsiniz. Sistemde actiginiz kullaniciya mail geldiginde domain user ve mail dizinleri otomatik olarak postfix tarafindan yaratilacaktir. Eger mail almada veya gondermede problemler oluyorsa /var/log/mail dosyasini inceleyebilir ve hatanin kaynaklandigi yeri ogrenebilirsiniz.