Menandatangani semua email keluar dengan OpenDKIM: instalasi milter, generate key dengan opendkim-genkey, publikasi record DNS, konfigurasi Postfix memakai milter, memahami SPF alignment dan DKIM alignment, lalu menaikkan kebijakan DMARC dari none menuju reject.

Episode 5 menyiapkan record SPF, DKIM, dan DMARC di DNS. Sekarang kita menghidupkan sisi aktifnya: menandatangani setiap email keluar dengan OpenDKIM. Tanpa signature, record DKIM hanyalah key tanpa pemakaian — dan DMARC tidak bisa lolos alignment.
Episode ini memasang OpenDKIM sebagai milter, menghasilkan dan memublikasikan kunci, menghubungkannya ke Postfix, lalu merangkai semuanya dengan SPF/DKIM alignment dan kebijakan DMARC yang dinaikkan bertahap hingga reject.
DKIM membuktikan bahwa email benar-benar berasal dari server yang menguasai domain. Mekanisme kerjanya: private key menandatangani header dan body; public key dipublikasikan di DNS; penerima memverifikasi dan melihat apakah tanda tangan cocok.
Konsekuensinya besar: mailbox provider memakai DKIM sebagai bukti otentik — bukan sekadar "klaim" — tentang pengirim. Email tanpa DKIM di era 2026 dianggap lebih berisiko, apalagi dengan tren DMARC enforcement yang makin ketat.
Pasang OpenDKIM beserta paket pendukung:
sudo apt install -y opendkim opendkim-toolsBuat direktori kunci dan pemiliknya:
sudo mkdir -p /etc/opendkim/keys/example.com
sudo chown -R opendkim:opendkim /etc/opendkimKonfigurasi utama /etc/opendkim.conf — bagian penting:
Mode sv
Syslog yes
Socket inet:8891@localhost
KeyTable /etc/opendkim/key.table
SigningTable refile:/etc/opendkim/signing.table
InternalHosts /etc/opendkim/trusted.hosts
Canonicalization relaxed/simple
Selector mailMode sv — sign dan verify.Socket inet:8891 — milter mendengarkan di port 8891 localhost.KeyTable / SigningTable — memetakan domain ke kunci.Selector mail — nama selector, harus sama dengan yang dipublikasikan di DNS.Isi ketiga file pendukung:
# key.table
example.com example.com:mail:/etc/opendkim/keys/example.com/mail.private
# signing.table
*@example.com example.com
# trusted.hosts
localhost
mail.example.comHasilkan pasangan kunci dengan opendkim-genkey:
sudo opendkim-genkey -D /etc/opendkim/keys/example.com -d example.com -s mailPerintah di atas menghasilkan mail.private (private key) dan mail.txt (public key siap DNS). Kunci private harus dijaga dengan kepemilikan dan permission yang ketat, lalu lihat public key-nya untuk dipublikasikan sebagai TXT record di mail._domainkey.example.com:
sudo chown opendkim:opendkim /etc/opendkim/keys/example.com/mail.private
sudo chmod 600 /etc/opendkim/keys/example.com/mail.private
cat /etc/opendkim/keys/example.com/mail.txtRecord yang dipublikasikan bentuknya seperti v=DKIM1; k=rsa; p=MIGfMA.... Verifikasi setelah DNS menyebar:
dig TXT mail._domainkey.example.com +shortPostfix memakai milter untuk memanggil OpenDKIM di tengah alur email. Aktifkan di main.cf:
sudo postconf -e 'milter_default_action = accept'
sudo postconf -e 'milter_protocol = 6'
sudo postconf -e 'smtpd_milters = inet:localhost:8891'
sudo postconf -e 'non_smtpd_milters = inet:localhost:8891'
sudo postfix reloadmilter_default_action = accept — jika milter bermasalah, jangan tolak email (graceful).milter_protocol = 6 — protokol milter versi terbaru.smtpd_milters — milter untuk email yang lewat smtpd.Mulai OpenDKIM dan periksa:
sudo systemctl enable --now opendkim
sudo journalctl -u opendkim --since "1 minute ago"Kirim email uji dan cek signature di header:
echo "dkim test" | mail -s "DKIM check" admin@example.com
grep -i "dkim-signature" /var/mail/vhosts/example.com/admin/Maildir/new/*Jika header DKIM-Signature muncul, penandatanganan bekerja. Baris b= dan bh= adalah signature dan hash body.
DMARC memeriksa alignment: apakah domain yang terlihat di header From: selaras dengan domain yang lolos SPF atau DKIM?
Return-Path) atau header harus cocok dengan domain From:. Modus strict membutuhkan cocok persis; relaxed mengizinkan subdomain.d= dari signature DKIM harus cocok dengan domain From:.DMARC lolos jika salah satu dari keduanya selaras. Ini mengapa menandatangani semua email keluar dengan domain yang sama dengan From: adalah kunci — kalian mengendalikan DKIM alignment sepenuhnya, sementara SPF alignment bisa terganggu oleh relay pihak ketiga.
Sekarang susun DMARC record yang lengkap. Contoh untuk production:
_dmarc.example.com. IN TXT "v=DMARC1; p=reject; sp=reject; adkim=s; aspf=r; pct=100; rua=mailto:dmarc@example.com; ruf=mailto:forensic@example.com"Mari bedah tiap tag:
p=reject — kebijakan utama untuk domain ini.sp=reject — kebijakan untuk subdomain.adkim=s — DKIM alignment strict.aspf=r — SPF alignment relaxed.pct=100 — diterapkan ke 100% email.rua / ruf — tujuan laporan agregat dan forensik.Jangan langsung reject. Naikkan bertahap dengan data laporan sebagai penuntun:
p=none — pantau laporan rua selama beberapa minggu.p=quarantine saat semua email sah sudah lolos alignment.p=reject setelah yakin tidak ada email sah yang akan ditolak.Verifikasi record yang terpublikasi:
dig TXT _dmarc.example.com +shortKebiasaan memeriksa hasil verifikasi di log OpenDKIM akan menyingkap masalah lebih awal — pantau secara real-time dengan journalctl -fu opendkim di terminal terpisah saat mengirim email uji:
sudo journalctl -u opendkim --since "1 hour ago" | grep -E "dkim_verify|dkim=pass|dkim=fail"Saat mengirim ke Gmail, periksa header Authentication-Results di email yang diterima — baris itu menampilkan dkim=pass dan spf=pass dari sudut pandang penerima. Itulah bukti paling meyakinkan bahwa identitas kalian lolos verifikasi.
Episode 17 selesai. Inti yang harus dibawa pulang:
smtpd_milters = inet:localhost:8891 menghubungkan Postfix ke OpenDKIM.From: yang sama mengamankan DKIM alignment.none → quarantine → reject, dipantau lewat laporan rua.Identitas email sudah solid. Di episode 18 kita mengamankan protokol itu sendiri: SMTP Smuggling & Protocol Security — menutup celah penyelundupan perintah dan mewajibkan TLS antar server lewat MTA-STS dan DANE. Sampai jumpa di episode 18!