Lebih jauh tentang qmail

Dodi Maryanto
Dosen: Onno W. Purbo

I. Antara Qmail dan Sendmail
Sebuah sistem unix biasanya lansung dibundled oleh MTA (Mail Transfer Agent)  bernama sendmail. Dengan konfigurasi default yang diletakkan pada /etc/sendmail.cf biasanya mail sudah dapat keluar masuk. Setelah itu sysadmin tidak akan mengutak-utik hal yang berhubungan dengan sendmail. Jika ada kebutuhan tambahan yang berkaitan dengan service mail, maka sysadmin akan mencoba melihat sendmail.cf, apakah ada yang bisa diubah sedikit atau ditambahkan. Namun apa yang terjadi ?
Ternyata sendmail.cf adalah sebuah file text besar yang sebagian besar tidak dapat dibaca, penuh dengan kode-kode yang perlu dipelajari dulu sebelumnya. Untuk mengerti apa yang dikatakan sendmail.cf, sysadmin perlu membaca manual dan buku referensi ( sebagai contoh buku berjudul 'sendmail' buatan O'reilly ). Untuk semuanya perlu waktu yang tidak sedikit.

Sendmail juga dikenal sebagai MTA yang mempunyai banyak BUG. Sendmail versi awal mempunyai kode 46000 baris dan versi 8.6.12 mempunyai kode 41000 baris . Bug yang sudah ditemukan sampai saat ini sekitar 20. Mengingat banyaknya baris, maka memungkinkan untuk ditemukannya bugs lagi.

Lalu muncullah MTA bernama qmail yang dibuat seseorang yang tidak puas atas kinerja dan buggy sendmail. Qmail tidak merepotkan sewaktu instalasi. Dan juga mempunyai file konfigurasi yang sederhana yang terdiri dari beberapa file yang diletakkan pada direktori /var/qmail/control. Keunggulan utama qmail dibandingkan dengan sendmail adalah masalah security. Berikut ini adalah alasan bahwa qmail mempunyai security yang lebih baik :
1.	Tidak memperlakukan program dan files sebagai alamat
Sendmail melihat program dan files sebagai sebuah alamat. Kelemahan dari hal ini yaitu bila beberapa user tidak diizinkan untuk memakai program atau menulis file (tidak mempunyai hak) mengakibatkan sendmail terus menerus mencobanya. Berbeda dengan qmail yang memperlakukan program sebagai program dan file sebagai file. Qmail bisa disuruh untuk menjalankan program tapi atas nama user tersebut.
2.	Sesedikit mungkin mengunakan setuid dan login root
Sendmail ditulis sebagai setuid sehingga menyebabkan banyak exploit dan bug, sedangkan qmail mempunyai 1 program yang memakai setuid yaitu qmail-queue. Dan sendmail dijalankan dibawah user root, hal ini mengakibatkan proteksi sistem terhadap sesuatu kesalahan menjadi tidak berlaku karena root dapat melakukan semuanya. Hal ini bisa berakibat buruk. Qmail berjalan atas namanya sendiri yang terdiri dari 6 user. Sedangkan program qmail yang berjalan atas nama root adalah qmail-start dan qmail-lspawn.
3.	Memisahkan beberapa fungsi menjadi beberapa program independent. Seperti yang disebutkan pada nomor 2, qmail terdiri dari 6 user yang masing-masing user tersebut menjalankan program yang berbeda. Berbeda dengan sendmail yang hanya mempunyai 1 buah file eksekusi yaitu sendmail yang mencakup semua fungsi, qmail memisahkan masing-masing fungsi seperti untuk menangani antrian, menangani deliveri ke host remote, deliveri ke host lokal dan sebagainya , menjadi beberapa program independent. Dan masing-masing program ini berjalan dengan nama yang berbeda, seperti misalnya qmail-send oleh qmaill dan qmail-queue oleh qmailq.
4.	Simple dan kecil
Qmail dikatakan simple dan kecil karena hal berikut :
•	Qmail memisahkan mekanisasi untuk forwarding , aliasing dan mailing-list
•	Qmail hanya mempunyai 1 mode pengiriman, yaitu fast+queued (cepat dan dibuat antrian). Qmail-send , yaitu program untuk mengirimkan mail dipicu oleh adanya antrian baru. Sedangkan sendmail mempunyai beberapa mode, yaitu slow+queued dan fast+unsafe.
5.	tidak memparsing data
6.	source code yang bebas bugs

Qmail meletakkan mail yang datang ke dalam sebuah format maildir yang tidak akan crash sewaktu mail diantarkan , berbeda dengan format mbox yang mudah crash. 

II. Cara Kerja qmail
a. Overview
Secara grafis, inilah cara kerja qmail :

qmail-smtpd ---  qmail-queue --- qmail-send --- qmail-rspawn --- qmail-remote
                                          
qmail-inject                      qmail-clean    qmail-lspawn --- qmail-local

Setiap message akan masuk ke qmail-queue direktori yang dikerjakan oleh qmail-queue. Qmail-queue mempunyai direktori untuk mengerjakan antrian, yaitu /var/qmail/queue. Qmail-queue akan ada bila ada permintaan yang biasanya digenerate oleh qmail-inject untuk message lokal , qmail-smtpd untuk message yang diterima lewat SMTP, qmail-local untuk message yang diforward dan qmail-send untuk message yang bouncing.

Setiap message diantarkan ke tempat tujuan oleh qmail-send dan bekerja-sama dengan qmail-rspawn untuk message remote dan qmail-lspawn untuk message lokal. Qmail-clean juga ikut bekerja dalam proses deliver di atas. Ke empat program tadi adalah daemon yang terus-menerus idle dalam sistem yang memakai qmail.  Antrian didesain untuk bisa tahan crash dengan syarat file sistem yang dipakainya juga harus tahan crash. 

b. Struktur Queue 
Setiap message dalam antrian diberikan nomor identifikasi , misalnya 23. Antrian yang diatur qmail-queue dipecah lagi menjadi beberapa direktori, yang setiap direktori ada file yang berhubungan dengan message 23.

   mess/23	: message itu sendiri
   todo/23	: envelope: yang menyatakan dari mana message datang dan ke mana  
  akan diantarkan.
   intd/23	: envelope juga namun dalam proses pembuatan oleh qmail-queue 
   info/23	: envelope yang menerangkan alamat pengirim, setelah preprocessing
   local/23	: envelope lokal yang menerangkan alamat penerima, setelah 
  preprocessing
   remote/23	: envelope remote yang menerangkan alamat penerima, setelah 
  preprocessing
   bounce/23	: hasil antaran yang gagal

Berikut ini adalah level-level yang terjadi dalam sebuah message. Positif (+) berarti ada , negatif (-) tidak ada dan (?) berarti mungkin ada mungkin tidak. 

   S1. -mess -intd -todo -info -local -remote -bounce
   S2. +mess -intd -todo -info -local -remote -bounce
   S3. +mess +intd -todo -info -local -remote -bounce
   S4. +mess ?intd +todo ?info ?local ?remote -bounce (queued)
   S5. +mess -intd -todo +info ?local ?remote ?bounce (preprocessed)

c. Bagaimana messages memasuki antrian
Untuk memasukkan message ke dalam antrian , qmail-queue menciptakan file dalam direktori terpisah, yaitu pid/ dengan nama yang unik. Lalu file sistem memberikan nomor inode . Qmail-queue mencari nomor tersebut, misalnya 23. Pada level ini message 23 mencapai keadaan S1.

Lalu qmail-queue merubah nama pid/apa_saja menjadi mess/23 dan naik ke keadaan S2 dan menulis message ke mess/23. Lalu qmail-queue membuat intd/23 dan keadaan berubah ke S3 dan menulis informasi envelope ke intd/23 .
Pada tahap akhir, qmail-queue membuat link baru yaitu dari intd/23 ke todo/23  dan keadaan naik ke S4. Pada saat ini message sudah sukses memasuki antrian dan untuk selanjutnya qmail menyerahkan pekerjaan ke qmail-send.

d. Bagaimana message yang diantrikan diproses selanjutnya.
Setelah message sukses memasuki antrian, maka qmail-send harus memutuskan apakah penerma message ini berada di lokal atau remote . Ketika qmail-send memberitahu adalanya file todo/23, maka qmail-send telah mengetahui message 23 telah mencapai level S4. Lalu info/23, local/23 dan remote/23 akan dihapus bila ada. Lalu qmail-send akan membuat ulang info/23 dan mungkin local/23 dan remote/23. Setelah selesai qmail-send akan membuang todo/23 dan keadaan naik ke S5. Pada saat ini message telah selesai pada tahap preprocessed (tahap sebelum di proses).

e. Bagaimana message yang preprocessed diantarkan.
Message pada keadaan S5 diperlakukan dengan menandai setiap alamat di local/23 dan remote /23 sebagai DONE dan NOT DONE..
DONE	: message sukses diantarkan, atau antaran sebelumnya menemui 
  kegagalan  permanent . Atau dengan kata lain qmail-send tidak akan  
  memcoba lagi mengantarkan message ke alamat tersebut
NOT DONE	: message yang diantarkan belum sampai ke tujuan dengan kegagalan 
  yang temporary. Hal ini menyebabkan qmail-send terus mencoba untuk 
  beberapa saat.nanti.

Qmail-send akan mencoba mengantarkan message yang NOT DONE pada saat proses tidak terlalu banyak. Bila message telah diantarkan dengan sukses, qmail-send akan memberi tanda DONE. Sedangkan bila antaran menemui kegagalan permanen maka qmail-send akan mengirimkan catatan ke bounce/23 dan akan membuat file bounce/23 dan message akan diberi tanda DONE.

Qmail-send menangani message bounce setiap saat dengan cara membuat bounce message ke bounce/23 dan mess/23 dan meneruskan ke qmail-inject. Setelah selesai maka bounce/23 akan dihapus.

Ketika semua alamat di local/23 ditandai DONE, maka qmail-send akan menghapusnya, begitu pula untuk remote/23. Ketika local/23 dan remote/23 dihapus, maka qmail-send akan menghapus message dari antrian dengan cara menghapus bounce/23, info/23 dan secara berangsur-angsur keadaan untuk message 23 akan berubah ke S2 dan S1.

f. Pembersihan (clean-up)
Bila komputer crash sewaktu qmail-queue mencoa membuat antrian untuk sebuah message, maka message akan ditinggalkan dalam keadaan S2 atau S3. Lalu ketika sistem memulai lagi, qmail-send akan melihat sebuah message dalam keadaan S2 atau S3 yang lebih dari 36 jam, maka mess/23 akan dihapus. Sama halnya seperti qmail-send melihat file dalam pid/ yang lebih dari 36 jam , maka akan dihapus.  Pembersihan tidak perlu dilakukan apabila qmail-send sedang dalam tahap delivery. Kemungkinan terburuk message akan terkirimkan dua kali.

Sama halnya dengan bila komputer crash hanya beberapa saat sebelum qmail-send memberikan tanda DONE kepada sebuah message, maka pada tahap berkutnya setelah selesai dari crash, qmail-send akan mengatasi message yang NOT DONE. Padahal message sudah terkirim, hanya tandanya saja yang NOT DONE.