Server disiapkan sekali, lalu hidup sendiri. Sebulan kemudian sebagian paket menunggu pemutakhiran, sertifikat sudah merapat ke tiga minggu menjelang kedaluwarsa, setelah pemasangan sesuatu yang tak berkaitan muncul satu baris berlebih dalam konfigurasi SSH, dan jail yang seharusnya mengawasi login berhenti tanpa ada yang menyadari. Tidak satu pun dari semua itu berteriak. Semuanya hanya diam-diam berhenti menjadi benar.

Berikut dua belas hal yang layak diperiksa secara berkala, lengkap dengan perintahnya. Satu putaran memakan waktu sekitar lima belas menit. Urutannya berjalan dari apa yang orang masuki menuju apa yang rusak dengan sendirinya.

SSH: lima baris

Yang perlu dilihat bukan berkasnya, melainkan konfigurasi yang berlaku: ia tersusun dari /etc/ssh/sshd_config, seluruh direktori sshd_config.d, dan nilai bawaan hasil kompilasi.

sudo sshd -T | grep -iE 'permitrootlogin|passwordauthentication|permitemptypasswords|maxauthtries|x11forwarding'

Yang ingin kita lihat: permitrootlogin no, passwordauthentication no, permitemptypasswords no, maxauthtries pada angka 3–4, dan x11forwarding no. Tiga yang pertama adalah pintunya, dua yang terakhir engselnya — batas percobaan per sambungan, dan penerusan grafis yang sama sekali tak berguna bagi sebuah server.

Dua catatan, keduanya cara mudah mengunci diri sendiri di luar. Pertama: jangan matikan login dengan kata sandi dan login root sebelum Anda memastikan kunci Anda bekerja — pada sesi terpisah, tanpa menutup sesi yang sedang berjalan. Kalau Anda membaca ini sambil masuk sebagai root dengan kata sandi, justru dua baris itulah yang akan mengunci Anda di luar.

Kedua: urutan berkas. OpenSSH mengambil nilai parameter yang pertama ia temui, dan berkas di sshd_config.d dibaca menurut abjad. Citra awan biasanya meninggalkan 50-cloud-init.conf di sana, dan berkas itu akan mengalahkan milik Anda bila Anda menamainya semacam 90-hardening.conf. Pengaturan Anda sendiri ditaruh di bawah nomor yang lebih kecil — 00- atau 10-. Dan hasilnya diperiksa dengan sshd -T, bukan dengan membaca berkas.

Firewall: satu pemeriksaan

sudo ufw status verbose

Di sini perlu diingat bahwa keluaran itu menampilkan niat, bukan hasil. Sebuah aturan bisa berdiri di daftar tanpa menutup apa pun: UFW-nya sendiri mati, porta dilayani oleh sesuatu yang dipublikasikan Docker (ia menulis aturannya sendiri ke iptables di bawah UFW), atau lalu lintas mencapai server lewat jalan lain. Karena itu ada gunanya menyandingkan daftar aturan dengan apa yang benar-benar mendengarkan ke luar:

sudo ss -tulpn | grep -v '127.0.0.1\|::1'

fail2ban: dua pemeriksaan

Tidak cukup layanannya berjalan — harus ada pula jail yang bekerja untuk SSH.

sudo fail2ban-client status
sudo fail2ban-client status sshd

Gangguan paling umum di sini adalah jail yang membisu. Pada Debian 12 dan Ubuntu yang baru, /var/log/auth.log bisa jadi tidak ada sama sekali: rsyslog tidak terpasang dan catatan hanya hidup di journald. Jail dengan logpath bawaan lalu menyala, melaporkan dirinya aktif, dan tak pernah memblokir siapa pun. Obatnya adalah mengarahkannya ke jurnal systemd:

printf '[sshd]\nenabled = true\nbackend = systemd\n' | sudo tee /etc/fail2ban/jail.d/sshd-systemd.local
sudo systemctl restart fail2ban

Tanda yang menangkap hal ini tanpa mengorek konfigurasi: pada fail2ban-client status sshd, «Currently failed» dan «Total failed» tetap nol sementara jurnal jelas-jelas memuat login yang gagal.

Pembaruan: tiga pemeriksaan

Terpisah: berapa paket yang menunggu seluruhnya, berapa di antaranya menyangkut keamanan, dan apakah sistem meminta mulai ulang setelah pembaruan kernel.

sudo apt update
apt list --upgradable 2>/dev/null | grep -c -- '-security'
ls /var/run/reboot-required 2>/dev/null && echo 'perlu mulai ulang'

Pemeriksaan ketiga adalah apakah pembaruan keamanan otomatis menyala, supaya dua yang pertama tidak berubah menjadi ritual bulanan:

systemctl status unattended-upgrades --no-pager
cat /etc/apt/apt.conf.d/20auto-upgrades

Pada berkas itu harus ada angka 1 di kedua barisnya. Kalau paketnya belum ada: sudo apt install unattended-upgrades && sudo dpkg-reconfigure -plow unattended-upgrades.

Sertifikat: satu pemeriksaan

Sertifikat Let's Encrypt hidup sembilan puluh hari, dan pembaruannya biasanya berjalan sendiri tepat sampai hari ketika ia berhenti. Yang perlu dilihat bukan panel pendaftar nama, melainkan apa yang benar-benar disajikan server:

echo | openssl s_client -connect localhost:443 -servername example.com 2>/dev/null | openssl x509 -noout -enddate
sudo certbot renew --dry-run

Perintah pertama memberi tanggal berakhir sertifikat yang disajikan untuk nama itu; yang kedua memastikan pembaruan akan lolos, tanpa menunggu tenggat sebenarnya. Ada gunanya menyusuri semua nama yang dilayani server, bukan hanya domain utama: yang terlupakan biasanya subdomain yang ditambahkan belakangan.

Disk: satu pemeriksaan

df -h
df -i

Dua perintah, karena ruang dan catatan berkas habis secara terpisah. Pada kebanyakan server yang kedua lebih dulu membentur langit-langit — jutaan berkas kecil di sesi PHP atau di tembolok aplikasi membuat IUse% mencapai 100 padahal masih ada gigabita kosong. Tentang kedua kasus itu kami punya tulisan tersendiri.

Apa yang keliru dengan daftar ini

Daftarnya benar, tetapi punya satu sifat: ia menuntut seseorang mengingatnya. Lima belas menit seminggu bukan waktu yang banyak, selama servernya satu dan selama ada alasan. Setelah dua bulan tenang, putaran itu terlewat, dan kabar bahwa jail berhenti datang dari log orang lain.

Karena itu kami kumpulkan tepat dua belas pemeriksaan ini ke dalam panel gratis tersendiri — Arcivéo FREE. Ia dipasang dengan satu perintah, berjalan di server Anda sendiri, tidak mengirim apa pun kepada kami, dan tidak meminta pendaftaran. Sebuah pengumpul berjalan dari cron setiap lima menit dan menulis hal yang sama ke basis data lokal: login SSH dan sambungan yang ditolak, keadaan UFW dan fail2ban, pembaruan keamanan yang tertunda, tenggat sertifikat, ruang disk. Riwayatnya tujuh hari, antarmukanya tersedia dalam 34 bahasa. Harganya nol, termasuk di server kerja: lisensinya mengizinkan pemasangan panel pada mesin Anda sendiri, termasuk mesin perusahaan, dan tidak mengizinkan penjualan kembali maupun pengoperasiannya sebagai layanan untuk server milik orang lain.

Tumpukan edisi gratisnya sederhana: ia memasang dan menyalakan UFW serta fail2ban, lalu sejak itu menampilkan keadaannya. ModSecurity, Suricata, AIDE, dan modul-modul lain tidak ada di dalamnya, itu milik versi berbayar. Namun untuk berhenti memanggul putaran mingguan di kepala, itu sudah cukup. Seperti apa data yang sama pada panel penuh — lihat halaman demo di bawah.