Sebagian besar pembobolan server yang berhasil terjadi bukan lewat eksploit yang cerdik melainkan lewat kerentanan yang tambalannya sudah keluar beberapa bulan sebelumnya. Penyebabnya biasanya bukan kemalasan: memperbarui dengan tangan pada server yang sedang bekerja itu menakutkan, karena kadang apt upgrade menyalakan ulang hal-hal yang tidak diminta siapa pun. Pembaruan otomatis menutup persoalan itu, tetapi reputasinya buruk — persis sebanding dengan seberapa tergesa mereka disetel.
Mari kita telusuri susunan yang membuat tambalan keamanan datang sendiri dan versi PHP tidak berubah dalam semalam.
Pemasangan
sudo apt install unattended-upgrades apt-listchanges
sudo dpkg-reconfigure -plow unattended-upgrades
Dialog itu membuat /etc/apt/apt.conf.d/20auto-upgrades. Periksa apa hasilnya:
APT::Periodic::Update-Package-Lists "1";
APT::Periodic::Unattended-Upgrade "1";
Angka satu berarti «harian». Semuanya digerakkan oleh timer systemd, bukan cron klasik:
systemctl list-timers | grep apt
Hal terpenting: hanya keamanan
Berkas utamanya adalah /etc/apt/apt.conf.d/50unattended-upgrades. Di dalamnya ada daftar Allowed-Origins (di Debian namanya Origins-Pattern), dan secara bawaan di sana hanya repositori keamanan yang aktif. Biarkan seperti itu.
Godaan untuk membuka komentar pada baris -updates — «biar semuanya diperbarui» — memang kuat. Jangan: repositori updates membawa versi baru, bukan hanya perbaikan, dan kejutan tengah malam datangnya justru dari sana. Keamanan dan kesegaran adalah dua pekerjaan berbeda, dan yang kedua lebih baik dikerjakan saat Anda duduk di depan papan ketik.
Kalau ada paket yang tidak boleh diperbarui otomatis maka tersedia daftar hitam untuknya:
Unattended-Upgrade::Package-Blacklist {
"mariadb-server";
"php8.3-fpm";
};
Pakailah dengan sadar: setiap baris di sini berarti «yang ini saya perbarui sendiri» — dan itu janji yang harus ditepati.
Menyalakan ulang
Baris kuncinya:
Unattended-Upgrade::Automatic-Reboot "false";
Membiarkannya false memang benar untuk server dengan situs: menyalakan ulang pukul tiga pagi tanpa pemberitahuan lebih buruk daripada tambalan yang tertunda sehari. Tetapi keputusan itu punya paruh kedua yang wajib, dan justru paruh itulah yang dilupakan orang.
Ketika kernel, libc atau openssl diperbarui, sistem membuat berkas /var/run/reboot-required. Sampai penyalaan ulang terjadi, versi yang sudah diperbaiki ada di disk sementara yang lama berjalan di memori — artinya kerentanannya tidak pergi ke mana-mana, meski paketnya dianggap sudah diperbarui. Periksalah secara eksplisit:
ls -l /var/run/reboot-required
cat /var/run/reboot-required.pkgs
Berkas kedua menyebut apa persisnya yang membuat penyalaan ulang diperlukan. Aturannya sederhana: begitu melihat benderanya, rencanakan jendela waktu dalam satu dua hari ke depan, bukan «suatu saat».
Pustaka adalah kasus tersendiri. openssl diperbarui sementara nginx dan PHP-FPM tetap berjalan dengan versi lama di memori, dan bendera penyalaan ulang bahkan tidak muncul. Siapa yang perlu dinyalakan ulang ditunjukkan oleh needrestart:
sudo apt install needrestart
sudo needrestart -b
Cukup tetapkan ia ke mode «laporkan, jangan bertanya» — kalau tidak, ia akan mulai bertanya di tengah pemasangan non-interaktif dan menggantungnya. Untuk itu letakkan berkas dengan baris $nrconf{restart} = 'l'; ke /etc/needrestart/conf.d/.
Periksa bahwa ia benar-benar bekerja
Jalankan uji coba tanpa memasang:
sudo unattended-upgrade --dry-run --debug
Keluarannya menunjukkan paket mana yang cocok dengan aturan dan mana yang ditolak beserta alasannya. Apa yang benar-benar terjadi ada di log:
sudo tail -50 /var/log/unattended-upgrades/unattended-upgrades.log
Berapa banyak pembaruan yang sedang menunggu:
apt list --upgradable 2>/dev/null | grep -i security
Perintah terakhir inilah yang paling berguna. Pembaruan otomatis yang sudah disetel punya kebiasaan rusak diam-diam: /boot kehabisan ruang, repositori mengganti kunci, timer dimatikan setelah suatu suntingan manual. Dari luar semuanya beres, dan tambalan sudah berbulan-bulan tidak terpasang.
Ruang di /boot
Situasi klasik: kernel lama tidak dihapus, partisi /boot penuh, pemasangan kernel baru gagal, dan pembaruan berhenti sama sekali. Beberapa bulan sekali layak ditengok:
df -h /boot
sudo apt autoremove --purge
Atau nyalakan pembersihan otomatis di 50unattended-upgrades yang sama: Remove-Unused-Kernel-Packages "true" dan Remove-Unused-Dependencies "true".
Apa yang tersisa untuk manusia
Pembaruan otomatis menghilangkan pekerjaan rutin tetapi tidak menghilangkan pengawasan. Dua pertanyaan yang harus bisa Anda jawab kapan saja: berapa banyak pembaruan keamanan yang menunggu, dan apakah bendera penyalaan ulang terpasang. Kedua jawabannya adalah satu baris pada sebuah halaman, dan seluruh maknanya adalah agar baris itu menyentak mata dengan sendirinya, bukan menunggu inisiatif Anda sekali per triwulan.