Postfix TLS dan SASL Dengan Menggunakan MySQL

postfixTutorial singkat ini menjelaskan bagaimana mengkonfigurasi Postfix 2.4.6 agar menggunakan Cyrus SASL dengan data username dan password yang diambil dari database MySQL dengan tambahan enkripsi TLS di Centos 4.4.

Pada umumnya untuk menggunakan sebuah SMTP server, maka yang kita lakukan adalah dengan mengisikan nama host yang sudah disediakan oleh ISP atau kita sendiri. Dengan catatan bahwa IP address tetap atau network yang kita gunakan sudah ‘didaftarkan’ di SMTP tersebut untuk bisa menggunakan sevicenya. Lalu bagaimana jika ada pengguna yang sifatnya mobile atau istilah bekennya Road Warrior, yang selalu gonta-ganti ISP yang selalu mendapatkan IP dinamis? Solusinya adalah denga menggunakan metode SMTPAuth. Yaitu suatu mekanisme dimana pengguna diminta untuk memasukkan username dan password agar bisa menggunakan service suatu SMTP server.

Install Cyrus SASL

Langkah pertama adalah menginstall Cyrus-SASL jika belum, jika Anda memilih Postfix pada waktu instalasi awal, maka biasanya Cyrus-SASL sudah otomatis diinstall, paket-paketnya adalah sebagai berikut:

  • cyrus-sasl-md5-2.1.19-14
  • cyrus-sasl-sql-2.1.19-14
  • cyrus-sasl-devel-2.1.19-14
  • cyrus-sasl-2.1.19-14
  • cyrus-sasl-plain-2.1.19-14

Silakan disesuaikan dengan distro Anda, yang penting adalah paket cyrus-sasl, cyrus-sasl-devel, cyrus-sasl -sql, cyrus-sasl-plain harus ada.

Edit file /usr/lib/sasl2/smtpd.conf, kemudian ganti dengan konfigurasi berikut ini :

pwcheck_method: auxprop
auxprop_plugin: sql
sql_engine: mysql
mech_list: sql plain login
sql_hostnames: localhost
sql_user: vpopmail
sql_passwd: mautauajah
sql_database: vpopmail
sql_statement: SELECT pw_clear_passwd FROM vpopmail WHERE pw_name = '%u' AND pw_domain = '%r'
sql_verbose: yes

Sesuaikan dengan konfigurasi MySQL ditempat Anda. Untuk parameter sql_statement tersebut adalah satu baris. Kemudian untuk statemen SQLnya saya ambil contoh dari tabel vpopmail dengan menggunakan backend MySQL, silakan dicocokkan dengan struktu tabel pada database yang Anda pakai dengan memanfaatkan magic string ‘%u’ yang akan diganti dengan local part (biasanya username) dan ‘%r’ atau realm yang biasanya diganti dengan nama domain.

Sebagai gambaran, struktur tabel vpopmail dengan menggunakan single tabel untuk multi domain adalah sebagai berikut ini:

mysql> describe vpopmail;
+-----------------+-----------+------+-----+---------+-------+
| Field           | Type      | Null | Key | Default | Extra |
+-----------------+-----------+------+-----+---------+-------+
| pw_name         | char(32)  | NO   | PRI |         |       |
| pw_domain       | char(64)  | NO   | PRI |         |       |
| pw_passwd       | char(40)  | YES  |     | NULL    |       |
| pw_uid          | int(11)   | YES  |     | NULL    |       |
| pw_gid          | int(11)   | YES  |     | NULL    |       |
| pw_gecos        | char(48)  | YES  |     | NULL    |       |
| pw_dir          | char(160) | YES  |     | NULL    |       |
| pw_shell        | char(20)  | YES  |     | NULL    |       |
| pw_clear_passwd | char(16)  | YES  |     | NULL    |       |
+-----------------+-----------+------+-----+---------+-------+
9 rows in set (0.00 sec)

Anda bisa menyesuaikan dengan field username, password dan domain jika Anda menggunakan struktur tabel yang berbeda.

Install Postfix dengan TLS dan SASL support

Anda bisa menggunakan paket RPM yang sudah support TLS dan SASL atau bisa mengkompilasi sendiri. Untuk kompilasi sendiri kira-kira begini langkah-langkahnya:

Hapus Postfix yang sudah terinstall, sebelumnya ada baiknya direktori /etc/postfix dibackup terlebih dahulu :

cp -r /etc/postfix /etc/postfix.bak
yum -y remove postfix (atau rpm -e --nodeps postfix)

Download dan install Postfix :

wget ftp://mirror.cbn.net.id/pub/postfix-release/official/postfix-2.4.6.tar.gz
tar xzvf postfix-2.4.6.tar.gz
cd postfix-2.4.6
make makefiles CCARGS="-DUSE_TLS -DUSE_SASL_AUTH -DUSE_CYRUS_SASL -I/usr/include/sasl" AUXLIBS="-L/usr/lib/sasl2 -lsasl2 -lssl -lcrypto"
make
make install (atau make upgrade jika upgrade)

Kemudian edit file /etc/postfix/main.cf sesuaikan dengan konfigurasi Anda sebelumnya, lalu jalankan perintah berikut ini untuk menjalankan Postfix :

postfix start

Semestinya akan muncul di syslog Anda (biasanya file /var/log/maillog atau /var/log/mail/info dlsb) kurang lebih seperti ini :

Dec 28 16:09:51 palestine postfix/postfix-script[13515]: starting the Postfix mail system
Dec 28 16:09:52 palestine postfix/master[13516]: daemon started — version 2.4.6, configuration /etc/postfix

Aktifkan SASL

Ok, kelihatannya berjalan sesuai dengan harapan. Sekarang edit file main.cf kemudian aktifkan SASL, dengan menambahkan :

broken_sasl_auth_clients = yes
smtpd_sasl_auth_enable = yes
smtpd_sasl_authenticated_header = yes
smtpd_sasl_exceptions_networks = $mynetworks
smtpd_recipient_restrictions =
permit_mynetworks
permit_sasl_authenticated
reject_unauth_destination

Kemudian silakan dicoba untuk menggunakan SMTP Auth ke server Anda. Ingat, untuk mencobanya harus dari IP address yang tidak terdaftar di parameter mynetworks. Anda bisa saja menggunakan network lain, atau menggunakan salah satu dari network yang ada sekarang namun memberikan pengecualian untuk satu IP. Caranya cukup mudah, yaitu cukup menambahkan negasi (exclamation mark/tanda seru) di konfigurasi di mynetworks. Misalnya untuk meng-exclude IP 10.126.10.112 dari network 10.126.10.0/24 adalah :

mynetworks = 127.0.0.0/8, !10.126.10.112/32, 10.126.10.0/24

Jika berhasil, kira-kira akan muncul log seperti ini :

Dec 28 16:39:36 palestine postfix/smtpd[22197]: 33E53E4010: client=unknown[10.126.10.112], sasl_method=PLAIN, sasl_username=asfik@domain.tld

Perhatikan pada kata yang dicetak tebal diatas, hal tersebut menujukkan bahwa user asfik@domain.tld sukses melakukan authentikasi dengan metode PLAIN (yang akan kita amankan sebentar lagi).

Kalau kita periksa header di email yang kita terima, maka akan terdapat beberapa tambahan :

Return-Path: <asfik@domain.tld>
Delivered-To: asfik@domain.tld
Received: from [10.126.10.112]
(Authenticated sender: asfik@domain.tld)
by palestine.domain.tld (Postfix) with ESMTP id 33E53E4010
for <asfik@domain.tld>; Fri, 28 Dec 2007 16:39:36 +0700 (WIT)
Message-ID: <4774BE3B.7050308@domain.tld>
Date: Fri, 28 Dec 2007 16:13:31 +0700
From: Asfihani <asfik@domain.tld>
User-Agent: Thunderbird 2.0.0.6 (X11/20071022)
MIME-Version: 1.0
To: Asfihani <asfik@domain.tld>
Subject: test
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit

test

Kata yang dicetak tebal tersebut dihasilkan dari hasil authentikasi, jika Anda ingin menonaktifkan fitur ini, ubah di main.cf menjadi :

smtpd_sasl_authenticated_header = no

Aktifkan TLS

Langkah berikutnya adalah mengamankan transaksi yang dikirim ke SMTP server dengan menambahkan satu layer security yaitu TLS. Karena username dan password sangat rentan dibajak ditengah jalan, pada saat ini penggunaan TLS untuk SMTP Auth (SASL) merupakan suatu kewajiban bukan kebutuhan :-)

Anda bisa menggunakan sertifikat yang sudah ada (misalnya perusahaan anda), atau untuk percobaan bisa menggunakan self-signed certificate. Apa bedanya? Ya kalau menggunakan tipe yang terakhir akan muncul warning warning (yang nantinya bisa disave agar tidak muncul lagi) yang kurang asik saja :-).

Mari kita membuat sertifikat beserta private keynya, pastikan bahwa Common Name yang diisikan sesuai dengan hostname SMTP server dan passphrase yang dimasukkan selalu diingat:

mkdir -p /etc/postfix/ssl/
cd /etc/postfix/ssl/
openssl genrsa -des3 -rand /etc/hosts -out smtpd.key 1024
chmod 600 smtpd.key
openssl req -new -key smtpd.key -out smtpd.csr
openssl x509 -req -days 3650 -in smtpd.csr -signkey smtpd.key -out smtpd.crt
openssl rsa -in smtpd.key -out smtpd.key.unencrypted
mv -f smtpd.key.unencrypted smtpd.key
openssl req -new -x509 -extensions v3_ca -keyout cakey.pem -out cacert.pem -days 3650

Aktifkan TLS di Postfix dengan menambahkan konfigurasi berikut ini di file main.cf :

smtpd_tls_cert_file = /etc/postfix/ssl/smtpd.crt
smtpd_tls_key_file = /etc/postfix/ssl/smtpd.key
smtpd_tls_CAfile = /etc/postfix/ssl/cacert.pem
smtpd_use_tls = yes
smtpd_tls_received_header = yes
smtpd_tls_loglevel = 1
tls_random_source = dev:/dev/urandom
smtpd_tls_session_cache_timeout = 3600s

Test dengan menggunakan mail user agent favorit Anda, pastikan opsi TLS dipilih. Jika sukses, Anda akan melihat log seperti ini di Postfix :

Dec 31 09:25:25 palestine postfix/smtpd[11419]: TLS connection established from unknown[10.126.10.112]: TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)
Dec 31 09:25:25 palestine postfix/smtpd[11419]: 3624BE4010: client=unknown[10.126.10.112], sasl_method=PLAIN, sasl_username=asfik@domain.tld

Demikian tutorial ini dibuat semoga bermanfaat. Ada kekurangan/kesalahan adalah murni dari saya sendiri.

Leave a Reply

Your email address will not be published. Required fields are marked *