Pada episode ini kita mengunci ImageMagick lewat security policy: membatasi resource dengan limit, mematikan coder berbahaya, memakai environment variable MAGICK, menerapkan whitelist format, dan mengaudit perilaku dengan log. Semua untuk memastikan pipeline gambar kalian tidak menjadi pintu masuk penyerang.

Di episode 12 kalian melihat ImageMagick sebagai jembatan ke ratusan format lewat delegates. Kekuatan itu punya sisi gelap: setiap delegate adalah permukaan serangan. Semakin banyak format yang bisa diproses, semakin banyak kode pihak ketiga yang berjalan dengan privilege proses kalian.
Episode 13 membalik perspektif. Kalau episode-episode sebelumnya bertanya "apa yang bisa ImageMagick lakukan?", episode ini bertanya "apa yang boleh dilakukan?". Jawabannya diatur di satu file bernama policy.xml — ditambah environment variable MAGICK_* yang bisa mengubah perilaku tanpa menyentuh file. Ini bukan teori keamanan kosong: ini langkah wajib sebelum pipeline gambar kalian menyentuh produksi.
policy.xml adalah file XML yang menjadi pusat kendali seluruh behavior ImageMagick — berlaku untuk command line, dan juga untuk pustaka yang dipakai aplikasi lain yang menautkan ImageMagick. Karena ia dibaca di level proses, kebijakannya tidak bisa dilewati dari command line. Itulah yang membuatnya alat keamanan yang sah, bukan sekadar konfigurasi.
File ini biasanya berada di direktori konfigurasi ImageMagick (cari dengan magick -debug configure info), dan format dasarnya adalah daftar elemen policy dengan atribut domain, name, dan rights:
<policymap>
<policy domain="resource" name="memory" value="256MiB"/>
<policy domain="resource" name="disk" value="1GiB"/>
<policy domain="resource" name="threads" value="2"/>
<policy domain="resource" name="width" value="8192"/>
<policy domain="resource" name="height" value="8192"/>
</policymap>Setiap elemen berbunyi seperti kalimat: "pada domain resource, untuk aspek memory, nilai maksimalnya adalah 256MiB". Kebijakan bersifat global dan default-nya ketat — hal yang tidak disebutkan dalam policy.xml memakai nilai bawaan ImageMagick, dan beberapa distribusi (seperti Debian) bahkan sudah mengunci banyak coder sejak instalasi.
Tip
Lokasi persis policy.xml berbeda antar distribusi dan versi. Jangan menghafal jalurnya — jalankan magick -debug configure info | grep -i policy untuk mengetahui file mana yang benar-benar dibaca, lalu pastikan kebijakan kalian ada di file itu.
Domain resource mengatur berapa banyak "napas" yang diizinkan ImageMagick. Default ImageMagick cukup boros — dan boros itu berbahaya ketika input tidak bisa dipercaya. Empat limit yang paling sering diubah:
memory — berapa banyak RAM untuk cache gambar. Melebihi batas membuat ImageMagick pindah ke disk.disk — berapa banyak ruang disk untuk file sementara. Ini pengaman terakhir: tanpa batas, gambar besar bisa membanjiri filesystem.threads — berapa banyak thread paralel. Membatasi concurrency menekan beban CPU di mesin yang dipakai banyak layanan.width/height — dimensi maksimum gambar. Ini mencegah gambar bom piksel (misalnya 100.000 x 100.000) memakan resource tanpa henti.Dimensi maksimum adalah pengaman yang paling sering diabaikan dan paling berharga. Sebuah file PNG kecil bisa dideklarasikan berukuran raksasa di headernya; tanpa width dan height, proses kalian akan mencoba mengalokasikan memori sesuai klaim tersebut. Dengan batas ini, klaim bohong ditolak sebelum kerja dimulai.
<policy domain="resource" name="time" value="120"/>
<policy domain="resource" name="map" value="512MiB"/>
<policy domain="resource" name="area" value="256MB"/>Selain batas di atas, time membatasi detik eksekusi dan map/area mengatur memori mapping. Untuk layanan yang memproses input tak dikenal, kombinasi memory + disk + time + width/height adalah empat pilar yang harus ada.
Domain coder mengendalikan format mana yang boleh dibaca. Bentuk paling ketat adalah whitelist: hanya format yang benar-benar dibutuhkan yang diizinkan, sisanya ditolak.
<policy domain="coder" rights="none" pattern="*"/>
<policy domain="coder" rights="read|write" pattern="PNG"/>
<policy domain="coder" rights="read|write" pattern="JPEG"/>
<policy domain="coder" rights="read|write" pattern="WEBP"/>
<policy domain="coder" rights="read|write" pattern="PDF"/>Bacanya: "tidak ada format yang boleh, kecuali yang disebutkan". Baris pertama menutup semuanya, baris berikutnya membuka hanya PNG, JPEG, WEBP, dan PDF. Ini pola paling aman — semantik kebalikan dari blacklist yang selalu kedaluwarsa karena format baru muncul terus.
Coder yang hampir selalu dimatikan di lingkungan produksi: MVG, MSL, URL, EPHEMERAL, dan HTTPS. Kalian akan melihat alasan lengkapnya di episode 14 — cukup tahu sekarang bahwa coder-coder itu dirancang untuk melakukan hal lebih dari sekadar decode gambar, dan "lebih" itulah yang berbahaya.
Dua domain lain yang ikut mengencangkan keamanan:
module — mematikan pemuatan modul secara dinamis. Menyala berarti ImageMagick bisa memuat pustaka .so dari lokasi yang tidak terduga; mematikannya memastikan hanya modul yang ter-compile yang berjalan.path — mengunci tempat file boleh dibaca/ditulis. Dengan pola @/var/media/*, kalian bisa memastikan pipeline hanya menyentuh direktori yang diizinkan, bukan seluruh filesystem.<policy domain="module" rights="none" pattern="{PS,PDF,XPS}"/>
<policy domain="path" rights="read" pattern="@/var/media/*"/>
<policy domain="path" rights="write" pattern="@/var/out/*"/>Perhatikan sintaks @ pada domain path — awalan yang menandakan pola path. Membatasi path sangat efektif di lingkungan multi-tenant, di mana satu proses ImageMagick melayani input dari banyak pengguna.
Selain policy.xml, ImageMagick membaca banyak environment variable berawalan MAGICK_ yang mengubah perilaku runtime. Dua yang paling berguna untuk keamanan dan debugging:
export MAGICK_THREAD_LIMIT=2
export MAGICK_MEMORY_LIMIT=256MiB
export MAGICK_TIME_LIMIT=120
export MAGICK_CONFIGURE_PATH=/etc/im-configMAGICK_MEMORY_LIMIT, MAGICK_THREAD_LIMIT, dan MAGICK_TIME_LIMIT adalah jalan pintas ke domain resource tanpa mengedit XML — sempurna untuk menyesuaikan batas per-layanan di container atau systemd unit. MAGICK_CONFIGURE_PATH (dari episode 12) menunjuk direktori konfigurasi kustom.
Hubungan keduanya penting: policy.xml berlaku global dan mengikat, environment variable bersifat per-proses dan bisa lebih longgar dari policy — tapi tidak pernah bisa melonggarkan di atas batas policy. Ini komposisi yang sehat: policy sebagai lantai keamanan, environment sebagai penyesuaian granular di atasnya.
Important
Batas di policy.xml adalah langit-langit keras. MAGICK_* dan opsi -limit bisa menurunkan batas, tapi tidak bisa menaikkan melebihi apa yang diizinkan policy. Desain ini memastikan satu skrip yang bandel tidak bisa menonaktifkan kebijakan mesin hanya dengan mengubah environment.
Selain kebijakan global, ImageMagick punya opsi -limit untuk mengatur batas pada satu perintah:
magick input.jpg -limit memory 128MiB -limit disk 256MiB -resize 50% output.jpg-limit memory dan -limit disk di atas mengikat satu invocation saja. Gunakan ini ketika kalian tahu satu tugas tertentu lebih rakus dari normal — misalnya mengolah foto resolusi tinggi satu per satu di malam hari — tanpa mengubah kebijakan global untuk semua orang.
Alasan whitelist lebih disukai daripada blacklist adalah masalah masa depan. Blacklist mencantumkan format yang sekarang berbahaya; format baru yang lahir bulan depan tidak ada dalam daftar, jadi aman secara tidak sengaja. Whitelist mencantumkan format yang sengaja diizinkan; apapun yang lahir di luar daftar ditolak sejak lahir.
Analogikan dengan keamanan gedung: blacklist adalah daftar nama yang tidak boleh masuk, whitelist adalah daftar nama yang boleh masuk. Daftar pertama membutuhkan kalian tahu semua penjahat masa depan; daftar kedua cukup kalian tahu tamu yang diundang. Untuk pipeline produksi, jawaban yang benar selalu whitelist.
Kebijakan tanpa pengamatan tidak berguna. ImageMagick bisa menulis log terperinci tentang apa yang sedang dilakukan — kapan, di file mana, berapa resource yang dipakai:
magick -log events=All -log format='%t %d %[filename]' \
-limit memory 128MiB input.jpg output.pngFormat log di atas mencatat waktu, domain event, dan nama file yang sedang diproses. Di server yang memproses upload pengguna, aliran log ini adalah jejak audit: kalian bisa melihat kapan input mencurigakan masuk, berapa lama diproses, dan di mana ia berhenti.
Untuk lingkungan yang benar-benar diawasi, arahkan log ke syslog atau file terpusat, lalu pasang alert saat pesan error seperti cache resources exhausted atau no decode delegate muncul berulang. Pola-pola itu biasanya bukan kecelakaan — mereka adalah percobaan yang gagal.
Warning
Jangan pernah menganggap log sebagai pengganti batas. Log memberi tahu kalian setelah sesuatu terjadi; policy.xml mencegahnya sebelum terjadi. Pasang keduanya, dan arahkan ke dua tempat yang berbeda — log yang hanya disimpan di mesin yang sama bisa hilang bersama mesinnya.
Episode 13 mengubah ImageMagick dari tool yang serba bisa menjadi tool yang tahu batas: membatasi resource dengan domain resource dan -limit, menutup coder berbahaya dengan domain coder, menerapkan whitelist format yang tidak perlu diperbarui, mengunci eksekusi modul dan path, mengubah perilaku per-proses dengan environment MAGICK_*, dan mengawasi semuanya dengan -log.
Inti yang perlu diingat: kebijakan keamanan adalah desain, bukan tambalan. Whitelist format dan limit resource bukan fitur sekunder — mereka adalah garis pertahanan yang menentukan apakah pipeline gambar kalian bisa menangani input dari dunia luar tanpa runtuh.
Di episode 14 kita melihat alasan paling nyata kenapa semua kebijakan ini wajib: ImageTragick — kerentanan RCE yang mengguncang dunia ImageMagick pada 2016, dan pelajaran bertahan yang lahir darinya. Sampai jumpa!