Cara server paling sering dibobol bukan lewat trik canggih, melainkan lewat celah yang sudah lama diketahui dan sudah lama ditambali — hanya saja tambalannya belum terpasang di mesin korban. Begitu sebuah celah dipublikasikan, bot pemindai mulai mencari sistem yang belum menambalnya dalam hitungan jam, sehingga jarak waktu antara “tambalan tersedia” dan “tambalan terpasang” adalah jendela yang menentukan. Chapter ini membahas cara mengecilkan jendela itu di keluarga Debian: repositori keamanan, pembaruan otomatis dengan unattended-upgrades, penjadwalan lewat cron dan systemd timer, sampai langkah yang sering dilupakan — me-restart service yang file pustakanya baru saja diganti. Ritual apt update dan apt upgrade sendiri sudah dibedah pada Chapter Updating dan Upgrading System ; di sini kita fokus pada sisi keamanannya.

CVE dan Jendela Eksploit #

Celah keamanan diberi nomor publik bernama CVE (Common Vulnerabilities and Exposures) dengan format CVE-tahun-nomor. Setelah sebuah CVE dipublikasikan, tiga jam penting mulai berjalan: penulis software merilis perbaikan, distro mengemasnya, dan penyerang menulis eksploit — seringkali hanya dalam hitungan hari. Perangkat yang menghadap internet lalu dipindai terus-menerus oleh bot yang mencoba eksploit itu pada setiap alamat IP yang bisa dijangkau.

Sistem yang rutin memasang tambalan keamanan mengecilkan jendela itu menjadi beberapa jam; sistem yang diperbarui setahun sekali membiarkannya terbuka selama berbulan-bulan. Untuk mengetahui celah apa saja yang menunggu di distro kita, Debian menyediakan security tracker — basis data seluruh CVE beserta statusnya di tiap rilis — yang bisa diikuti mulai dari halaman keamanan Debian . Praktik yang sehat bukan menunggu kabar celah besar, melainkan memastikan alur pembaruan berjalan sendiri tanpa bergantung pada ingatan admin.

Repositori Keamanan Debian #

Debian mengemas tambalan keamanan pada repositori terpisah agar bisa diperbarui cepat tanpa menunggu siklus rilis biasa. Suite keamanan hanya menerima perbaikan celah — bukan versi baru — sehingga risiko perubahan perilaku tetap kecil. Kita periksa definisi repositori pada mesin latihan ini:

bash
grep -v '^#' /etc/apt/sources.list.d/debian.sources

Output yang Dihasilkan:

text
Types: deb
URIs: http://deb.debian.org/debian
Suites: trixie trixie-updates
Components: main
Signed-By: /usr/share/keyrings/debian-archive-keyring.pgp

Types: deb
URIs: http://deb.debian.org/debian-security
Suites: trixie-security
Components: main
Signed-By: /usr/share/keyrings/debian-archive-keyring.pgp

Blok di atas memuat dua stanza. Stanza pertama adalah repositori utama trixie beserta pembaruan rutinnya, sedangkan stanza kedua adalah bintang utama kita: URIs mengarah ke debian-security dan Suites berisi trixie-security. Nama suite itu dibangun dari nama kode rilis, dan nama kode rilis sendiri terbaca dari file identitas sistem:

bash
grep -E '^(PRETTY_NAME|VERSION_CODENAME|ID)=' /etc/os-release

Output yang Dihasilkan:

text
PRETTY_NAME="Debian GNU/Linux 13 (trixie)"
VERSION_CODENAME=trixie
ID=debian

Nilai VERSION_CODENAME=trixie itulah yang menjadi bagian trixie-security pada suite di repositori. File /etc/os-release memang tidak menunjukkan apakah sistem sudah menambal segalanya — status itu hanya bisa dibaca dari apt list --upgradable setelah apt update — tetapi file ini adalah tempat pertama yang kita periksa untuk mengenali rilis yang sedang dirawat. Perlu dicatat juga: mesin latihan kita menjalankan Debian, sedangkan di Ubuntu mekanisme yang sama berjalan lewat suite -security pada repositori Ubuntu.

unattended-upgrades: Tambalan Tanpa Menunggu Admin #

Paket unattended-upgrades memasang pembaruan keamanan secara otomatis begitu tersedia, tanpa menunggu admin login dan mengetik perintah. Cakupannya sengaja dibatasi hanya pada asal paket keamanan, bukan semua pembaruan, agar risiko perubahan tak terduga pada sistem produksi tetap kecil. Sakelarnya ada di file konfigurasi dua baris ini:

bash
mkdir -p etc-apt/apt.conf.d
printf 'APT::Periodic::Update-Package-Lists "1";\nAPT::Periodic::Unattended-Upgrade "1";\n' > etc-apt/apt.conf.d/20auto-upgrades
cat etc-apt/apt.conf.d/20auto-upgrades

Output yang Dihasilkan:

text
APT::Periodic::Update-Package-Lists "1";
APT::Periodic::Unattended-Upgrade "1";

Mari kita bedah blok di atas:

  1. Baris 1 (mkdir -p ...): menyiapkan salinan lokal struktur direktori konfigurasi apt sebagai tempat latihan. Pada sistem sungguhan file ini berada di /etc/apt/apt.conf.d/20auto-upgrades dan diubah lewat dpkg-reconfigure — bukan diedit tangan.
  2. Baris 2 (printf ... > ...): menulis dua arahan konfigurasi apt. APT::Periodic::Update-Package-Lists "1" artinya indeks paket diperbarui sekali per hari, dan APT::Periodic::Unattended-Upgrade "1" artinya pembaruan keamanan otomatis dinyalakan. Nilai "0" berarti mati; nilai "2" berarti dua hari sekali.
  3. Baris 3 (cat ...): menampilkan kembali isinya — kebiasaan memverifikasi file konfigurasi setelah ditulis menyelamatkan kita dari kesalahan ketik yang tidak terasa.

Paket mana saja yang dianggap “keamanan” diatur lewat pola asal pada file 50unattended-upgrades — kuncinya bagian ini:

ini
Unattended-Upgrade::Origins-Pattern {
	"origin=Debian,codename=${distro_codename},label=Debian-Security";
};

Baris di dalam kurung kurawal mencocokkan paket yang berasal dari repositori berlabel Debian-Security pada nama kode rilis yang sedang berjalan — makanya suite trixie-security tadi otomatis tercakup. Bila kita ingin mezinkan pembaruan rutin non-keamanan, pola asal lain tinggal ditambahkan ke daftar itu; keputusannya selalu trade-off antara mutakhir dan stabilitas.

Jadwal Harian: cron dan systemd timer #

unattended-upgrades tidak menjalankan dirinya sendiri setiap saat — ia dipicu pekerjaan terjadwal. Mesin apt telah memasang dua mekanisme sekaligus, dan keduanya saling menggantikan:

bash
ls -1 /etc/cron.daily/

Output yang Dihasilkan:

text
apt-compat
dpkg

Daftar di atas berisi skrip yang dijalankan sekali sehari oleh cron: dpkg merawat database paket, sementara apt-compat adalah pintu masuk pekerjaan apt. Skrip apt-compat sebenarnya hanya jembatan — begitu sistem berjalan dengan systemd, skrip itu langsung menyerahkan pekerjaan kepada timer apt-daily.timer dan apt-daily-upgrade.timer yang jadwalnya lebih acak agar mirror tidak dihantam semua klien pada menit yang sama. Anatomi timer seperti ini sudah dibahas pada Chapter systemd timers , dan format cron sendiri pada Chapter cron dan crontab .

Service yang Terdampak dan Reboot Kernel #

Memasang pembaruan mengganti file di disk, tetapi proses yang sudah berjalan tetap memuat versi lama di memorinya. Layanan web yang pustaka SSL-nya baru ditambal tetap rentan sampai layanan itu di-restart — file barunya sudah ada, tapi yang dipakai masih yang lama. Pada Debian, paket needrestart (dan checkrestart dari debian-goodies) mendaftar service mana saja yang menunggu restart; berikut contoh tampilannya:

text
NEEDRESTART-SESS: 2 sessions are using outdated binaries
NEEDRESTART-SVC: nginx.service
NEEDRESTART-SVC: sshd.service

Kernel adalah kasus yang lebih khusus: kernel aktif dimuat ke memori saat boot, jadi kernel baru yang terpasang belum berjalan sampai sistem di-reboot. Ubuntu menandai kebutuhan itu lewat file /var/run/reboot-required; pengecekan satu baris test -f /var/run/reboot-required && cat /var/run/reboot-required cukup untuk menjawab “perlu reboot atau belum”. Untuk server yang benar-benar tidak boleh reboot, Ubuntu menyediakan Livepatch: kernel yang di-patch langsung di memori tanpa restart, dikelola lewat canonical-livepatch — layanan berbayar untuk penggunaan bisnis, gratis dengan batas kuota untuk akun personal.

Rangkaian pada chapter ini menutup pintu celah yang sudah diketahui publik. Namun lapisan ini tidak memilih siapa yang boleh menghubungi mesin kita — tugas itu dipegang lapisan berikutnya. Chapter SSH Hardening berikutnya mengunci pintu paling sering digodok di internet: server SSH dengan login password.

Referensi lanjut: halaman keamanan Debian beserta security tracker-nya, unattended-upgrades(8) untuk seluruh opsi konfigurasi, serta apt-get(8) untuk opsi pembaruan lewat baris perintah.