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.

Debug Query di MySQL

Berhari-hari memiliki masalah dalam instalasi Postfix untuk Multiple Domain, menggunakan MySQL untuk penyimpanan data. Entah mengapa, proses authentikasi smptd-nya selalu gagal. Karena data user & password tersimpan di MySQL, salah satu caranya adalah dengan trace setiap query yang di eksekusi oleh MySQL.

Debuggid di MySQL diaktifkan lewat file /etc/my.cnf

[mysqld]
log-output=FILE
general-log=1
general-log-file=/var/log/mysqlquery.log #pastikan file writetable

/var/log/mysqlquery.log harus dibuat manual.

# cd /var/log
# echo > mysqlquery.log
# chown mysql:mysql mysqlquery.log
# chmod 644 mysqlquery.log

Setelah itu, restart MySQL Anda.

Kini Anda bisa memeriksa setiap query yang di eksekusi oleh MySQL.
File log ini bisa berukuran sangat besar. Jadi, jangan lupa untuk menonaktifkannya (dengan cara memberi # atau menghapus konfigurasi tadi dibuat di my.cnf) jika Anda sudah tidak memerlukannya lagi.

Koneksi GPRS Modem di Linux UBUNTU 9.04

Koneksi Modem GPRS di Linux ternyata tidak ribet yang dikita. PLUG ‘N PLAY! Tinggal, colok (USB), yang langsung kebaca beserta account koneksinya.

Berikut ini adalah contoh koneksi Sony Ericsson K810i ke Ubuntu 9.04 (sebagai modem GPRS) di COMPAQ Presario V3000.


Begitu colok, langsung muncul dialog box diatas. Next!


Pilih operator yang digunakan. Pilihan diatas mungkin berbeda untuk setiap perangkat. Perangkat yang saya gunakan adalah HP Sony Ericsson K810i.


Klik Apply.

Untuk koneksi, klik Network Applet yang berada disebelah kanan atas desktop, jika semuanya berjalan dengan baik, pada menu akan muncul juga nama account operator terkait. Klik pada nama account tersebut maka … voila! You are connected! 🙂

Hah, makin cinta deh ama Jaunty Jackalope. 🙂

Aku Cinta “Gutsy Gibbon”, Tapi …

Hah … aku cinta Gutsy Gibbon. Baru kali ini rasanya gw bener-bener ngerasa enjoy dengan linux.

Tapi untuk migrasi … rasanya blon siap. Ada beberapa kendala, mengapa saya belum beralih ke LINUX

Aplikasi

Sementara ini saya masih banyak bekerja menggunakan Adobe Dreamweaver & Adobe Photoshop. Harus saya akui, keduanya adalah program yang sangat hebat, banyak membantu dan menghemat banyak waktu saya dalam web development. Kalau dibanding Bluefish & gIMP mah … duh, masih belum ada apa-apanya. 😦 Tapi, yah … gratisan … harus cukup bersyukur ini juga

Hardware Compability

Sampai sekarang saja … konek ke HP via bluetooth, masih banyak kendala. Mungkin ini memang karena saya yang kurang familiar dengan Bluetooth di-LINUX. Untuk hal lain juga … lumayan merepotkan. Misal: perkara printer yang drivernya untung-untungan, VGA yang masih suka ngaco-ngaco kalau dipake dual-monitor, power management yang belum begitu mantap (Sleep & Wake selalu ngaco), modem yang drivernya juga agak untung-untungan juga dan banyak hal lainnya.

Office Suite

Saya banyak mengandalkan Microsoft Office dipekerjaan saya. OpenOffice, bagus, tapi … menurut saya ada banyak fasilitas di OpenOffice yang masih begitu belum memadai. OpenOffice Presentation yang masih suka ngaco, kesulitan mengatur pencetakan menggunakan OpenOffice Calc, OpenOffice Database yang masih kerasa prematur dibading MS Access, Shape di OpenOffice Writer yang masih sangat tidak enak untuk digunakan, dan banyak hal lainnya. Yah, … memang, gratisan. Harus bersyukur segitu juga. Keduanya tidak pantas diperbandingkan. Tapi, gimana ya … ngerasa belum rela melepaskan kenyamanan yang ditawarkan MS Office.

Develompent Tools

Untuk development tools, sementara ini saya masih banyak menggunakan DELPHI. Tapi … kelak kalau sudah bisa JAVA, mungkin tidak masalah 😉

Gutsy Gibbon on my Compaq Presario V3000

Migrasi, Feisty Fawn ke Gutsy Gibbon. Tadinya mau coba upgrade, tapi … koneksi internet kurang memungkinkan. Jadinya … download Gusty Gibbon alternate CD AMD64, install ulang. Hasilnya … voila! It works! No sweat!

Langsung tok cer. VGA lancar, splash screen ga burem lagi, COMPIZ udah langsung terinstall. Cuma, hal yang membuat saya agak kecewa adalah driver wireless yang tetap saja tidak bisa berjalan dengan baik. Sejak dari Edgy Eft, Feisty Fawn sampai sekarang Gutsy Gibbon, wireless masih harus secara manual di-set menggunakan ndiswrapper.

Meskipun demikian, Gutsy Gibbon keren! baru kali ini saya merasa puas dengan UBUNTU. I think everybody should try it. Kalau Anda pengguna baru LINUX, saya sangat menyarankan UBUNTU Gutsy Gibbon. Tapi, ingat … you must own a fine internet connection. Kalau tidak, mungkin agak “kesulitan”, atau kalau tetep mau coba, miliki 5 DVD repository.

Ubuntu + Beryl Compiz (after update)

New update on BERYL COMPIZ always excite me, but also thrilling.
It excite me because there’s always some improvement on every update. BERYL COMPIZ become better and better.
It thrill me because … sometime after update, some changes make BERYL COMPIZ works unexpectedly and FREEZE.

Now, my last update make my BERYL COMPIZ freeze. But after running Compiz Manager and close, BERYL COMPIZ again normal. Except for “Desktop Cube” option. If I enabled that option, my desktop suddenly become smaller. Don’t know why. 😦

Any suggestion?!?

Migrating from BERYL to COMPIZ FUSION

Quite satisfied with Feisty Fawn + Beryl. But, unfortunately Beryl project is no more, because now Beryl and Compiz are merging, becoming COMPIZ FISION.

I look some information on the internet, I found there’s quite many people give positives comment about Compiz Fusion, so I decided to give it a try.

On first attempt, the installation using Synaptic Package Manager were failed. Then, I try to uninstall it, and install it again. (I don’t know why but) It works! 🙂 Then I try to start Compiz using compiz –replace command. But nothing happen. I search on internet, but I can’t find any solution. Well It’s a new project, may be it wasn’t perfect yet. So, I just give up for a while. (Beside, I still have a deadline to catch up on my work).

Few days later, Update Manager notifies me that there’s a new update on emerand module. Then I update those modules, I restart my UBUNTU then … voi la! compiz –replace really does works!

Compiz Fusion really does AMAZING! It has smoother animation that Beryl.

The only problem I that black window problem (sometime the window became blank/black). But I manage to fix it by using compiz –replace –indirect-rendering while starting Compiz.