Postfix
Overview - Security
Up one level | Introduction
| Goals
and features | Global architecture
| Queue Management | Security
Introduction
Pada dasarnya, software email memproses informasi dari
sumber-sumber potensial yang tidak dipercaya. Maka dari itu,
software email harus ditulis dengan perhatian yang lebih, meskipun
ketika ia berjalan dengan hak (privilege) dari user biasa, dan meskipun
ia tidak berhubungan langsung dengan suatu network (jaringan).
Postfix merupakan sistem yang rumit. Rilis permulaan Postfix mempunyai
sekitar 30.000 baris kode (setelah penghapusan komentar). Dengan sistem
yang rumit tersebut, sistem keamanan tidak harus bergantung kepada
mekanisme tunggal. Jika iya, sebuah kesalahan sudah cukup untuk
mengambil alih keseluruhan sistem email. Maka dari itu, Postfix
menggunakan pertahanan multi layer untuk mengontrol kerusakan dari
software dan kesalahan yang lainnya.
Least privilege
Kebanyakan program daemon di Postfix dapat dijalankan dengan hak yang
rendah (low privilege) tetap pada suatu lingkungan yang dipenjara
(chrooted environment). Ini benar, terutama untuk program yang tidak
disembunyikan dari suatu network: server SMTP dan client SMTP. Meski
menggunakan chroot(2), dan digabungkan dengan hak rendah, tidak ada
jaminan terhadap pengambilan terhadap suatu sistem, tapi akan menambah
rintangan/hambatan. Dan seperti yang kita tahu, hal itu akan sedikit
membantu.
Insulation
Postfix menggunakan proses yang terpisah untuk menyekat berbagai
aktifitas tersebut. Dalam kondisi tertentu, tidak ada jalan langsung
dari network terhadap program deliveri lokal. Seorang penyusup pertama
kali harus mengacaukan berbagai program. Beberapa bagian dari sistem
Postfix adalah multi-threaded. Meskipun demikian, semua program yang
berinteraksi dengan dunia luar adalah single-threaded. Proses-proses
yang terpisah memberikan sistem penyekatan yang lebih baik daripada
multiple threads dengan shared address space.
Controlled environment
Tidak ada program deliveri di Postfix yang berjalan dibawah kendali
dari user process. Kebalikannya, kebanyakan program-program dijalankan
dibawah kendali dari resident daemon master yang berjalan dengan
environment terkontrol, tanpa ada hubungan parent-child dengan user
processes. Pendekatan ini mengurangi eksploit yang melibatkan signals,
open files, environment variables, dan atribut proses yang dilewatkan
oleh sistem UNIX dari kemungkinan malicious parent ke child.
Set-uid
Tidak ada program di Postfix yang ber-set-uid.
Pengenalan terhadap konsep merupakan kesalahan besar yang pernah dibuat
dalam sejarah UNIX. Set-uid
(dan saudaranya yang lebih lemah, set-gid)
menyebabkan masalah yang lebih banyak. Setiap kali fitur baru
ditambahkan ke sistem UNIX, set-uid
merupakan penyebab suatu masalah (sedikit contoh): shared
libraries, sistem file /proc,
dukungan multi bahasa. Set-uid
membuatnya menjadi tidak mungkin untuk mengenalkan beberapa fitur
sehingga membuat pengganti UNIX seperti plan9 menjadi begitu menarik,
sebagai contoh adalah per-process file system name spaces.
Pada mulanya, direktori queue maildrop
adalah world-writable, sehingga proses lokal dapat memasukkan email
tanpa bantuan dari perintah dengan set-uid atau set-gid atau dari
proses daemon email. Maildrop direktori tidak digunakan untuk email
yang datang melalui network, dan file-file queuenya tidak bisa dibaca
oleh user yang tidak berhak.
Direktori yang bisa ditulis membuat beberapa gangguan: suatu user
lokal dapat membuat hard links ke file maildrop ouser lain sehingga
tidak bisa dikirimkan dan/atau diteruskan beberapa kali; suatu user
lokal dapat memenuhi direktori maildrop dengan sampah dan mencoba
membuat sistem email crash; dan user lokal dapat membuat file hard link
ke file milik user lain kedalam maildrop direktori dan mencoba
mengirimkannya sebagai suatu email. Meskipun demikian, file queue di
Postfix mempunyai bentuk yang spesifik; kurang dari satu per 10^12 file
bukan Postfix yang akan dikenali sebagai file queue Postfix yang benar.
Karena kemungkinan kesalahan perilaku tersebut, Postfix telah
membuang direktori maildrop yang
world-writable, dan menggunakan program pembantu set-gid postdrop untuk memasukkan email dari
lokal.
Trust
Seperti yang dijelaskan pada bab lain, program-program di Postfix tidak
mempercayai isi dari file queue atau Postfix internal IPC messages.
File-file queue tidak mempunya on-disk record untuk deliveri ke
tujuan-tujuan yang sensitif seperti file atau perintah. Kebalikannya,
program-program seperti agen deliveri local mencoba membuat keputusan
yang peka terhadapat keamanan berdasar pada informasi pertama.
Tentu saja, program-program postfix juga tidak mempercayai data yang
diterima dari network. Dalam beberapa hal tertentu, Postfix menyaring
data yang diberikan oleh pengirim sebelum mengekspornya melalui
variabel environment. Jika terdapat suatu pelajaran yang didapat dari
bencana kemanan suatu Website: jangan
mengijinkan data dari network dekat suatu shell. Penyaringan
adalah hal terbaik yang bisa kita lakukan.
Large inputs
- Memori untuk strings dan buffer dialokasikan secara dinamis,
dalam rangka mencegah masalah buffer overrun.
- Message yang dimasukkan dengan baris yang terlalu panjang akan
dipangkas ke dalam potongan-potongan yang masuk akal, dan kemudian akan
direkonstruksi ketika deliveri.
- Proses diagnosa akan dipotong (dalam satu tempat!) sebelum
dilewatkan ke interface syslog(3), dalam rangka mencegah buffer
overruns padapaltform yang kuno. Meskipun demikian, tidak percobaan
yang umum dibuat untuk memangkas data sebelum melewati system calls
atau ke routine librari. Pada beberapa platform, software mungkin masih
menunjukkan masalah buffer overrun, karena vulnerabilites pada software
dasarnya.
- Tidak ada percobaan spesifik yang dibuat untuk bertahan melawan
perintah dengan argument yang terlalu panjang (tidak rasional). Kernel
UNIX menerapkan batasannya sendiri, yang seharusnya bisa mengatasi
program atau user yang rawan.
Other defenses
- Jumlah dari in-memory instances dari berbagai objek adalah
terbatas, untuk menghindarkan mail sistem menjadi kacau dalam beban
yang berat.
- Jika terjadi masalah, software akan berhenti sejenak sebelum
mengirimkan respon error ke client, sebelum memutus dengan fatal error,
atau sebelum mecoba untuk memulai lagi suatu program yang gagal.
Tujuannya adalah untuk mencegah kondisi yang tidak semestinya yang akan
membuat masalah menjadi lebih parah.
Up one level | Introduction
| Goals
and features | Global architecture
| Queue Management | Security