Setting Multiple Domain Mail Server Menggunakan POSTFIX + DOVECOT + CYRUS-SASL + MYSQL

Saya percaya, akan ada saat dimana setting mail server di linux semudah instalasi MS Exchange Server di windows. Tapi saat itu bukan hari ini …

Instalasi aplikasi di server linux memang memiliki kesulitan tersendiri. Kalau pun kita sudah “pernah”, pas dicoba 1x lagi pada distro yang berbeda atau walau cuma beda versi, belum tentu hasilnya sama.

Pertama kali saya melakukan instalasi mail server adalah 2 tahun lalu saya melakukan instalasi mail server diatas OS Linux Fedora 9, cara mudahnya adalah dengan cara copas dari berbagai tutorial yang saya termukan di internet. Alhasil, setelah 1 minggu usah, punya juga mail server. Sekarang, saya coba lagi melakukan yang sama pada Fedora 14. Cara praktisnya adalah copas konfigurasi server lama ke server baru. Tapi ternyata … memang tidak semudah yang dikira. Beberapa perbedaan versi pada aplikasi yang dipakai menjadikannya perlu ada adaptasi agar konfigurasi lama yang saya pakai bisa digunakan kembali.

Berikut adalah beberapa catatan yang saya buat pada saat melakukan konfigurasi Mail Server dengan Multiple Domain (Virtual Domain) di Linux.

Jika Anda pernah melakukan instalasi email server menggunakan MS Exchange Server, semuanya mudah. 1 program untuk seluruh keperluan. Berbeda dengan Linux, Mail Server terdiri dari program yang terpisah. Dengan demikian, untuk bisa memahaminya tentunya harus mengetahui fungsi masing-masing program yang digunakan.

Berikut adalah spesifikasi Mail Server yang saya buat:
Dibuat diatas OS Linux Fedora 14.
Mail server terdiri dari POSTFIX, Dovecot, Cyrus-SASL, MySQL.
Virtual domail: example.com & example2.com
Mengirim email menggunakan authentikasi PLAIN (artinya password tidak di enkripsi)
authentikasi POP & IMAP menggunakan LOGIN PLAIN (artinya password tidak di enkripsi)

POSTFIX
POSTFIX adalah program yang berfungsi menerima dan mengirim email.
instalasi modul yang diperlukan untuk POSTFIX adalah:
yum install postfix

berikut adalah initial setting untuk POSTFIX yang saya gunakan (file: /etc/postfix/main.cf)

# uncomment for debugging if needed
soft_bounce=yes
debug_peer_level = 99
debug_peer_list = 127.0.0.1

# postfix main
mail_owner = postfix
setgid_group = postdrop
delay_warning_time = 4

# postfix paths
html_directory = no
command_directory = /usr/sbin
daemon_directory = /usr/libexec/postfix
queue_directory = /var/spool/postfix
sendmail_path = /usr/sbin/sendmail.postfix
newaliases_path = /usr/bin/newaliases.postfix
mailq_path = /usr/bin/mailq.postfix
manpage_directory = /usr/share/man

# network settings
inet_interfaces = all
mydomain = example.com
myhostname = host.example.com
mydestination = $myhostname localhost.$mydomain
mynetworks = 127.0.0.0/8, 119.235.30.174/32
mynetworks_style = subnet
myorigin = example.com
relay_domains = example2.com #virtual domain

# mail delivery
recipient_delimiter = +

# mappings
alias_maps = mysql:/etc/postfix/mysql-aliases.cf

# virtual setup
virtual_alias_maps = mysql:/etc/postfix/mysql-virtual_alias_maps.cf
virtual_gid_maps = static:89
virtual_mailbox_base = /home/vmail
virtual_mailbox_domains = mysql:/etc/postfix/mysql-virtual_domains_maps.cf
virtual_mailbox_maps = mysql:/etc/postfix/mysql-virtual_mailbox_maps.cf
virtual_minimum_uid = 89 #UID user postfix. lihat di file /etc/group
virtual_transport = virtual
virtual_uid_maps = static:89 #UID user postfix. lihat di file /etc/group

# debugging
debug_peer_level = 5
debugger_command =
PATH=/bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin
xxgdb $daemon_directory/$process_name $process_id & sleep 5

# authentication
smtpd_sasl_auth_enable = yes
smtpd_sasl_security_options = noanonymous
smtpd_sasl_local_domain = $myhostname
broken_sasl_auth_clients = yes

smtpd_helo_restrictions = permit_sasl_authenticated, permit_mynetworks, reject_invalid_hostname
smtpd_sender_restrictions = reject_unknown_sender_domain
smtpd_recipient_restrictions = permit_sasl_authenticated, permit_mynetworks, reject_unauth_destination,
reject_non_fqdn_recipient, reject_unknown_sender_domain, reject_unknown_recipient_domain,
reject_unverified_sender, reject_unverified_recipient

smtpd_helo_required = yes
unknown_local_recipient_reject_code = 550
disable_vrfy_command = yes
smtpd_data_restrictions = reject_unauth_pipelining
message_size_limit = 12582912

Seperti yang saya ungkapkan sebelumnya, ini adalah initial setup. Artinya konfigurasi “asal jalan”. Untuk keamanan, tentunya konfigurasi tersebut harus di tweak lagi.

informasi yang menghubungkan antara POSTFIX dengan mysql diletakan pada file *.cnf. Isi dari file-file tersebut adalah sebagai berikut:
/etc/postfix/mysql-aliases.cf
user = postfix
password = mypassword
dbname = postfix
table = postfix_alias
select_field = destination
where_field = alias
hosts = localhost

/etc/postfix/mysql-virtual_alias_maps.cf
hosts = localhost
user = postfix
password = mypassword
dbname = postfix
table = alias
select_field = goto
where_field = address

/etc/postfix/mysql-virtual_domains_maps.cf
hosts = localhost
user = postfix
password = buburayam
dbname = postfix
table = domain
select_field = domain
where_field = domain
additional_conditions = and backupmx = '0' and active = '1'

/etc/postfix/mysql-virtual_mailbox_maps.cf
hosts = localhost
user = postfix
password = buburayam
dbname = postfix
table = mailbox
select_field = maildir
where_field = username

MySQL
Ada banyak cara bagaimana Anda menyimpan data username & password. Namun untuk kali ini, saya memilih menggunakan MySQL.
instalasi modul yang diperlukan untuk MySQL adalah:
yum install mysql mysql-server

Buat database yang akan digunakan menggunakan SQL berikut:

CREATE TABLE IF NOT EXISTS `admin` (
`username` varchar(255) NOT NULL DEFAULT '',
`password` varchar(255) NOT NULL DEFAULT '',
`created` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`modified` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`active` tinyint(1) NOT NULL DEFAULT '1',
PRIMARY KEY (`username`)
);

CREATE TABLE IF NOT EXISTS `alias` (
`address` varchar(255) NOT NULL DEFAULT '',
`goto` text NOT NULL,
`domain` varchar(255) NOT NULL DEFAULT '',
`created` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`modified` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`active` tinyint(1) NOT NULL DEFAULT '1',
PRIMARY KEY (`address`)
);

CREATE TABLE IF NOT EXISTS `alias_domain` (
`alias_domain` varchar(255) NOT NULL DEFAULT '',
`target_domain` varchar(255) NOT NULL DEFAULT '',
`created` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`modified` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`active` tinyint(1) NOT NULL DEFAULT '1',
PRIMARY KEY (`alias_domain`),
KEY `active` (`active`),
KEY `target_domain` (`target_domain`)
) ;

CREATE TABLE IF NOT EXISTS `config` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(20) NOT NULL DEFAULT '',
`value` varchar(20) NOT NULL DEFAULT '',
PRIMARY KEY (`id`),
UNIQUE KEY `name` (`name`)
) AUTO_INCREMENT=1 ;

CREATE TABLE IF NOT EXISTS `domain` (
`domain` varchar(255) NOT NULL DEFAULT '',
`description` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
`aliases` int(10) NOT NULL DEFAULT '0',
`mailboxes` int(10) NOT NULL DEFAULT '0',
`maxquota` bigint(20) NOT NULL DEFAULT '0',
`quota` bigint(20) NOT NULL DEFAULT '0',
`transport` varchar(255) DEFAULT NULL,
`backupmx` tinyint(1) NOT NULL DEFAULT '0',
`created` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`modified` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`active` tinyint(1) NOT NULL DEFAULT '1',
PRIMARY KEY (`domain`)
);

CREATE TABLE IF NOT EXISTS `domain_admins` (
`username` varchar(255) NOT NULL DEFAULT '',
`domain` varchar(255) NOT NULL DEFAULT '',
`created` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`active` tinyint(1) NOT NULL DEFAULT '1',
KEY `username` (`username`)
);

CREATE TABLE IF NOT EXISTS `fetchmail` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`mailbox` varchar(255) NOT NULL DEFAULT '',
`src_server` varchar(255) NOT NULL DEFAULT '',
`src_auth` enum('password','kerberos_v5','kerberos','kerberos_v4','gssapi','cram-md5','otp','ntlm','msn','ssh','any') DEFAULT NULL,
`src_user` varchar(255) NOT NULL DEFAULT '',
`src_password` varchar(255) NOT NULL DEFAULT '',
`src_folder` varchar(255) NOT NULL DEFAULT '',
`poll_time` int(11) unsigned NOT NULL DEFAULT '10',
`fetchall` tinyint(1) unsigned NOT NULL DEFAULT '0',
`keep` tinyint(1) unsigned NOT NULL DEFAULT '0',
`protocol` enum('POP3','IMAP','POP2','ETRN','AUTO') DEFAULT NULL,
`ssl` tinyint(1) unsigned NOT NULL DEFAULT '0',
`extra_options` text,
`returned_text` text,
`mda` varchar(255) NOT NULL DEFAULT '',
`date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) AUTO_INCREMENT=1 ;

CREATE TABLE IF NOT EXISTS `log` (
`timestamp` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`username` varchar(255) NOT NULL DEFAULT '',
`domain` varchar(255) NOT NULL DEFAULT '',
`action` varchar(255) NOT NULL DEFAULT '',
`data` varchar(255) NOT NULL DEFAULT '',
KEY `timestamp` (`timestamp`)
);

CREATE TABLE IF NOT EXISTS `mailbox` (
`username` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`password` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`name` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`maildir` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`quota` bigint(20) NOT NULL DEFAULT '0',
`domain` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`created` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`modified` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`passwd_expire` char(1) COLLATE utf8_unicode_ci NOT NULL,
`active` tinyint(1) NOT NULL DEFAULT '1',
PRIMARY KEY (`username`)
);

CREATE TABLE IF NOT EXISTS `postfix_alias` (
`destination` varchar(50) DEFAULT NULL,
`alias` varchar(50) DEFAULT NULL
);

CREATE TABLE IF NOT EXISTS `vacation` (
`email` varchar(255) NOT NULL DEFAULT '',
`subject` varchar(255) NOT NULL DEFAULT '',
`body` text NOT NULL,
`cache` text NOT NULL,
`domain` varchar(255) NOT NULL DEFAULT '',
`created` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`active` tinyint(1) NOT NULL DEFAULT '1',
PRIMARY KEY (`email`),
KEY `email` (`email`)
);

Dovecot
POSTFIX hanya bertugas menerima dan mengirim. Sedangkan program yang melayani aplikasi email client lewat protokol IMAP & POP (seperti MS Outlook, Mozilla Thunderbird atau SquirellMail) ditangani oleh Dovecot.
instalasi modul yang diperlukan untuk Dovecot adalah:
yum install dovecot dovecot-mysql

konfigurasi untuk dovecot (saya menggunakan versi 2) terletak di dalam file /etc/dovecot/dovecot.conf, dan dari file tersebut load file lain yang ada di /etc/dovecot/conf.d. Namun untuk penyerderhanaan, saya membuatnya menjadi 1 file di /etc/dovecot/dovecot.conf dengan isi sebagai berikut:

# 2.0.9: /etc/dovecot/dovecot.conf
# OS: Linux 2.6.35.6-45.fc14.x86_64 x86_64 Fedora release 14 (Laughlin) ext3
first_valid_uid = 89
log_path = /var/log/dovecot

disable_plaintext_auth = no

#debug option
#mail_debug = yes
#auth_debug_passwords=yes
#auth_debug=yes
#auth_verbose = yes
#auth_verbose_passwords=plain
#verbose_ssl = yes

mail_location = maildir:/home/vmail/%d/%n
protocols = pop3 imap
ssl_cert =

Dovecot pun perlu sambungan untuk membaca informasi user yang tersimpan di MySQL. Konfigurasi untuk koneksi ke MySQL bisa dilihat di /etc/dovecot/dovecot-mysql.conf

driver = mysql
connect = host=localhost dbname=postfix user=postfix password=mypassword
default_pass_scheme = PLAIN

password_query = SELECT password FROM mailbox WHERE username = '%u'
user_query = SELECT maildir, 89 AS uid, 89 AS gid FROM mailbox WHERE username = '%u'

Cyrus-SASL
Khusus untuk keperluan autentikasi (memeriksa apakah user yang login via Dovecot atau POSTFIX adalah user yang valid) digunakan program Cyrus-SASL.
instalasi modul yang diperlukan untuk Cyrus-SASL adalah:
yum install cyrus-sasl cyrus-sasl-mysql cyrus-sasl-plain pam_mysql

pastikan /etc/sasl2/smtpd.conf seperti berikut:
pwcheck_method: saslauthd
mech_list: plain login

set konfigurasi /etc/pam.d/smtp
auth required pam_mysql.so user=postfix passwd=mypassword host=localhost db=postfix table=mailbox usercolumn=username passwdcolumn=password
account sufficient pam_mysql.so user=postfix passwd=mypassword host=localhost db=postfix table=mailbox usercolumn=username passwdcolumn=password

untuk keperluan Virtual Domain, pastikan Cyrus memeriksa realm pada saat memeriksa user. Hal ini ditentukan oleh 2 file konfigurasi:
/etc/init.d/saslauthd pastikan memiliki baris:
PARAMS="${PARAMS} -a ${MECHANISMS} -r"

/etc/sysconfig/saslauthd pastikan menambahkan “-r” pada FLAG
SOCKETDIR=/var/run/saslauthd
MECH=pam
FLAGS=-r

Coba restart MySQL, POSTFIX, Dovecot, dan Cyrus-SASL. … And see what happen!🙂

Saya belum bisa menuliskan step by step yang lengkap untuk proses setting ini. Tapi, mungkin Anda coba merujuk ke beberapa link berikut ini.
Virtual Users And Domains With Postfix, Courier, MySQL And SquirrelMail
Virtual Users And Domains With Postfix, Courier, MySQL And SquirrelMail (page-2)
Authentifikasi SMTP, POSTFIX & SASL
POSTFIX SMTP Authentication Dovecot SASL
SETTING UP EMAIL: A POSTFIX/DOVECOT HOWTO
SMTP Authentication Email Client
POSTFIX Configuration Paramaters
Postfix SASL Howto

Semoga bisa membantu.
Sorry for the incomplete installation notes.🙂
Cuma sebagai pengingat pribadi saja.

Tinggalkan Balasan

Isikan data di bawah atau klik salah satu ikon untuk log in:

Logo WordPress.com

You are commenting using your WordPress.com account. Logout / Ubah )

Gambar Twitter

You are commenting using your Twitter account. Logout / Ubah )

Foto Facebook

You are commenting using your Facebook account. Logout / Ubah )

Foto Google+

You are commenting using your Google+ account. Logout / Ubah )

Connecting to %s