Distributed Postfix Mail Server


1. Pendahuluan
1.1. Tentang Dokumen Ini
1.2. Keterangan Singkat
2. Kebutuhan Sistem
3. MySQL
3.1. Pemilihan MySQL
3.2. Instalasi
3.3. Membuat Database
3.4. Membuat Tabel Alias
3.5. Membuat Tabel Domain
3.6. Membuat Tabel Mailbox
3.7. Mengisi Record
3.8. Eksekusi Query
4. Postfix
4.1. Download Source Code
4.2. Patch & Build
4.3. Instalasi Paket
4.4. Setup Postfix
4.4.1. main.cf
4.4.2. mysql_virtual_alias_maps.cf
4.4.3. mysql_virtual_domains_maps.cf
4.4.4. mysql_virtual_mailbox_maps.cf
4.4.5. mysql_virtual_mailbox_limit_maps.cf
4.4.6. mysql_relay_domains_maps.cf
4.5. Catatan
4.6. Percobaan
5. Courier
5.1. Instalasi
5.2. Konfigurasi
5.2.1. authmysqlrc
5.2.2. authdaemonrc
5.3. Percobaan
5.3.1. IMAP
5.3.2. POP3
6. SASL2
6.1. Download Source Code
6.2. Pembuatan Paket
6.3. Instalasi Dan Konfigurasi
6.3.1. Instalasi
6.3.2. Konfigurasi
6.4. Dirty Hack
6.5. Percobaan
7. Antivirus
7.1. ClamAV
7.1.1. Instalasi
7.1.2. Konfigurasi
7.2. Spamassassin
7.2.1. Instalasi
7.2.2. Konfigurasi
7.3. Sender Policy Framework (SPF)
7.3.1. Pendahuluan
7.3.2. Mekanisme
7.3.3. Instalasi
7.3.4. Konfigurasi
7.4. Amavisd-new
7.4.1. Instalasi
7.4.2. Konfigurasi Amavisd-new
7.4.3. Konfigurasi Postfix
7.4.4. Konfigurasi ClamAV
7.4.5. Menjalankan amavisd-new
7.4.6. Testing
8. Distributed System
8.1. Instalasi Mail & Database Server
8.2. NFS
8.2.1. Instalasi
8.2.2. Konfigurasi Server
8.2.3. Konfigurasi Client
8.3. DNS Round Robin
9. Testing Keseluruhan
10. Referensi

1. Pendahuluan

1.1. Tentang Dokumen Ini

Tidak ada copyright apapun dalam dukumen ini, anda bebas menyalin, mencetak, maupun memodifikasi. Saran, koreksi, kritik, kesalahan ketik, maupun ucapan lain-lain silakan dikirimkan ke email penulis: kamas {at} its {dot} ac {dot} id. Terima Kasih.

1.2. Keterangan Singkat

Manual ini berisi tentang panduan untuk membuat distributed mail server dengan menggunakan postfix sebagai MTAnya. Sistem operasi yang digunakan adalah Debian GNU/Linux etch/testing. Penyimpanan data email dilakukan pada sebuah file server melalui protokol NFS (Network File System).

Domain yang ditangani oleh sistem ini bersifat virtual, di mana data domain, alias(forwarding), dan data user disimpan pada database MySQL. Cara ini merupakan cara yang efektif pada mailserver yang menangani data user dalam jumlah besar karena tidak ada akses file teks langsung seperti yang terjadi pada penyimpanan user dengan metode passwd.

2. Kebutuhan Sistem

Paket-paket program yang digunakan dalam sistem ini merupakan paket debian itu sendiri, namun ada beberapa komponen yang harus ditambahkan secara manual pada postfix dan librari authentikasinya.

Program yang harus diinstall adalah:

  1. postfix

  2. postfix-mysql

  3. mysql-client

  4. mysql-server

  5. sasl2-bin

  6. libsasl2-modules

  7. libsasl2-modules-sql

  8. courier-authdaemon

  9. courier-authlib-mysql

  10. courier-imap

  11. courier-pop

  12. nfs-kernel-server

  13. portmap

  14. clamav-daemon

  15. clamav-freshclam

  16. amavisd-new

  17. spamassassin

  18. zoo

  19. unzip

  20. unrar

  21. unarj

Patch yang harus didownload adalah Postfix-VDA patch untuk mengaktifkan fasilitas quota virtual mailbox user.

3. MySQL

3.1. Pemilihan MySQL

Pemilihan MySQL sebagai backend database didasarkan pada beberapa alasan berikut ini:

  1. Akses cepat.

  2. Sederhana.

  3. Administrasinya mudah.

3.2. Instalasi

Instalasi pada debian dilakukan dengan menggunakan apt-get.

root# apt-get install mysql-server-4.1 mysql-client-4.1 libmysqlclient10
Reading Package Lists... Done 
Building Dependency Tree... Done 
The following extra packages will be installed:
  libdbd-mysql-perl libmysqlclient14 
Suggested packages: 
  mysql-doc-4.1 
Recommended packages: 
  libmysqlclient14-dev 
The following NEW packages will be installed: 
  libdbd-mysql-perl libmysqlclient14 mysql-client-4.1 mysql-server-4.1 libmysqlclient10
0 upgraded, 4 newly installed, 0 to remove and 6 not upgraded. 
Need to get 16.9MB of archives. 
After unpacking 36.3MB of additional disk space will be used. 
Do you want to continue? [Y/n] 

Ketik "Y" dan tunggu hingga instalasi selesai. Setelah itu segeralah set password root untuk mysql karena awalnya account root tidak berpassword.

root:~# mysqladmin -u root password 'passwordRoot'

3.3. Membuat Database

Pada tahap ini kita membuat database untuk menyimpan data-data yang dibutuhkan oleh postfix. Selain database, kita juga akan membuat user untuk mengakses database ini.

root# mysql -u root -p 
Enter password: ************ 
Welcome to the MySQL monitor. 
Commands end with ; or \g. Your MySQL connection id is 8 to server version: 4.1.11-Debian_4-log 
Type 'help;' or '\h' for help. Type '\c' to clear the buffer. 

mysql> create database postfix; 
Query OK, 1 row affected (0.00 sec) 

mysql> grant all privileges on postfix.* to postfix@'%' identified by 'postfix'; 
Query OK, 0 rows affected (0.02 sec) 

mysql> flush privileges; 
Query OK, 0 rows affected (0.00 sec) 

mysql> exit 
Bye

Perintah pertama adalah perintah yang digunakan untuk membuat database 'postfix'. Kemudian kita memberikan semua hak pengaturan database ini pada user 'postfix' dengan password 'postfix'. Perintah yang terakhir adalah mereload tabel privileges agar user postfix dapat menggunakan database yang baru dibuat.

3.4. Membuat Tabel Alias

Tabel ini menyimpan data email alias atau forwarding.

USE postfix; 
CREATE TABLE `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) 
) TYPE=MyISAM COMMENT='Postfix Admin - Virtual Aliases';

FIeld penting yang ada pada tabel ini adalah address dan goto.

  • address: merupakan alamat email yang dipasang sebagai email virtual.

  • goto: merupakan alamat asli yang digunakan untuk menerima email yang ditujukan pada alamat yang tertera pada field address.

3.5. Membuat Tabel Domain

Tabel ini memuat data virtual domain yang ditangani oleh postfix.

USE postfix; 
CREATE TABLE `domain` ( 
   `domain` varchar(255) NOT NULL default '', 
   `description` varchar(255) NOT NULL default '', 
   `aliases` int(10) NOT NULL default '0', 
   `mailboxes` int(10) NOT NULL default '0', 
   `maxquota` int(10) 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) 
) TYPE=MyISAM COMMENT='Postfix Admin - Virtual Domains';

3.6. Membuat Tabel Mailbox

Tabel mailbox merupakan tabel yang memuat data user masing-masing domain. Field username berisi nama login yang digunakan oleh user + domain emailnya. Contoh: "kamas@sokam.or.id". Field maildir merupakan direktori tempat penyimpanan email user yang bersangkutan. Contoh: "sokam.or.id/k/kamas/". Field quota merupakan batasan besar total space yang digunakan untuk penyimpanan email user yang bersangkutan. Satuan yang digunakan dalam menyebutkan quota adalah bytes.

USE postfix; 
CREATE TABLE `mailbox` ( 
   `username` varchar(255) NOT NULL default '', 
   `password` varchar(255) NOT NULL default '', 
   `name` varchar(255) NOT NULL default '', 
   `maildir` varchar(255) NOT NULL default '', 
   `quota` int(10) NOT NULL default '0', 
   `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 (`username`) 
) TYPE=MyISAM COMMENT='Postfix Admin - Virtual Mailboxes';

3.7. Mengisi Record

Sekarang kita akan mengisikan beberapa record sebagai username percobaan.

INSERT INTO domain( domain, description) VALUES ( "sokam.or.id", "Domain pertama" ); 
INSERT INTO alias( address, goto ) VALUES ( "postmaster@sokam.or.id", "kamas@sokam.or.id" ); 
INSERT INTO mailbox( username, password, name, maildir ) VALUES( "kamas@sokam.or.id", 
                  "$1$RRsQjzUX$q3Kw.ZwBF9wuxKItj0AdG0", "Kamas Muhammad", "sokam.or.id/k/kamas/" );

Query pertama adalah memasukkan domain sokam.or.id sebagai salah satu domain yang ditangani oleh postfix.

Pada query kedua kita membuat alamat alias 'postmaster@sokam.or.id' yang mana semua email yang dikirim ke alamat ini akan diforward ke alamat 'kamas@sokam.or.id'.

Query terakhir adalah membuat mailbox asli. Dapat dilihat bahwa password yang digunakan adalah jenis MD5-Crypt(). String tersebut adalah hasil enkripsi "sokam". Jangan lupa pula untuk mengakhiri isi field maildir dengan "/".

Anda dapat menggunakan script perl kecil di bawah ini untuk mengkonversi plain text menjadi MD5-Crypt encrypted text.

#!/usr/bin/perl
use Crypt::PasswdMD5;
$password = shift;
print $password . ": " . unix_md5_crypt( $password );
print "\n";

Script di atas dapat dijalankan melalui command line. Password yang akan diencrypt adalah parameter pertama yang digunakan saat mengeksekusi script ini. Contoh eksekusi:

root# ./buatpass.pl rahasia
rahasia: $1$Gb3lfDgO$jUAADugJmrAUrFom9PUXG/

3.8. Eksekusi Query

Kumpulkan query-query di atas menjadi sebuah file .sql, kemudian masukkan ke database postfix. Bila anda mengumpulkan query-query tersebut dalam file tabel.sql, maka jalankan perintah berikut:

root# mysql -u postfix -p postfix < tabel.sql 
Enter password: *******

4. Postfix

4.1. Download Source Code

Di sini, kita menggunakan source code postfix yang telah dipatch oleh debian sehingga memudahkan kita untuk membangun paket .deb dan kemudian mendistribusikan hasil pembuatan paket ini ke server lain dalam sistem terdistribusi ini.

Selain mendownload source code postfix, kita juga perlu mendownload patch VDA untuk postfix.

root# wget http://ftp.debian.org/debian/pool/main/p/postfix/postfix_2.2.4.orig.tar.gz
--15:50:29--  http://ftp.debian.org/debian/pool/main/p/postfix/postfix_2.2.4.orig.tar.gz
           => `postfix_2.2.4.orig.tar.gz'
Resolving ftp.debian.org... 128.101.80.133
Connecting to ftp.debian.org|128.101.80.133|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 2,427,281 (2.3M) [application/x-tar]

100%[=======================================================>] 2,427,281     26.72K/s    ETA 00:00

15:51:49 (31.06 KB/s) - `postfix_2.2.4.orig.tar.gz' saved [2427281/2427281]

root# wget http://ftp.debian.org/debian/pool/main/p/postfix/postfix_2.2.4-1.diff.gz
--15:55:36--  http://ftp.debian.org/debian/pool/main/p/postfix/postfix_2.2.4-1.diff.gz
           => `postfix_2.2.4-1.diff.gz'
Resolving ftp.debian.org... 128.101.80.133
Connecting to ftp.debian.org|128.101.80.133|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 127,128 (124K) [text/plain]

100%[=======================================================>] 127,128       22.19K/s    ETA 00:00

15:55:43 (22.16 KB/s) - `postfix_2.2.4-1.diff.gz' saved [127128/127128]

root# wget http://ftp.debian.org/debian/pool/main/p/postfix/postfix_2.2.4-1.dsc
--15:55:52--  http://ftp.debian.org/debian/pool/main/p/postfix/postfix_2.2.4-1.dsc
           => `postfix_2.2.4-1.dsc'
Resolving ftp.debian.org... 128.101.80.133
Connecting to ftp.debian.org|128.101.80.133|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 834 [text/plain]

100%[=======================================================>] 834           --.--K/s

15:55:53 (23.39 MB/s) - `postfix_2.2.4-1.dsc' saved [834/834]


root# wget http://web.onda.com.br/nadal/postfix/VDA/postfix-2.2.4-vda.patch.gz
--16:14:01--  http://web.onda.com.br/nadal/postfix/VDA/postfix-2.2.4-vda.patch.gz
           => `postfix-2.2.4-vda.patch.gz'
Resolving web.onda.com.br... 200.195.192.31
Connecting to web.onda.com.br|200.195.192.31|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 7,712 (7.5K) [text/plain]

100%[=======================================================>] 7,712          4.70K/s

16:14:05 (4.70 KB/s) - `postfix-2.2.4-vda.patch.gz' saved [7712/7712]

4.2. Patch & Build

Setelah proses download selesai, kini yang harus kita lakukan adalah mengextract nya.

root# dpkg-source -x postfix_2.2.4-1.dsc
dpkg-source: extracting postfix in postfix-2.2.4
dpkg-source: unpacking postfix_2.2.4.orig.tar.gz
dpkg-source: applying ./postfix_2.2.4-1.diff.gz

Kemudian kita masukkan patch VDA ke source code postfix, dan membuat paket .debnya

root# cd postfix-2.2.4/
root# zcat ../postfix-2.2.4-vda.patch.gz | patch -p1
patching file README_FILES/VDA_README
patching file src/global/mail_params.h
patching file src/util/file_limit.c
patching file src/virtual/mailbox.c
patching file src/virtual/maildir.c
patching file src/virtual/virtual.c
patching file src/virtual/virtual.h

root# dpkg-buildpackage
dpkg-buildpackage: source package is postfix
dpkg-buildpackage: source version is 2.2.4-1
dpkg-buildpackage: source changed by LaMont Jones <lamont@debian.org>
dpkg-buildpackage: host architecture i386
.
.
.

Bila pada tahap ini terdapat pesan error "dpkg-buildpackage: Build dependencies/conflicts unsatisfied; aborting." maka anda harus terlebih dahulu menginstall paket-paket dev yang disebutkan. Misal:

dpkg-checkbuilddeps: Unmet build dependencies: debhelper (>= 4.1.16) libdb4.2-dev libgdbm-dev 
libldap2-dev (>= 2.1) libpcre3-dev libmysqlclient10-dev libssl-dev (>= 0.9.7-1) libsasl2-dev 
libpq-dev po-debconf (>= 0.5.0) dpatch
dpkg-buildpackage: Build dependencies/conflicts unsatisfied; aborting.

Maka installah paket-paket yang disebutkan dalam baris "Unmet build dependencies", dan jalankan dpkg-buildpackage sekali lagi.

Setelah proses kompilasi dan pembuatan paket berhasil, maka anda akan mendapatkan beberapa file .deb di atas direktori anda saat ini.

root# cd .. 
root# ls -1
postfix-2.2.4/
postfix_2.2.4-1.diff.gz
postfix_2.2.4-1.dsc
postfix_2.2.4-1_i386.changes
postfix_2.2.4-1_i386.deb
postfix_2.2.4.orig.tar.gz
postfix-2.2.4-vda.patch.gz
postfix-dev_2.2.4-1_all.deb
postfix-doc_2.2.4-1_all.deb
postfix-ldap_2.2.4-1_i386.deb
postfix-mysql_2.2.4-1_i386.deb
postfix-pcre_2.2.4-1_i386.deb
postfix-pgsql_2.2.4-1_i386.deb

4.3. Instalasi Paket

Pada awal instalasi, debian menyertakan exim sebagai MTA yang digunakan. Anda harus menghapus paket-paket exim ini terlebih dahulu sebelum menginstall postfix.

root# dpkg -P --force-all exim4 exim4-base exim4-config exim4-daemon-light

Dari beberapa paket yang ada, kita hanya membutuhkan dua buah yaitu postfix dan postfix-mysql. Installah kedua paket itu dengan menggunakan dpkg.

root # dpkg -i postfix_2.2.4-1_i386.deb postfix-mysql_2.2.4-1_i386.debSelecting previously deselected package postfix.
(Reading database ... 54917 files and directories currently installed.)
Unpacking postfix (from postfix_2.2.4-1_i386.deb) ...
Selecting previously deselected package postfix-mysql.
Unpacking postfix-mysql (from postfix-mysql_2.2.4-1_i386.deb) ...
Setting up postfix (2.2.4-1) ...
Adding group `postfix' (104)...
Done.
Adding system user `postfix'...
Adding new user `postfix' (103) with group `postfix'.
Not creating home directory.
setting synchronous mail queue updates: false
Creating /etc/postfix/dynamicmaps.cf
Adding tcp map entry to /etc/postfix/dynamicmaps.cf
Adding group `postdrop' (105)...
Done.
setting myhostname: mailku.sokam.or.id
setting alias maps
setting alias database
setting myorigin
setting destinations: mailku.sokam.or.id, mailku, localhost
setting relayhost:
setting mynetworks: 127.0.0.0/8
setting mailbox_command
setting mailbox_size_limit: 0
setting recipient_delimiter: +
setting inet_interfaces: all

Postfix is now set up with a default configuration.  If you need to make
changes, edit
/etc/postfix/main.cf (and others) as needed.  To view Postfix configuration
values, see postconf(1).

After modifying main.cf, be sure to run '/etc/init.d/postfix reload'.

Running newaliases
Starting mail transport agent: Postfix.

Setting up postfix-mysql (2.2.4-1) ...
Adding mysql map entry to /etc/postfix/dynamicmaps.cf

Pada proses instalasi anda akan diberi beberapa pertanyaan yang berkenaan dengan konfigurasi postfix. Untuk saat ini jawab defaultnya saja, karena nanti akan kita ubah secara manual.

4.4. Setup Postfix

File konfigurasi postfix dibagi menjadi beberapa file. Dua file utama adalah master.cf dan main.cf.

master.cf merupakan file konfigurasi yang mengatur komponen apa sajakah yang dijalankan oleh daemon postfix. Komponen ini dapat berupa mekanisme pengiriman seperti maildrop dan lmtp, atau mungkin layanan content-filtering seperti amavis.

main.cf merupakan file konfigurasi yang mengatur jalannya komponen-komponen daemon postfix. File ini merupakan konfigurasi utama yang mengatur seluruh aktifitas postfix. Parameter konfigurasi lengkap dapat dilihat melaui postconf(5).

Sebelum mengatur isi file main.cf, kita harus membuat sebuah user dan group terlebih dahulu sebagai pemilik mailbox user-user virtual. User ini nantinya harus ada di semua node dalam sistem ini dengan UID dan GID yang SAMA PERSIS.

root# addgroup --gid 666 vmailbox 
Adding group `vmailbox' (666)...
Done.

root# adduser --system --home /var/mailbox --shell /bin/false --uid 666 --gid 666 vmailbox 
Adding system user `vmailbox'...
Adding new user `vmailbox' (666) with group `vmailbox'.
Creating home directory `/var/mailbox'.

root# id vmailbox 
uid=666(vmailbox) gid=666(vmailbox) groups=666(vmailbox)

Pada contoh pembuatan user dan group di atas, UID dan GID yang digunakan adalah 666.

Bagian di bawah ini merupakan isi beberapa file konfigurasi yang digunakan oleh postfix.

4.4.1. main.cf

Ubahlah file /etc/postfix/main.cf seperti listing di bawah ini. Ingatlah bahwa segala macam domain yang kita tangani bersifat virtual, sehingga tidak boleh dimasukkan dalam daftar $mydestination. Domain yang diisikan pada variabel ini adalah domain yang bersifat lokal, yang emailnya dikirimkan pada user lokal (terdapat pada /etc/passwd).

smtpd_banner = $myhostname ESMTP $mail_name
biff = no
append_dot_mydomain = no
myhostname = mailku.sokam.or.id
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
# daftar domain lokal
mydestination = mailku, mailku.sokam.or.id, localhost
# daftar jaringan yang direlay
mynetworks = 127.0.0.0/8
recipient_delimiter = +

# setting virtual domain yang disimpan dalam database MySQL
virtual_alias_maps = mysql:/etc/postfix/mysql_virtual_alias_maps.cf
virtual_gid_maps = static:666
# direktori awal mailbox user, sesuai dengan home direktori
# user vmailbox. Maildir tiap user akan terletak dalam direktori
# /var/mailbox/[info direktori maildir user dari database]
virtual_mailbox_base = /var/mailbox
virtual_mailbox_domains = mysql:/etc/postfix/mysql_virtual_domains_maps.cf
virtual_mailbox_limit = 51200000
virtual_mailbox_maps = mysql:/etc/postfix/mysql_virtual_mailbox_maps.cf
virtual_minimum_uid = 666
virtual_transport = virtual
virtual_uid_maps = static:666

# Tambahan untuk quota
virtual_create_maildirsize = yes
virtual_mailbox_extended = yes
virtual_mailbox_limit_maps = mysql:/etc/postfix/mysql_virtual_mailbox_limit_maps.cf
virtual_mailbox_limit_override = yes
virtual_maildir_limit_message = Sorry, this user has reach mailbox quota limit.
virtual_overquota_bounce = yes

4.4.2. mysql_virtual_alias_maps.cf

File ini digunakan untuk mengambil data email alias/forwarding.

user = postfix 
password = postfix 
hosts = 127.0.0.1 
dbname = postfix 
query = SELECT goto FROM alias WHERE address='%s' AND active = 1

4.4.3. mysql_virtual_domains_maps.cf

File ini digunakan untuk mengambil data domain yang ditangani oleh postfix.

user = postfix 
password = postfix 
hosts = 127.0.0.1 
dbname = postfix 
query = SELECT domain FROM domain WHERE domain='%s' 
#optional query to use when relaying for backup MX 
#query = SELECT domain FROM domain WHERE domain='%s' and backupmx = '0' and active = '1'

4.4.4. mysql_virtual_mailbox_maps.cf

File ini digunakan oleh postfix untuk menentukan direktori tempat penyimpanan email tiap user. Saat postfix menerima email untuk user, maka postfix akan melakukan query ke database dan mengambil informasi lokasi maildir user yang bersangkutan.

user = postfix 
password = postfix 
hosts = 127.0.0.1 
dbname = postfix 
query = SELECT maildir FROM mailbox WHERE username='%s' AND active = 1

4.4.5. mysql_virtual_mailbox_limit_maps.cf

File ini digunakan untuk mengambil informasi mengenai quota mailbox tiap user.

user = postfix 
password = postfix 
hosts = 127.0.0.1 
dbname = postfix 
query = SELECT quota FROM mailbox WHERE username='%s'

4.4.6. mysql_relay_domains_maps.cf

File ini digunakan untuk memeriksa relay domain yang ditangani oleh postfix.

user = postfix 
password = postfix 
hosts = localhost 
dbname = postfix 
query = SELECT domain FROM domain WHERE domain='%s' and backupmx = '1'

4.5. Catatan

Semua file di atas disimpan dalam direktori /etc/postfix. File-file dengan nama mysql_* merupakan file konfigurasi postfix yang menyebutkan username, host, dan password untuk koneksi ke database, serta query yang dijalankan untuk mengambil informasinya. Oleh karena itu jangan lupa untuk menset agar file-file tersebut hanya dapat dibaca oleh postfix dan root.

root# chmod 640 mysql*
root# chgrp postfix mysql_*

Postfix di Debian dijalankan dalam chroot, sehingga akan jauh lebih mudah bila kita mengisikan alamat IP pada parameter hosts daripada mengisikan hostname. Bila menggunakan hostname, maka pastikan bahwa ada resolver dalam chroot postfix agar dapat meresolv alamat IP via gethostbyname().

4.6. Percobaan

Setelah semua file konfigurasi selesai dibuat jalankan postfix dan kemudian cobalah untuk membuat sebuah koneksi ke postfix dengan menggunakan telnet.

root# /etc/init.d/postfix restart
Stopping mail transport agent: Postfix.
Starting mail transport agent: Postfix.
root# telnet localhost 25
Trying 127.0.0.1...
Connected to localhost.localdomain.
Escape character is '^]'.
220 mailku.sokam.or.id ESMTP Postfix
EHLO mail.com
250-mailku.sokam.or.id
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250 8BITMIME
QUIT
221 Bye
Connection closed by foreign host.

Baris yang dicetak tebal adalah inputan user.

Bila tampilan yang anda dapatkan mirip dengan tampilan di atas, berarti postfix anda sudah bekerja. Kemudian cobalah mengirimkan email ke user yang telah kita buat.

root# echo "coba email" | mail -s cobaKirim kamas@sokam.or.id
root# tail /var/log/mail.log
Oct 16 07:05:29 kunti postfix/qmgr[17363]: CAEFA1060A: from=<root@mailku.sokam.or.id>, size=308,nrcpt=1 
  (queue active)
Oct 16 07:05:29 kunti postfix/virtual[17367]: CAEFA1060A: to=<kamas@sokam.or.id>, relay=virtual,delay=52, 
 status=sent (delivered to maildir)
Oct 16 07:05:29 kunti postfix/qmgr[17363]: CAEFA1060A: removed

Bila anda mendapatkan tampilan yang kira-kira mirip dengan yang di atas, berarti postfix anda telah berjalan dengan lancar. (Perhatikan tulisan yang dicetak tebal).

5. Courier

Courier merupakan suatu software set mail server lengkap mulai MTA sampai client interfacenya. Di sini kita hanya menggunakan beberapa komponen yaitu:

  1. courier-authdaemon: Daemon authentikasi utama.

  2. courier-authlib-mysql: Interface authentikasi courier untuk melakukan authentikasi ke mysql.

  3. courier-imap: Layanan IMAP untuk akses mailbox user

  4. courier-pop: Layanan POP3 untuk akses mailbox user

5.1. Instalasi

Instalasi paket-paket courier cukup mudah, hanya dengan menggunakan apt-get.

root# apt-get install courier-authdaemon courier-authlib-mysql courier-imap courier-pop
Reading Package Lists... Done
Building Dependency Tree... Done
The following extra packages will be installed:
  courier-base libmysqlclient12
Suggested packages:
  courier-doc imap-client courier-imap-ssl courier-pop-ssl
The following NEW packages will be installed:
  courier-authdaemon courier-authmysql courier-base courier-imap courier-pop libmysqlclient12
0 upgraded, 6 newly installed, 0 to remove and 2 not upgraded.
Need to get 1993kB of archives.
After unpacking 5452kB of additional disk space will be used.
Do you want to continue? [Y/n]

Ketik "Y" dan tunggu hingga instalasi selesai.

5.2. Konfigurasi

File konfigurasi courier terkumpul dalam direktori /etc/courier. File konfigurasi yang kita ubah hanya dua file, yaitu authmysqlrc dan authdaemonrc.

5.2.1. authmysqlrc

MYSQL_CRYPT_PWFIELD password
MYSQL_DATABASE postfix
MYSQL_GID_FIELD '666'
MYSQL_HOME_FIELD '/var/mailbox'
MYSQL_LOGIN_FIELD username
MYSQL_MAILDIR_FIELD maildir
MYSQL_NAME_FIELD name
MYSQL_OPT 0
MYSQL_PASSWORD postfix
MYSQL_QUOTA_FIELD quota
MYSQL_SERVER 127.0.0.1
MYSQL_SOCKET /var/run/mysqld/mysqld.sock
MYSQL_UID_FIELD '666'
MYSQL_USERNAME postfix
MYSQL_USER_TABLE mailbox

Berhati-hatilah dalam mengubah file ini, karena di belakang nilai suatu variabel tidak boleh ada spasi/tab, dan segala macam whitespace.

5.2.2. authdaemonrc

Ada beberapa modul authentikasi yang dapat dijalankan oleh courier-authdaemon. Anda hanya perlu mengubah sebuah parameter yaitu:

authmodulelist="authpam"

menjadi:

authmodulelist="authmysql"

Setelah anda mengubah kedua file di atas, restartlah courier-authdaemon.

root# /etc/init.d/courier-authdaemon restart
Stopping Courier authdaemon: done.
Starting Courier authdaemon: done.

5.3. Percobaan

Pada saat pengisian database di atas kita telah mengisikan user "kamas@sokam.or.id" dengan password "sokam". Username dan password inilah yang akan kita gunakan untuk mencoba instalasi courier.

5.3.1. IMAP

# telnet localhost 143
Trying 127.0.0.1...
Connected to localhost.localdomain.
Escape character is '^]'.
* OK [CAPABILITY IMAP4rev1 UIDPLUS CHILDREN NAMESPACE THREAD=ORDEREDSUBJECT THREAD=REFERENCES 
SORT QUOTA IDLE ACL ACL2=UNION] Courier-IMAP ready. Copyright 1998-2004 Double Precision, 
Inc.  SeeCOPYING for distribution information.
a login kamas@sokam.or.id sokam
a OK LOGIN Ok.
a logout
* BYE Courier-IMAP server shutting down
a OK LOGOUT completed
Connection closed by foreign host.

Baris yang dicetak tebal adalah inputan user.

Bila anda mendapatkan hasil seperti di atas berarti instalasi layanan IMAP sudah dapat digunakan.

5.3.2. POP3

# telnet localhost 110
Trying 127.0.0.1...
Connected to localhost.localdomain.
Escape character is '^]'.
+OK Hello there.
user kamas@sokam.or.id
+OK Password required.
pass sokam
+OK logged in.
quit
+OK Bye-bye.
Connection closed by foreign host.

Baris yang dicetak tebal adalah inputan user.

Bila anda mendapatkan hasil seperti di atas berarti instalasi layanan POP3 sudah dapat digunakan.

6. SASL2

Cyrus SASL (Simple Authentication and Security Layer) adalah suatu librari yang memungkinkan program lain melakukan authentikasi melalui librari ini ke berbagai mekanisme. Metode yang sering digunakan adalah authentikasi menggunakan sasldb, mysql, atau PAM.

Pada sistem ini libsasl digunakan oleh postfix untuk mengaktifkan fasilitas SMTP-AUTH sehingga pengiriman ke domain selain yang ditangani oleh postfix tidak dapat dilakukan kecuali setelah user melakukan authentikasi terlebih dahulu.

Sayangnya, libsasl di debian tidak mendukung komunikasi langsung dengan socket courier-authdaemon yang juga kita gunakan. Oleh karena itu (seperti pada bagian postfix) kita harus melakukan kompilasi ulang dan membuat sendiri paket .debnya.

6.1. Download Source Code

root# wget http://ftp.debian.org/debian/pool/main/c/cyrus-sasl2/cyrus-sasl2_2.1.19.orig.tar.gz
--05:30:27--  http://ftp.debian.org/debian/pool/main/c/cyrus-sasl2/cyrus-sasl2_2.1.19.orig.tar.gz
           => `cyrus-sasl2_2.1.19.orig.tar.gz'
Connecting to 202.154.63.47:3128... connected.
Proxy request sent, awaiting response... 200 OK
Length: 1,531,667 (1.5M) [application/x-tar]

100%[=====================================================>] 1,531,667     37.07K/s    ETA 00:00

05:31:05 (42.13 KB/s) - `cyrus-sasl2_2.1.19.orig.tar.gz' saved [1531667/1531667]

root# wget http://ftp.debian.org/debian/pool/main/c/cyrus-sasl2/cyrus-sasl2_2.1.19-1.6.diff.gz
--05:31:09--  http://ftp.debian.org/debian/pool/main/c/cyrus-sasl2/cyrus-sasl2_2.1.19-1.6.diff.gz
           => `cyrus-sasl2_2.1.19-1.6.diff.gz'
Connecting to 202.154.63.47:3128... connected.
Proxy request sent, awaiting response... 200 OK
Length: 31,281 (31K) [text/plain]

100%[=====================================================>] 31,281        11.49K/s

05:31:12 (11.48 KB/s) - `cyrus-sasl2_2.1.19-1.6.diff.gz' saved [31281/31281]

root# wget http://ftp.debian.org/debian/pool/main/c/cyrus-sasl2/cyrus-sasl2_2.1.19-1.6.dsc
--05:31:20--  http://ftp.debian.org/debian/pool/main/c/cyrus-sasl2/cyrus-sasl2_2.1.19-1.6.dsc
           => `cyrus-sasl2_2.1.19-1.6.dsc'
Connecting to 202.154.63.47:3128... connected.
Proxy request sent, awaiting response... 200 OK
Length: 1,100 (1.1K) [text/plain]

100%[=====================================================>] 1,100         --.--K/s

05:31:22 (58.28 MB/s) - `cyrus-sasl2_2.1.19-1.6.dsc' saved [1100/1100]

Setelah proses download selesai extract tarballnya dengan menggunakan dpkg-source.

root# dpkg-source -x cyrus-sasl2_2.1.19-1.6.dsc
dpkg-source: extracting cyrus-sasl2 in cyrus-sasl2-2.1.19
dpkg-source: unpacking cyrus-sasl2_2.1.19.orig.tar.gz
dpkg-source: applying ./cyrus-sasl2_2.1.19-1.6.diff.gz

Masuklah ke direktori cyrus-sasl2-2.1.19 dan jalankan perintah sed di bawah ini untuk mengaktifkan fasilitas komunikasi dengan socket courier-authdaemon.

root# cd cyrus-sasl2-2.1.19 
root# sed -i 's@--enable-login@--enable-login --with-authdaemond=/var/run/courier/authdaemon/socket@' \
       debian/rules

6.2. Pembuatan Paket

Buat paket .deb dengan menggunakan dpkg-buildpackage seperti pada bagian sebelumnya (postfix). Bila ada error tentang build-dependencies, installah paket-paket yang diminta, kemudian ulangi proses dpkg-buildpackage.

root# dpkg-buildpackage
dpkg-buildpackage: source package is cyrus-sasl2
dpkg-buildpackage: source version is 2.1.19-1.6
dpkg-buildpackage: source changed by Steve Langasek <vorlon@debian.org>
dpkg-buildpackage: host architecture i386
...
...

Setelah pembuatan paket selesai, anda akan mempunyai beberapa file .deb di atas direktori tempat anda berada saat ini.

root# cd .. && ls -1
cyrus-sasl2-2.1.19/
cyrus-sasl2_2.1.19-1.6.diff.gz
cyrus-sasl2_2.1.19-1.6.dsc
cyrus-sasl2_2.1.19-1.6_i386.changes
cyrus-sasl2_2.1.19.orig.tar.gz
libsasl2_2.1.19-1.6_i386.deb
libsasl2-dev_2.1.19-1.6_i386.deb
libsasl2-modules_2.1.19-1.6_i386.deb
libsasl2-modules-gssapi-heimdal_2.1.19-1.6_i386.deb
libsasl2-modules-kerberos-heimdal_2.1.19-1.6_i386.deb
libsasl2-modules-sql_2.1.19-1.6_i386.deb
sasl2-bin_2.1.19-1.6_i386.deb

6.3. Instalasi Dan Konfigurasi

6.3.1. Instalasi

Dari beberapa file yang terdapat pada direktori ini, kita hanya memerlukan beberapa file yaitu:

  1. sasl2-bin_2.1.19-1.6_i386.deb

  2. libsasl2_2.1.19-1.6_i386.deb

  3. libsasl2-modules_2.1.19-1.6_i386.deb

  4. libsasl2-modules-sql_2.1.19-1.6_i386.deb

Install keempat modul di atas dengan menggunakan dpkg.

root# dpkg -i sasl2-bin_2.1.19-1.6_i386.deb \
       libsasl2-modules-sql_2.1.19-1.6_i386.deb \
       libsasl2-modules_2.1.19-1.6_i386.deb \
       libsasl2_2.1.19-1.6_i386.deb
Selecting previously deselected package sasl2-bin.
(Reading database ... 56436 files and directories currently installed.)
Unpacking sasl2-bin (from sasl2-bin_2.1.19-1.6_i386.deb) ...
Selecting previously deselected package libsasl2-modules-sql.
Unpacking libsasl2-modules-sql (from libsasl2-modules-sql_2.1.19-1.6_i386.deb) ...
Selecting previously deselected package libsasl2-modules.
Unpacking libsasl2-modules (from libsasl2-modules_2.1.19-1.6_i386.deb) ...
Preparing to replace libsasl2 2.1.19-1.5 (using libsasl2_2.1.19-1.6_i386.deb) ...
Unpacking replacement libsasl2 ...
Setting up libsasl2 (2.1.19-1.6) ...

Setting up sasl2-bin (2.1.19-1.6) ...

Setting up libsasl2-modules-sql (2.1.19-1.6) ...
Setting up libsasl2-modules (2.1.19-1.6) ...

6.3.2. Konfigurasi

Beberapa file yang harus dikonfigurasi ada di bawah ini. Inti tahap ini adalah mengaktifkan fasilitas SMTP-AUTH postfix sehingga menghindarkan postfix untuk berjalan secara open-relay namun tetap dapat digunakan dengan nyaman oleh para pengguna email.

6.3.2.1. /etc/postfix/main.cf

Tambahkan beberapa baris di bawah ini untuk mengaktifkan SMTP-AUTH.

broken_sasl_auth_clients = yes
smtpd_recipient_restrictions =
        permit_mynetworks,
        permit_sasl_authenticated,
        reject_non_fqdn_hostname,
        reject_non_fqdn_sender,
        reject_non_fqdn_recipient,
        reject_unauth_destination,
        reject_unauth_pipelining,
        reject_invalid_hostname
smtpd_sasl_auth_enable = yes
smtpd_sasl_local_domain = $myhostname
smtpd_sasl_security_options = noanonymous
6.3.2.2. /etc/postfix/sasl/smtpd.conf

File ini pada awalnya belum ada. Buatlah dengan menggunakan sebuah editor teks, dan isilah seperti ini:

pwcheck_method: authdaemond
log_level: 3
mech_list: PLAIN LOGIN
authdaemond_path: /var/run/courier/authdaemon/socket

6.4. Dirty Hack

Seperti telah disinggung sebelumnya, postfix berjalan dalam lingkungan chroot sehingga tidak akan dapat mengakses file atau socket atau apa pun di luar direktori chroot tersebut. Direktori chroot postfix adalah pada /var/spool/postfix. Agar dapat menjalankan authentikasi, maka socket courier-authdaemon harus berada dalam chroot postfix.

Untuk itu kita hentikan dulu courier-authdaemon, kemudian membuat direktori tempat socket courier-authdaemon yang berada dalam direktori chroot postfix, dan membuat symbolic link yang menghubungkan direktori socket courier-authdaemon yang berada di luar direktori chroot postfix.

root# /etc/init.d/courier-authdaemon stop
Stopping Courier authdaemon: done.
root# rm /var/run/courier/authdaemon -rf
root# mkdir -p /var/spool/postfix/var/run/courier/authdaemon
root# chmod 777 /var/spool/postfix/var/run/courier/authdaemon
root# ln -s /var/spool/postfix/var/run/courier/authdaemon /var/run/courier/authdaemon
root# /etc/init.d/courier-authdaemon start
Starting Courier authdaemon: done.

Proses pembuatan symlink di atas harus diulangi setiap courier-authdaemon distart, karena pada saat courier-authdaemon mati socket authentikasi yang digunakan langsung dihapus, dan akan dibuat lagi saat courier-authdaemon start. Untuk itu tambahkan beberapa baris kode di bawah ini pada script /etc/init.d/courier-authdaemon.

if [ ! -h /var/run/courier/authdaemon ]
then
        /bin/ln -s /var/spool/postfix/var/run/courier/authdaemon /var/run/courier/authdaemon
fi

Tambahkan kode di atas pada sekitar baris ke-8 atau 9, setelah deklarasi variabel $libexecdir.

6.5. Percobaan

Sebelum mencoba authentikasi SMTP postfix harus direstart terlebih dahulu untuk mengaktifkan konfigurasi yang baru.

root# /etc/init.d/postfix restart
Stopping mail transport agent: Postfix.
Starting mail transport agent: Postfix.

Username dan password yang digunakan untuk login smtp dienkripsi menggunakan metode base64. Anda dapat menggunakan script perl di bawah ini untuk mengubah plain text menjadi format enkripsi base64.

#!/usr/bin/perl
use MIME::Base64;
$username = shift;
$password = shift;
print ('Username : ');
print encode_base64( $username );
print ('Password : ');
print encode_base64( $password );

Anggap saja file ini disimpan dengan nama convert.pl. Sekarang kita mencoba untuk mengkonversi username dan password kita dari plain text menjadi format base64.

root# ./convert.pl kama@sokam.or.id sokam
Username : a2FtYXNAc29rYW0ub3IuaWQ=
Password : c29rYW0=

Cobalah untuk melakukan authentikasi SMTP menggunakan telnet dengan menggunakan username dan password terenkripsi seperti pada hasil eksekusi script di atas.

root# telnet localhost 25
Trying 127.0.0.1...
Connected to localhost.localdomain.
Escape character is '^]'.
220 mailku.sokam.or.id ESMTP Postfix
EHLO mail.com
250-mailku.sokam.or.id
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-AUTH LOGIN PLAIN
250-AUTH=LOGIN PLAIN
250 8BITMIME
AUTH LOGIN
334 VXNlcm5hbWU6
a2FtYXNAc29rYW0ub3IuaWQ=
334 UGFzc3dvcmQ6
c29rYW0=
235 Authentication successful
QUIT
221 Bye
Connection closed by foreign host.

Baris yang dicetak tebal adalah inputan user.

Bila anda mendapatkan tampilan seperti di atas, berarti authentikasi SMTP via SASL sudah berjalan dengan baik.

7. Antivirus

Pada bagian ini selain membahas antivirus kita juga akan menginstall spamassassin, yaitu sebuah program anti spam.

7.1. ClamAV

ClamAV adalah virus scanner opensource yang database virusnya secara rutin dikembangkan oleh komunitasnya di seluruh dunia. ClamAV lebih ditujukan untuk digunakan sebagai antivirus mailserver meski tidak menutup kemungkinan untuk digunakan di luar mailserver.

ClamAV mempunyai dua macam interface yaitu command line, dan daemon. Di sini kita akan menggunakan versi daemon sebagai antivirus utama dan versi command line sebagai backup. Versi Daemon dipilih karena dapat bekomunikasi dengan amavis melalui socket sehingga mempertinggi efisiensi sistem. Bila ada gangguan pada jalannya daemon tersebut, maka clamscanlah yang akan menggantikan posisinya sampai daemon clamav dapat berjalan kembali.

ClamAV juga mempunyai daemon lain yang disebut clamav-freshclam. Daemon ini bertugas untuk memperbarui database virus. Daemon ini akan memeriksa dbserver setiap 6 jam sekali, dan bila ada data baru maka data itu akan didownload.

7.1.1. Instalasi

Paket program yang dibutuhkan untuk instalasi clamav ada tiga yaitu clamav, clamav-daemon, dan clamav-freshclam.

Sebelum menginstall dengan menggunakan apt-get, hapus dulu paket libsasl2-dev. Paket ini tadinya kita gunakan dalam membuat paket postfix.

root# apt-get --purge remove libsasl2-dev
Reading Package Lists... Done
Building Dependency Tree... Done
Correcting dependencies... Done
The following packages will be REMOVED:
  libsasl2-dev
0 upgraded, 0 newly installed, 1 to remove and 2 not upgraded.
Need to get 0B of archives.
After unpacking 606kB disk space will be freed.
Do you want to continue? [Y/n]
(Reading database ... 56503 files and directories currently installed.)
Removing libsasl2-dev ...

Setelah itu barulah kita dapat menginstall paket-paket clamav.

root# apt-get install clamav clamav-daemon clamav-freshclam
Reading Package Lists... Done
Building Dependency Tree... Done
The following extra packages will be installed:
  clamav-base libclamav1 libgmp3c2
Suggested packages:
  unrar lha clamav-docs daemon
Recommended packages:
  arj unzoo
The following NEW packages will be installed:
  clamav clamav-base clamav-daemon clamav-freshclam libclamav1 libgmp3c2
0 upgraded, 6 newly installed, 0 to remove and 2 not upgraded.
Need to get 3524kB of archives.
After unpacking 4743kB of additional disk space will be used.
Do you want to continue? [Y/n]

Saat ada pertanyaan tentang metode update database virus pilihlah daemon. Kemudian pilih db.id.clamav.net sebagai mirror virus databasenya.

Setelah itu ada pertanyaan "apakah clamav-daemon harus direload setelah update?". Pilihlah "Yes" sehingga setelah update database virus selesai clamav-daemon dapat segera menggunakan datafile itu untuk scanning virus.

7.1.2. Konfigurasi

Sebenarnya kita tidak perlu mengkonfigurasi apa pun di sini. Kita hanya perlu mengubah user apa yang menjalankan clamav-daemon, karena nantinya kita akan mengintegrasikan clamav-daemon dengan Amavisd-new. File konfigurasi yang kita ubah adalah /etc/clamav/clamd.conf.

Ubahlah:

User clamav

Menjadi:

User amavis

File konfigurasi lengkapnya adalah sebagai berikut:

LocalSocket /var/run/clamav/clamd
FixStaleSocket
User clamav
ScanMail
ScanArchive
ArchiveMaxRecursion 5
ArchiveMaxFiles 1000
ArchiveMaxFileSize 10M
ArchiveMaxCompressionRatio 250
ReadTimeout 180
MaxThreads 12
MaxConnectionQueueLength 15
LogFile /var/log/clamav/clamav.log
LogTime
LogFileMaxSize 0
PidFile /var/run/clamav/clamd.pid
DatabaseDirectory /var/lib/clamav
SelfCheck 3600

Langkah terakhir adalah mengubah kepemilikan direktori /var/run/clamav agar dimiliki oleh user amavis. Langkah ini akan kita lakukan setelah selesai mengkonfigurasi amavisd-new.

7.2. Spamassassin

Spamassassin adalah sebuah daemon yang memeriksa isi tiap email yang masuk. Spamassassin mempunyai database sendiri mengenai pola-pola spam yang digunakan untuk memeriksa isi email. Tiap ada pola yang cocok dengan pola spam umum, maka skor untuk email yang diperiksa akan bertambah sesuai dengan bobot pola yang ditemukan. Bila hasil skor akhirnya melebihi batas yang kita kehendaki, maka email yang diperiksa akan dikarantina.

Selain database itu, spamassassin juga dapat melakukan spam-learning menggunakan algoritma bayesian statistic. Seperti bisa dibaca pada judul fasilitasnya, spamassassin dapat mempelajari pola-pola baru melalui email yang kita kirimkan. Perlu diingat bahwa untuk dapat bekerja dengan baik kita perlu memberikan email spam dan ham (non-spam) untuk dipelajari. Kita tidak bisa mengharapkan pembelajaran yang baik bila kita hanya memberikan email spam saja.

7.2.1. Instalasi

Instalasi spamassassin cukup mudah, hanya dengan menggunakan apt-get.

root# apt-get install spamassassin
Reading Package Lists... Done
Building Dependency Tree... Done
The following extra packages will be installed:
  libdigest-sha1-perl libhtml-parser-perl libhtml-tagset-perl spamc
Suggested packages:
  libnet-smtp-perl libmail-spf-query-perl razor libnet-ident-perl libio-socket-ssl-perl
  dcc-client pyzor
Recommended packages:
  libnet-dns-perl
The following NEW packages will be installed:
  libdigest-sha1-perl libhtml-parser-perl libhtml-tagset-perl spamassassin spamc
0 upgraded, 5 newly installed, 0 to remove and 2 not upgraded.
Need to get 971kB of archives.
After unpacking 3043kB of additional disk space will be used.
Do you want to continue? [Y/n]   

Pilih "Y" dan tunggu hingga instalasi selesai.

7.2.2. Konfigurasi

Daemon spamassassin tidak dapat langsung berjalan. Kita harus mengubah file /etc/default/spamassassin agar daemon ini dapat digunakan.

Ubahlah:

ENABLED=0

Menjadi:

ENABLED=1

Setelah itu cobalah menjalankan daemon spamassassin.

root# /etc/init.d/spamassassin start
Starting SpamAssassin Mail Filter Daemon: spamd.

7.3. Sender Policy Framework (SPF)

7.3.1. Pendahuluan

Kita semua pasti mengetahui bahwa bila ada email yang masuk ke kita, maka pasti email itu dikirimkan melalui salah satu server SMTP di muka bumi ini. Yang kemudian menjadi permasalahan adalah: "Apakah server yang mengirimkan email itu memang berhak mengirimkan email atas nama domain yang dipakai?".

Contoh kasus: Saya menggunakan domain sokam.or.id, dan alamat server SMTP saya katakanlah 10.11.12.13. Seharusnya, yang mengirimkan email dengan menggunakan dokam sokam.or.id hanyalah alamat IP tersebut. Kemudian bagaimana kalau ada yang mengirim menggunakan domain sokam.or.id namun berasal dari IP 192.168.5.3? Apakah IP itu juga berhak?

Di sinilah peran SPF hadir untuk membantu kita menentukannya.

7.3.2. Mekanisme

Informasi SPF disimpan dalam DNS dengan menggunakan record TXT untuk domain yang bersangkutan. Contoh kasus: Saya ingin menambahkan record SPF untuk domain sokam.or.id. SMTP server yang berhak mengirim email dengan alamat sokam.or.id adalah server MX itu sendiri (10.11.12.13), serta sebuah server lagi dengan alamat IP 5.6.7.8. Bentuk record DNS ini kira-kira seperti ini:

sokam.or.id. IN TXT "v=spf1 mx ip4:5.6.7.8 -all"

Dengan setup seperti di atas, bila server SMTP yang beralamat 2.3.4.5 mengirimkan email dengan domain sokam.or.id, maka email tersebut dianggap sebagai SPAM. Bagaimana dengan domain yang tidak mempublish record SPF? segala SMTP server yang mengirim email menggunakan domain tersebut dianggap valid.

Silakan membaca selengkapnya mengenai SPF ini di http://spf.pobox.com.

7.3.3. Instalasi

Librari yang digunakan untuk query SPF record ini adalah librari perl yang juga sudah disediakan oleh debian.

root# apt-get install libmail-spf-query-perl
Reading Package Lists... Done
Building Dependency Tree... Done
The following extra packages will be installed:
  libnet-cidr-lite-perl libnet-dns-perl liburi-perl
Suggested packages:
  libsys-hostname-long-perl libwww-perl
The following NEW packages will be installed:
  libmail-spf-query-perl libnet-cidr-lite-perl libnet-dns-perl liburi-perl
0 upgraded, 4 newly installed, 0 to remove and 32 not upgraded.
Need to get 355kB of archives.
After unpacking 1360kB of additional disk space will be used.
Do you want to continue? [Y/n]  

Tunggulah hingga proses instalasi selesai.

Script yang digunakan oleh postfix harus kita download sendiri.

root# wget http://spf.pobox.com/postfix-policyd.txt -O /usr/local/sbin/postfix-policyd.pl
--15:35:54--  http://spf.pobox.com/postfix-policyd.txt
           => `/usr/local/sbin/postfix-policyd.pl'
Resolving spf.pobox.com... 67.52.51.36
Connecting to spf.pobox.com|67.52.51.36|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 7,673 (7.5K) [text/plain]

100%[====================================================>] 7,673         10.10K/s

15:35:58 (10.08 KB/s) - `/usr/local/sbin/postfix-policyd.pl' saved [7673/7673]

root# chmod 755 /usr/local/sbin/postfix-policyd.pl

7.3.4. Konfigurasi

Sebelum melakukan konfigurasi, ada bagian yang harus kita hilangkan dari file postfix-policyd.pl yang baru saja kita download. Buka tersebut itu dengan sembarang editor teks.

 1.  <%attr>
 2.  autohandler_skip => 1
 3.  </%attr>
 4.
 5.  #!/usr/bin/perl
 6.
 7.  # mengwong@pobox.com
 8.  # Wed Dec 10 03:52:04 EST 2003
 9.  ...
10.  ...

Hapus 4 baris pertama hingga menjadi seperti potongan script di bawah ini.

 1.   #!/usr/bin/perl
 2.
 3.   # mengwong@pobox.com
 4.   # Wed Dec 10 03:52:04 EST 2003
 5.   # postfix-policyd-spf
 6.   # version 1.06
 7.   # see http://spf.pobox.com/
 8.
 9.   ...
10.   ...

Setelah itu barulah kita bisa mulai mengkonfigurasi SPF.

Konfigurasi SPF ini dilakukan pada file konfigurasi postfix, yakni master.cf dan main.cf.

7.3.4.1. master.cf

Tambahkan baris di bawah ini.

policy  unix  -       n       n       -       -       spawn
    user=nobody argv=/usr/bin/perl /usr/local/sbin/postfix-policyd.pl
7.3.4.2. main.cf

Tambahkan check_policy_service unix:private/policy pada bagian smtpd_recipient_restrictions, sehingga lengkapnya seperti potongan di bawah ini.

smtpd_recipient_restrictions =
        permit_mynetworks,
        permit_sasl_authenticated,
        reject_non_fqdn_hostname,
        reject_non_fqdn_sender,
        reject_non_fqdn_recipient,
        reject_unauth_destination,
        reject_unauth_pipelining,
        reject_invalid_hostname, 
        check_policy_service unix:private/policy

Perhatikan bagian konfigurasi yang dicetak tebal.

Restartlah postfix. Kemudian cobalah mengirim email dan amati jalannya melalui file /var/log/mail.log

postfix/policy-spf[13006]: Attribute: ccert_fingerprint=
postfix/policy-spf[13006]: Attribute: ccert_issuer=
postfix/policy-spf[13006]: Attribute: ccert_subject=
postfix/policy-spf[13006]: Attribute: client_address=202.155.84.182
postfix/policy-spf[13006]: Attribute: client_name=unknown
postfix/policy-spf[13006]: Attribute: helo_name=badak.its-sby.edu
postfix/policy-spf[13006]: Attribute: instance=32c7.43527e15.0
postfix/policy-spf[13006]: Attribute: protocol_name=ESMTP
postfix/policy-spf[13006]: Attribute: protocol_state=RCPT
postfix/policy-spf[13006]: Attribute: queue_id=
postfix/policy-spf[13006]: Attribute: recipient=kamas@sokam.or.id
postfix/policy-spf[13006]: Attribute: request=smtpd_access_policy
postfix/policy-spf[13006]: Attribute: sasl_method=
postfix/policy-spf[13006]: Attribute: sasl_sender=
postfix/policy-spf[13006]: Attribute: sasl_username=
postfix/policy-spf[13006]: Attribute: sender=kamas@inf.its-sby.edu
postfix/policy-spf[13006]: Attribute: size=1230
postfix/policy-spf[13006]: : testing: stripped sender=kamas@inf.its-sby.edu,
stripped rcpt=kamas@sokam.or.id
postfix/policy-spf[13006]: handler testing: DUNNO
postfix/policy-spf[13006]: : SPF none: smtp_comment=SPF: domain of sender kamas@i
nf.its-sby.edu does not designate mailers, header_comment=aphrodite: domain of ka
mas@inf.its-sby.edu does not designate permitted sender hosts
postfix/policy-spf[13006]: handler sender_permitted_from: DUNNO
postfix/policy-spf[13006]: decided action=DUNNO

Bila pada file log terdapat entri semacam itu, berarti implementasi SPF anda sudah berjalan lancar.

7.4. Amavisd-new

Amavisd-New adalah content filter yang ditulis menggunakan perl (Net::Server) dan berjalan secara daemonized sehingga memungkinkan penanganan lalu lintas email besar tanpa harus banyak memakan resource komputer yang tersedia. Selain itu, amavisd-new dapat menerima email yang akan diperiksa melalui SMTP sehingga dapat dipadukan dengan mudah dengan hampir semua MTA yang ada.

Dalam memeriksa email, amavisd-new menyimpan hash tiap email yang masuk. Bila hash email yang masuk belum tersimpan maka amavis akan memeriksa email tersebut secara utuh. Bila hashnya sudah ditemukan maka email tersebut tidak akan diperiksa, dan keputusan terima/tolaknya diambil sesuai dengan hasil hash yang sudah ada. Bila sebelumnya email dengan jenis hash itu didrop, maka email baru ini akan didrop, dan sebaliknya.

Amavisd-New memerlukan beberapa modul perl yaitu:

  1. Archive::Tar

  2. Archive::Zip

  3. Compress::Zlib

  4. Convert::TNEF

  5. Convert::UUlib

  6. MIME::Base64

  7. MIME::Parser

  8. Mail::Internet

  9. Net::Server

  10. Net::SMTP

  11. Digest::MD5

  12. IO::Stringy

  13. Time::HiRes

  14. Unix::Syslog

Pada instalasinya, apt-get akan ikut menginstall apa yang diperlukan bila memang modul-modul itu belum terinstall.

Selain itu amavisd-new juga dapat menggunakan beberapa program kompresi, bila ditemukan. Program-program kompresi seperti unarj, unzip, unrar, dan sejenisnya digunakan untuk memeriksa virus yang dibawa oleh attachment yang dikompres.

7.4.1. Instalasi

Seperti halnya clamav, instalasi amavisd-new juga hanya menggunakan apt-get. Selain itu, kita juga sekalian menginstall beberapa program kompresi untuk mengoptimalkan kerja amavisd-new.

root# apt-get install amavisd-new unzip unrar zoo
Reading Package Lists... Done
Building Dependency Tree... Done
The following extra packages will be installed:
  libarchive-tar-perl libarchive-zip-perl libcompress-zlib-perl libconvert-binhex-perl
  libconvert-tnef-perl libconvert-uulib-perl libio-multiplex-perl libio-stringy-perl
  libio-zlib-perl libmailtools-perl libmime-perl libnet-perl libnet-server-perl
  libtimedate-perl libunix-syslog-perl
Suggested packages:
  lha arj nomarch lzop apt-listchanges libio-string-perl libmail-audit-perl
  libio-socket-ssl-perl zip
Recommended packages:
  libnet-ph-perl libnet-snpp-perl libnet-telnet-perl
The following NEW packages will be installed:
  amavisd-new libarchive-tar-perl libarchive-zip-perl libcompress-zlib-perl
  libconvert-binhex-perl libconvert-tnef-perl libconvert-uulib-perl libio-multiplex-perl
  libio-stringy-perl libio-zlib-perl libmailtools-perl libmime-perl libnet-perl
  libnet-server-perl libtimedate-perl libunix-syslog-perl unrar unzip zoo
0 upgraded, 19 newly installed, 0 to remove and 2 not upgraded.
Need to get 1827kB of archives.
After unpacking 5661kB of additional disk space will be used.
Do you want to continue? [Y/n] 

Ketik "Y", dan tunggulah hingga instalasi selesai.

7.4.2. Konfigurasi Amavisd-new

File konfigurasi amavisd-new terdapat pada /etc/amavis/amavisd.conf. File ini sangat panjang, dan terdapat dokumentasi yang sangat mendetail di setiap bagian yang bisa dikonfigurasi.

Aturan konfigurasi yang digunakan oleh amavisd-new sama dengan aturan penulisan variabel pada perl.

7.4.2.1. $mydomain

Variabel ini tidak begitu terpakai. Isi saja dengan FQDN server anda.

$mydomain = "mailku.sokam.or.id";
7.4.2.2. $forward_method & $notify_method

Kedua variabel ini digunakan untuk memforward email yang telah diperiksa oleh amavis kembali ke MTA untuk dirimkan ke maildir user. Isi variabel ini berformat "method:address:port";

$forward_method = "smtp:127.0.0.1:10025";
$notify_method = $forward_method;
7.4.2.3. $max_servers

Variabel ini digunakan untuk mengatur jumlah server yang dijalankan saat amavisd-new dijalankan. Besarnya harus sama dengan jumlah yang diizinkan pada konfigurasi postfix pada file master.cf. Pengaturan pada postfix akan diterangkan pada bagian selanjutnya. Nilai default variabel ini adalah 2 sehingga dalam satu waktu amavis dapat menerima dua email untuk diperiksa secara simultan. Bila angka ini dirasa kurang, anda dapat menaikkannya namun jangan sampai terlalu besar karena dapat menghabiskan sumber daya server anda.

$max_servers = 2;
7.4.2.4. $max_request

Saat amavis menerima email, maka daemon amavis akan membuat sebuah proses anak (child) untuk menangani pemeriksaan email. Jumlah yang disebutkan di sini menentukan jumlah maksimum sebuah child dapat memeriksa email. Bila nilainya diisi 10, maka setelah sepuluh kali pemeriksaan, child ini akan dimatikan dan daemon akan membuat child yang baru.

$max_request = 10;
7.4.2.5. $child_timeout

Variabel ini menentukan jangka waktu maksimal yang dapat digunakan oleh child untuk memeriksa sebuah email. Bila hingga batas waktu yang ditentukan pemeriksaan belum selesai, maka email yang diperiksa dianggap bersih. Satuan waktu yang digunakan adalah detik.

$child_timeout = 5*60; # = 5 menit = 300 detik
7.4.2.6. @bypass_spam_checks_acl

Konfigurasi ini digunakan untuk menDISABLEkan pemeriksaan spam. Bila anda ingin memeriksa spam (via spamassassin) maka variabel ini harus ditutup.

# @bypass_spam_checks_acl
7.4.2.7. @local_domains_acl

Variabel ini digunakan untuk menentukan domain mana saja yang dianggap sebagai "local domain". Pembedaan local domain dan non-local domain digunakan untuk menentukan apakah email yang diperiksa merupakan email yang dikirim oleh postfix ataukah yang diterima. Pembedaan ini digunakan dalam penulisan header spam pada email, dan sebagainya.

Nilai default variabel ini adalah .$mydomain yang berarti adalah FQDN mailserver anda. Masukkan daftar domain yang ditangani oleh mailserver anda ke variabel ini.

$local_domains_acl = qw( sokam.or.id dev.sokam.or.id list.sokam.or.id .public.sokam.or.id );

Dengan konfigurasi seperti di atas maka domain sokam.or.id, dev.sokam.or.id, list.sokam.or.id, dan *.public.sokam.or.id akan diperlakukan sebagai local domain.

7.4.2.8. $relayhost_is_client

Bila nilai variabel ini diisi "1", maka IP address yang disebutkan pada $forward_method dan $notify_method digantikan oleh client yang terkoneksi dengan daemon amavis. Konfigurasi ini memungkinkan sebuah daemon amavis untuk digunakan bersama-sama oleh beberapa mailserver secara simultan.

$relayhost_is_client = 0;
7.4.2.9. $insert_received_line

Variabel ini menentukan apakah amavis bekerja sebagaimana MTA pada umumnya yakni menambahkan header "Received:" pada setiap email yang diperiksa.

$insert_received_line = 0;
7.4.2.10. $unix_socketname

Default setting untuk variabel ini adalah undef. Parameter ini menyebutkan nama dan lokasi Unix Socket untuk berkomunikasi dengan MTA. Karena kita menggunakan postfix, maka biarkan variabel ini berisi undef karena postfix mengirimkan email untuk diperiksa melalui TCP Socket.

$unix_socketname = undef;
7.4.2.11. $inet_socket_port

Variabel ini menentukan TCP port berapa yang digunakan untuk menerima email yang dikirimkan oleh MTA. Defaultnya adalah 10024

$inet_socket_port = 10024;
7.4.2.12. $inet_socket_bind

Variabel ini menentukan interface yang digunakan untuk menerima email untuk diperiksa. Defaultnya adalah 127.0.0.1, sehingga amavis hanya dapat menerima email dari localhost, dan tidak dari host yang lainnya. Bila anda ingin amavis dapat menerima dari segala macam interface, maka isikan undef sebagai nilainya.

$inet_socket_bind = "127.0.0.1";
7.4.2.13. @inet_acl

Array ini merupakan daftar IP address yang diizinkan untuk mengirimkan email ke amavis untuk diperiksa. Bila anda ingin lebih dari satu server yang dapat memanfaatkan instalasi amavis ini, masukkan alamat IPnya ke dalam array ini. Selain itu, jangan lupa untuk mengisikan undef pada $inet_socket_bind.

@inet_acl = qw( 127.0.0.1 );

Setting di atas hanya mengizinkan localhost untuk mengirim email ke amavis.

$inet_socket_bind = undef;
@inet_acl = qw( 127.0.0.1 10.11.12.13 );

Setting di atas mengizinkan localhost dan server dengan IP 10.11.12.13 untuk berkomunikasi dengan amavis.

7.4.2.14. $virus_admin

Nilai default untuk variabel ini adalah postmaster\@$mydomain. Pada setup ini, konfigurasi ini berarti mengirimkan pembertahuan mengenai ditemukannya virus pada postmaster@mailku.sokam.or.id. Bila anda tidak ingin mendapatkan pemberitahuan tentang ditemukannya virus pada suatu email, isilah varibel ini dengan undef.

$virus_admin = undef;
7.4.2.15. $sa_tag_level_deflt

Merupakan variabel yang menentukan angka batas minimal amavis untuk menambahkan header informasi spam pada email yang diperiksa.

7.4.2.16. $sa_tag2_level_deflt

Merupakan variabel yang menentukan angka batas minimal amavis untuk menambahkan header bahwa email ini adalah spam.

7.4.2.17. $sa_kill_level_deflt

Merupakan variabel yang menentukan pada skor berapakah email akan didrop dan kemudian dikarantina.

$sa_tag_level_deflt  = 1.0;
$sa_tag2_level_deflt = 2.5;
$sa_kill_level_deflt = 5;

Sebaiknya anda memeriksa jalannya amavis secara rutin untuk menentukan apakah angka yang anda pasang di sini sudah sesuai dengan keinginan. Teruslah menyesuaikan, karena seperti halnya virus, spam senantiasa berubah tanpa pola yang tetap.

Variabel yang disebutkan pada panduan ini adalah variabel yang perlu mendapatkan perhatian dengan porsi tinggi. Variabel yang lain sudah cukup baik untuk digunakan apa adanya. Bila memang anda tertarik dengan amavisd-new ini, bacalah setiap keterangan yang terdapat pada file konfigurasinya.

7.4.2.18. @av_scanners

Variabel ini merupakan variabel yang menentukan scanner virus apa saja yang akan kita gunakan. Carilah bagian 'Clam Antivirus-clamd'. Setelah itu ubahlah konfigurasi socket yang menunjuk ke:

/var/run/clamav/clamd.ctl

sehingga mengarah ke:

/var/run/clamav/clamd

Potongan selengkapnya dapat dilihat di bawah ini:

### http://www.clamav.net/
['Clam Antivirus-clamd',
  \&ask_daemon, ["CONTSCAN {}\n", "/var/run/clamav/clamd"],
  qr/\bOK$/, qr/\bFOUND$/,

Perhatikan bagian yang dicetak tebal pada potongan konfigurasi di atas.

7.4.3. Konfigurasi Postfix

Setelah selesai mengkonfigurasi amavisd-new, sekarang kita harus mengkonfigurasi postfix untuk menggunakan amavisd-new sebagai content-filter. Konfigurasi yang perlu dilakukan terdapat pada file main.cf dan master.cf.

7.4.3.1. main.cf

Tambahkan baris di bawah ini untuk menentukan ke mana postfix harus mengirimkan email yang akan diperiksa. Format yang digunakan adalah service:host:port.

content_filter = smtp-amavis:[127.0.0.1]:10024
7.4.3.2. master.cf

Tambahkan beberapa baris di bawah ini agar service "smtp-amavis" dapat digunakan oleh postfix.

smtp-amavis unix -      -     n   -     2  smtp
    -o smtp_data_done_timeout=1200
    -o smtp_send_xforward_command=yes
    -o disable_dns_lookups=yes

127.0.0.1:10025 inet n  -     n   -     -  smtpd
    -o content_filter=
    -o local_recipient_maps=
    -o relay_recipient_maps=
    -o smtpd_restriction_classes=
    -o smtpd_client_restrictions=
    -o smtpd_helo_restrictions=
    -o smtpd_sender_restrictions=
    -o smtpd_recipient_restrictions=permit_mynetworks,reject
    -o mynetworks=127.0.0.1
    -o strict_rfc821_envelopes=no
    -o smtpd_error_sleep_time=0
    -o smtpd_soft_error_limit=1001
    -o smtpd_hard_error_limit=1000

Pada baris pertama dapat anda lihat bahwa smtp-amavis dikonfigurasikan untuk dapat menerima dua email sekaligus dalam satu waktu. Angka yang terdapat di sini harus sama dengan angka yang terdapat pada variabel $max_servers yang terdapat pada konfigurasi amavisd-new.

Setelah itu jangan lupa untuk merestart postfix.

root# /etc/init.d/postfix restart
Stopping mail transport agent: Postfix.
Starting mail transport agent: Postfix.

7.4.4. Konfigurasi ClamAV

Pada bagian sebelumnya kita telah mengubah file konfigurasi clamav agar dapat dijalankan oleh user amavis. Sekarang kita harus mengubah kepemilikan direktori /var/run/clamav agar menjadi milik amavisd-new, dan merestart clamav daemon.

root# chown -R /var/run/clamav
root# /etc/init.d/clamav-daemon restart
Stopping ClamAV daemon: clamd.
Starting ClamAV daemon: clamd.

7.4.5. Menjalankan amavisd-new

Setelah semua konfigurasi selesai, anda dapat mencoba menjalankan amavisd-new dari command line dalam mode debug dan meneliti apakah amavisd-new sudah berjalan sesuai dengan yang anda inginkan.

root# amavisd-new debug
Oct 16 12:10:02 kunti amavisd-new[3808]: starting.  amavisd-new at kunti amavisd-new-20030616-p10, 
Unicode aware, LANG=en_US
Oct 16 12:10:03 kunti amavisd-new[3808]: Perl version               5.008007
Oct 16 12:10:03 kunti amavisd-new[3808]: Module Amavis::Conf        1.15
Oct 16 12:10:03 kunti amavisd-new[3808]: Module Archive::Tar        1.26
Oct 16 12:10:03 kunti amavisd-new[3808]: Module Archive::Zip        1.14
Oct 16 12:10:03 kunti amavisd-new[3808]: Module Compress::Zlib      1.34
Oct 16 12:10:03 kunti amavisd-new[3808]: Module Convert::TNEF       0.17
Oct 16 12:10:03 kunti amavisd-new[3808]: Module Convert::UUlib      1.051
Oct 16 12:10:03 kunti amavisd-new[3808]: Module DB_File             1.811
Oct 16 12:10:03 kunti amavisd-new[3808]: Module MIME::Entity        5.417
Oct 16 12:10:03 kunti amavisd-new[3808]: Module MIME::Parser        5.417
Oct 16 12:10:03 kunti amavisd-new[3808]: Module MIME::Tools         5.417
Oct 16 12:10:03 kunti amavisd-new[3808]: Module Mail::Header        1.62
Oct 16 12:10:03 kunti amavisd-new[3808]: Module Mail::Internet      1.62
Oct 16 12:10:03 kunti amavisd-new[3808]: Module Mail::SpamAssassin  3.000004
Oct 16 12:10:03 kunti amavisd-new[3808]: Module Net::Cmd            2.26
Oct 16 12:10:03 kunti amavisd-new[3808]: Module Net::SMTP           2.29
Oct 16 12:10:03 kunti amavisd-new[3808]: Module Net::Server         0.87
Oct 16 12:10:03 kunti amavisd-new[3808]: Module Time::HiRes         1.66
Oct 16 12:10:03 kunti amavisd-new[3808]: Module Unix::Syslog        0.100
Oct 16 12:10:03 kunti amavisd-new[3808]: Found myself: /usr/sbin/amavisd-new -c /etc/amavis/amavisd
.conf
Oct 16 12:10:03 kunti amavisd-new[3808]: Lookup::SQL code       NOT loaded
Oct 16 12:10:03 kunti amavisd-new[3808]: Lookup::LDAP code      NOT loaded
Oct 16 12:10:03 kunti amavisd-new[3808]: AMCL-in protocol code  NOT loaded
Oct 16 12:10:03 kunti amavisd-new[3808]: SMTP-in protocol code  loaded
Oct 16 12:10:03 kunti amavisd-new[3808]: ANTI-VIRUS code        loaded
Oct 16 12:10:03 kunti amavisd-new[3808]: ANTI-SPAM  code        loaded
...
...
...

Bila anda rasa semua sudah berjalan sesuai dengan keinginan anda tekan [Ctrl]+[c] untuk keluar, dan jalankan amavisd-new secara permanen.

root# /etc/init.d/amavis restart
Stopping amavisd: (not running).
Starting amavisd: amavisd-new.

7.4.6. Testing

Cobalah mengirimkan email ke salah satu mailbox user, dan kemudian amati /var/log/mail.log. Contohnya:

root# echo "kirim ke mailbox setelah install amavis" | mail -s testing kamas@sokam.or.id
root# tail /var/log/mail.log
Oct 16 12:27:19 kunti postfix/smtpd[4291]: connect from localhost.localdomain[127.0.0.1]
Oct 16 12:27:19 kunti postfix/smtpd[4291]: D3E46C907: client=localhost.localdomain[127.0.0.1]
Oct 16 12:27:19 kunti postfix/cleanup[4286]: D3E46C907: message-id=<20051016052719.9C2CFC900@mailku.so
kam.or.id>
Oct 16 12:27:19 kunti postfix/qmgr[4184]: D3E46C907: from=<root@mailku.sokam.or.id>, size=800, nrcpt=1
 (queue active)
Oct 16 12:27:19 kunti postfix/smtpd[4291]: disconnect from localhost.localdomain[127.0.0.1]
Oct 16 12:27:19 kunti amavis[4241]: (04241-01) Passed, <root@mailku.sokam.or.id> -> <kamas@sokam.or.id
>, Message-ID: <20051016052719.9C2CFC900@mailku.sokam.or.id>, Hits: -2.4
Oct 16 12:27:19 kunti postfix/smtp[4288]: 9C2CFC900: to=<kamas@sokam.or.id>, relay=127.0.0.1[127.0.0.1]
, delay=0, status=sent (250 2.6.0 Ok, id=04241-01, from MTA: 250 Ok: queued as D3E46C907)
Oct 16 12:27:19 kunti postfix/qmgr[4184]: 9C2CFC900: removed
Oct 16 12:27:19 kunti postfix/virtual[4296]: D3E46C907: to=<kamas@sokam.or.id>, relay=virtual, delay=0,
 status=sent (delivered to maildir)
Oct 16 12:27:19 kunti postfix/qmgr[4184]: D3E46C907 : removed

Bagian yang dicetak tebal merupakan aktifitas amavisd-new. Sekarang cobalah untuk melihat file email yang telah tersimpan.

root# cd /var/mailbox/sokam.or.id/k/kamas/new/
root# ls
1129440439.V343Ic900M946672.mailku.sokam.or.id
root# cat 1129440439.V343Ic900M946672.mailku.sokam.or.id
Return-Path: <root@mailku.sokam.or.id>
X-Original-To: kamas@sokam.or.id
Delivered-To: kamas@sokam.or.id
Received: from localhost (localhost.localdomain [127.0.0.1])
        by mailku.sokam.or.id (Postfix) with ESMTP id D3E46C907
        for <kamas@sokam.or.id>; Sun, 16 Oct 2005 12:27:19 +0700 (WIT)
Received: from mailku.sokam.or.id ([127.0.0.1])
        by localhost (kunti [127.0.0.1]) (amavisd-new, port 10024) with ESMTP
        id 04241-01 for <kamas@sokam.or.id>;
        Sun, 16 Oct 2005 12:27:19 +0700 (WIT)
Received: by mailku.sokam.or.id (Postfix, from userid 0)
        id 9C2CFC900; Sun, 16 Oct 2005 12:27:19 +0700 (WIT)
To: kamas@sokam.or.id
Subject: testing
Message-Id: <20051016052719.9C2CFC900@mailku.sokam.or.id>
Date: Sun, 16 Oct 2005 12:27:19 +0700 (WIT)
From: root@mailku.sokam.or.id (root)
X-Virus-Scanned: by amavisd-new-20030616-p10 (Debian) at mailku.sokam.or.id

kirim ke mailbox setelah install amavis

Demikianlah sedikit tuntunan untuk melakukan instalasi postfix beserta beberapa komponen pendukungnya pada sebuah komputer. Bagian setelah ini akan menjelaskan tentang mendistribusikan sistem ke beberapa server berjalan secara bersamaan dalam mengelola daftar domain yang kita tangani.

8. Distributed System

Email merupakan salah satu komponen terbesar yang mendominasi lalu-lintas data di internet, setelah aktifitas web. Walau demikian, sejak awal ditemukannya email hingga saat ini, cara kerjanya tetap seperti dulu. Email merupakan salah satu aktifitas liar, tanpa pengendali dan pengarah. Oleh karena itulah banyak sekali tambahan seperti fasilitas antivirus, RBL, dan sebagainya.

Penggunaan antivirus pada server kadangkala membutuhkan biaya (secara sumber daya) yang cukup besar. Semakin besar jumlah email yang diterima, maka makin besar pula sumber daya komputer yang digunakan untuk memeriksa virus sebelum dikirim ke mailbox pengguna. Hal ini bisa menjadi lebih besar lagi bila kita menerapkan kebijakan content-filter yang memeriksa adanya pola-pola spam. Bayangkan bila pada suatu waktu terdapat 20.000 email dalam queue yang harus dikirim ke mailbox user, dan hampir semuanya mengandung attachment bervirus. Server harus memeriksa email itu satu demi satu hingga antrian terakhir. Itu berarti bila kita menunggu sebuah email dan email itu datang terakhir, kita harus menunggu lama walau pun email yang kita tunggu berukuran kecil.

Permasalahan umum lainnya adalah bila terjadi kerusakan pada server. Para pengguna email tidak dapat membaca email lagi, setidaknya hingga mailserver tersebut diperbaiki oleh administrator.

Beberapa permasalahan itulah yang akan dipecahkan oleh sistem terdistribusi ini. Dengan adanya lebih dari sebuah server yang menangani email, maka 20.000 email dalam antrian itu bisa dipecah untuk ditangani server-server dalam cluster kita. Bila kita punya 4 server, maka masing-masing server cukup memeriksa ~5000 email. Bila toh salah satu server yang kita punya terpaksa "rusak", server lain masih dapat menangani email yang masuk/keluar dan layanan ke user tidak akan berhenti.

Bila kita tarik garis besar manfaat sistem terdistribusi ini, manfaat yang paling terasa adalah menghilangkan single point of failure, high availibility, dan distribusi sumber daya sesuai daya komputer yang ada. Harapan kita akan adanya sistem ini adalah menekan berhenti totalnya layanan email hingga 0%.

Sebagai ilustrasi, beginilah nantinya skema sistem yang akan kita gunakan.

                           /----------------------\
                         /                          \
                        |                            |
                        |      I N T E R N E T       |
                        |                            |
                         \                          /
                           \----------------------/
                                       |
                                       |
                                       |
                +--------------------------------------------+
                | +----------+ +----------+     +----------+ |
                | |  Mail 1  | |  Mail 2  | === |  Mail N  | |
                | +-----+----+ +------+---+     +----+-----+ |
                |       |             |              |       |
                |       +-------------+--------------+       |
                |                     |                      |
                |                     |                      |
                |                     |                      |
                |   +-------------+   |   +-------------+    |
                |   | File Server |---+---|  DB Server  |    |
                |   +-------------+       +-------------+    |
                |                                            |
                |   Distributed System (mailku.sokam.or.id)  |
                +--------------------------------------------+

Bisa kita lihat pada gambar di atas bahwa kita mempunyai beberapa server email yang bekerja bersamaan dan sebuah file server yang menampung data email tiap pengguna. Jumlah mail server dapat ditambah atau dikurangi kapan saja tanpa harus menghentikan sistem.

8.1. Instalasi Mail & Database Server

Sebelum melangkah lebih jauh, siapkan terlebih dahulu beberapa email server yang nantinya akan kita gabungkan ke dalam sistem kita. Proses instalasinya persis sama dengan bagian sebelumnya, hanya saja file-file hasil kompilasi (dpkg-buildpackage) dapat kita gunakan dalam instalasi server lainnya. Oleh karena itu kita tidak perlu mendownload beberapa file seperti sebelumnya. Kita cukup menjalankan dpkg -i [file.deb] untuk menyelesaikan instalasi server berikutnya.

Konfigurasi pada gambar di atas memang sedikit berbeda dengan apa yang mungkin anda bayangkan, terutama pada bagian database server dan file server.

Sebelumnya kita telah melakukan instalasi MySQL, dan kemudian komponen postfix yang menggunakan MySQL menggunakan alamat "127.0.0.1" sebagai alamat server database. Anda boleh tetap menggunakan konfigurasi ini, atau memindahkan ke sebuah server tersendiri. Saya menyarankan untuk memindahkan ke sebuah server sendiri untuk kemudahan administrasi di kemudian hari.

Proses instalasi MySQL sama persis dengan cara yang diterangkan di atas, hanya saja ada sebuah file konfigurasi yaitu /etc/mysql/my.cnf yang harus sedikit kita ubah.

bind-address           = 127.0.0.1

Hapuslah baris di atas agar server database kita bisa diakses melalui jaringan. Selain menghapus, anda dapat me-non-aktifkan pilihan itu dengan cara memberi tanda pagar (#) di depan barisnya sehingga konfigurasi itu dianggap tidak ada. Jangan lupa untuk merestart server database sebelum mencoba untuk menggunakannya dari server lain.

Setelah itu installah postfix dengan menggunakan paket-paket .deb yang sebelumnya kita punya, dan lakukan konfigurasi seperti pada bagian sebelumnya. Ubahlah konfigurasi IP untuk server database dari 127.0.0.1 menjadi alamat IP server yang anda gunakan sebagai server database.

Contoh:

user = postfix 
password = postfix 
hosts = 10.1.1.5 # sesuaikan alamat ini dengan IP server database anda
dbname = postfix 
query = SELECT maildir FROM mailbox WHERE username='%s' AND active = 1

Konfigurasi program-program courier yang harus menyesuaikan adalah file authmysqlrc. Konfigurasi yang harus diubah adalah MYSQL_SERVER. Sesuaikan isinya dengan alamat IP server database yang anda gunakan.

MYSQL_SERVER 10.1.1.5

8.2. NFS

NFS (Network File System) merupakan salah satu jenis shared file system yang paling tua. Sistem NFS awalnya dikembangkan oleh Sun Microsystem yang digunakan untuk berbagi file dalam UNIX. NFS mudah untuk digunakan, dan performanya cukup baik untuk digunakan dalam lingkungan terdistribusi.

Server NFS adalah sebuah server tersendiri yang menampung semua data email. Pada server ini tidak ada MTA, dan server ini berperan khusus sebagai File Server. Client yang menggunakan layanan server ini adalah seluruh mail server kita.

8.2.1. Instalasi

Instalasi server NFS dapat kita lakukan seperti biasa, dengan menggunakan apt-get.

root# apt-get install nfs-kernel-server
Reading package lists... Done
Building dependency tree... Done
The following extra packages will be installed:
  nfs-common portmap
The following NEW packages will be installed:
  nfs-common nfs-kernel-server portmap
0 upgraded, 3 newly installed, 0 to remove and 0 not upgraded.
Need to get 241kB of archives.
After unpacking 778kB of additional disk space will be used.
Do you want to continue [Y/n]?

Pilih Y, dan tunggulah proses instalasi selesai.

8.2.2. Konfigurasi Server

Ingatlah bahwa anda harus menyediakan kapasistas harddisk yang cukup besar untuk menampung data-data email milik para pengguna. Semakin banyak pengguna yang menggunakan sistem anda, maka semakin besar pula kapasistas penyimpanan yang harus anda sediakan. Misalkan bila anda menyimpan file-file email pada direktori /home/mailbox, direktori ini harus kita share agar bisa digunakan oleh seluruh mail server kita.

Untuk itu kita harus mengkonfigurasi sebuah file yaitu /etc/exports.

/home/mailbox 10.1.1.0/24(rw,no_root_squash,async)

Hal yang sama juga berlaku pada file konfigurasi beberapa paket yang telah kita install. Ingat, skenario ini menuntut kita untuk memiliki konfigurasi yang identik antara satu mail server dengan yang lain. Untuk memudahkan pengubahan file konfigurasi, kita dapat mengumpulkan semua file tersebut pada server NFS, dan kemudian dimount ke sebuah direktori, dan direktori konfigurasi asli yang terdapat pada direktori /etc masing-masing mail server kita ganti dengan symbolic link yang menuju direktori tersebut.

Pada contoh ini, file konfigurasi berada pada direktori /home/konfigmail yang kemudian oleh seluruh mailserver dimount pada direktori /konfigmail. Lengkapilah file /etc/exports, masukkan direktori tempat file konfigurasi berada.

/home/mailbox 10.1.1.0/24(rw,no_root_squash,async) 
/home/konfigmail 10.1.1.0/24(rw,no_root_squash,async)

8.2.3. Konfigurasi Client

Konfigurasi pada sisi client tidak rumit. Yang harus kita lakukan adalah memount direktori tempat penyimpanan data email dan konfigurasi daemon kita. Alamat IP server NFS yang kita gunakan pada contoh ini adalah 10.1.1.4. Tambahkan kedua baris di bawah ini pada file /etc/fstab.

10.1.1.4:/home/mailbox /var/mailbox nfs wsize=8192,rsize=8192,auto
10.1.1.4:/home/konfigmail /konfigmail nfs wsize=8192,rsize=8192,auto

Langkah berikutnya adalah menghapus beberapa direktori konfigurasi yaitu /etc/postfix, /etc/courier, /etc/amavis, dan /etc/clamav. Kita akan mengganti keempat direktori tersebut dengan symbolic link yang menuju ke direktori yang berada pada /konfigmail.

root# rm -rf /etc/amavis /etc/clamav /etc/postfix /etc/courier
root# ln -s /konfigmail/amavis /etc/amavis
root# ln -s /konfigmail/clamav /etc/clamav
root# ln -s /konfigmail/postfix /etc/postfix
root# ln -s /konfigmail/courier /etc/courier

8.3. DNS Round Robin

Mengapa DNS Round Robin? Agar kita hanya perlu satu nama sebagai hostname (misal: mailku.sokam.or.id), tapi memiliki beberapa IP sehingga email yang masuk disebar ke semua mailserver yang telah kita bangun sebelumnya. Sederhananya, potongan entri DNS yang bisa kita pakai adalah:

sokam.or.id     IN      MX      1       mailku.sokam.or.id

mailku.sokam.or.id      IN      A       10.1.1.7
                        IN      A       10.1.1.8
                        IN      A       10.1.1.9

Dengan konfig DNS seperti di atas, maka email yang menuju ke domain sokam.or.id secara berurutan akan terkirim ke 10.1.1.7, kemudian 10.1.1.8, dan ke 10.1.1.9 hingga kembali lagi ke 10.1.1.7 dan seterusnya. Dengan demikian dapat kita simpulkan pula bahwa setiap ada penambahan/pengurangan mail server, entri DNS harus segera kita ubah untuk menghindari adanya email yang salah alamat.

Implementasi potongan konfigurasi di atas dapat bervariasi tergantung perangkat lunak yang anda gunakan sebagai DNS server.

9. Testing Keseluruhan

Silakan mencoba mengirim email, dan amati hasilnya pada mail.log. Selamat mencoba, semoga sukses!

10. Referensi

  1. http://workaround.org/articles/ispmail-sarge/

  2. http://www.marlow.dk/site.php/tech/postfix

  3. http://postfixwiki.org/index.php?title=Virtual_Users_and_Domains_with_Courier-IMAP_and_MySQL

  4. http://postfix.or.id

  5. Postfix Mailing List

  6. Google dan kawan-kawan