Sepanjang section ini kita memasang pertahanan satu per satu: update rutin, SSH yang dikunci, firewall, sampai enkripsi disk. Hardening adalah seni merangkainya menjadi satu kebiasaan sistematis: memperkecil permukaan serangan (attack surface) dengan menghapus semua yang tidak dipakai, dan memeriksa sisanya secara berkala. Prinsipnya sederhana — setiap service yang terpasang, setiap port yang mendengarkan, dan setiap akun yang punya hak sudo adalah pintu; pintu yang tidak kita pakai sebaiknya ditutup. Chapter penutup ini merangkum seluruhnya menjadi checklist per lapisan, dari instalasi minimal hingga kernel parameter, ditutup skrip pemeriksaan yang bisa kita jalankan sebagai audit berkala.
Setiap Service adalah Pintu #
Langkah paling murah dari semua hardening dilakukan sebelum sistem pertama kali menyala: pilih instalasi minimal. ISO netinst Debian atau instalasi server tanpa desktop memasang ratusan paket lebih sedikit dibanding instalasi desktop penuh — ratusan pintu yang tidak perlu ada. Setelah sistem berjalan, daftar pintu yang terbuka terbaca langsung dari socket yang mendengarkan: ss -tlnp memperlihatkan port, alamat, dan proses pemiliknya. Setiap baris yang tidak bisa kita jelaskan alasan keberadaannya adalah kandidat penghapusan.
Service yang paling sering menyala tanpa alasan di server: avahi-daemon (penemuan service jaringan untuk desktop), cups (pencetakan), dan bluetooth. Ketiganya dimatikan dengan pola yang sama — sudo systemctl disable --now avahi-daemon — yang sekaligus menghentikannya saat itu dan mencabutnya dari boot berikutnya. Service yang benar-benar tidak terpakai lebih baik dihapus dari paketnya; yang masih dipakai dikunci konfigurasinya, seperti sshd yang kita batasi root login dan passwordnya pada Chapter SSH Hardening
.
Lapisan User: sudo Terbatas dan umask #
Serangan paling murah bukan menembus kernel — melainkan meminjam kunci yang sudah terlalu banyak beredar. Keanggotaan group sudo layak diperlakukan seperti daftar tamu: setiap orang yang tercantum bisa menjadi root, jadi setiap nama harus punya alasan. Hapus keanggotaan yang usang, dan pastikan orang yang butuh hak tinggi sesekali tetap login sebagai user biasa lalu naik lewat sudo — jejaknya tercatat atas nama manusianya, materi Chapter sudo dan root
.
Sisi lain lapisan ini menyangkut file yang baru lahir. umask menentukan permission bawaan file dan direktori baru; bawaan yang umum (022) membuat file baru terbaca oleh semua user di sistem. Untuk mesin yang menyimpan data sensitif, umask 027 lebih cocok: user lain tidak bisa membaca file yang kita buat. File yang sudah ada bisa diperketat satu per satu — file berisi token, kunci, atau kredensial cukup aman di 600 — dan kebiasaan ini sudah kita latih tuntas pada Chapter umask
serta Chapter Secrets dan Credential Management
.
Kernel Parameter dengan sysctl #
Lapisan berikutnya duduk di dalam kernel. sysctl membaca dan menulis parameter kernel pada berkas /proc/sys, dan pengaturan permanen disimpan sebagai file di /etc/sysctl.d/. Tujuh baris berikut adalah inti konfigurasi hardening jaringan yang paling sering direkomendasikan:
printf '%s\n' \
'net.ipv4.ip_forward=0' \
'net.ipv4.conf.all.send_redirects=0' \
'net.ipv4.conf.all.accept_redirects=0' \
'net.ipv4.icmp_echo_ignore_broadcasts=1' \
'net.ipv4.tcp_syncookies=1' \
'kernel.kptr_restrict=2' \
'kernel.dmesg_restrict=1' \
> sysctl-hardening.conf
cat sysctl-hardening.confOutput yang Dihasilkan:
net.ipv4.ip_forward=0
net.ipv4.conf.all.send_redirects=0
net.ipv4.conf.all.accept_redirects=0
net.ipv4.icmp_echo_ignore_broadcasts=1
net.ipv4.tcp_syncookies=1
kernel.kptr_restrict=2
kernel.dmesg_restrict=1Tujuh baris itu baris per baris:
net.ipv4.ip_forward=0: kernel berhenti meneruskan paket antar-interface. Server biasa bukan router — dan nilai yang berubah sendiri menjadi1(misalnya oleh Docker) patut disadari, karena mesin kita mulai menjadi jembatan lalu lintas.net.ipv4.conf.all.send_redirects=0danaccept_redirects=0: pesan ICMP redirect adalah cara sah router mengarahkan ulang jalur, tetapi juga cara menyesatkan lalu lintas. Server yang bukan router tidak perlu mengirim maupun menurutinya.net.ipv4.icmp_echo_ignore_broadcasts=1: kernel tidak menjawab ping ke alamat broadcast — menutup pintu amplifikasi yang membuat satu paket berlipat menjadi ribuan jawaban.net.ipv4.tcp_syncookies=1: perlindungan klasik terhadap SYN flood — banjir permintaan koneksi palsu yang bertujuan menghabiskan tabel koneksi.kernel.kptr_restrict=2: alamat-alamat internal kernel disembunyikan dari user biasa — informasi yang mahal bagi penyusup yang merancang serangan memori.kernel.dmesg_restrict=1: log kernel tidak lagi terbaca oleh user biasa, karenadmesgsering membocorkan alamat perangkat dan struktur data ke sesi login biasa.
Penerapannya dua langkah: simpan sebagai /etc/sysctl.d/99-hardening.conf, lalu jalankan sudo sysctl --system untuk membaca ulang seluruh berkas konfigurasi. Satu nilai selalu bisa diperiksa tanpa root dengan sysctl net.ipv4.tcp_syncookies — pasangannya, sysctl -a, mendaftar ratusan parameter lain untuk dibaca-baca pelan-pelan.
Audit Berkala dengan Skrip Pemeriksaan #
Checklist hanya hidup bila diperiksa ulang; itulah gunanya audit berkala. Karena server kita berjalan di ruangan yang jauh, pemeriksaan terbaik dikerjakan oleh skrip yang membaca indikator-indikator kunci dan melaporkan OK atau PERIKSA. Berikut versi mininya, berjalan di atas miniatur sistem sebagai fixture:
mkdir -p sistem/etc
printf 'budi ALL=(ALL:ALL) ALL\nsiti ALL=(ALL:ALL) ALL\n' > sistem/etc/sudoers.tim
printf 'umask 022\n' > sistem/etc/profile
printf 'TOKEN_API=CONTOH_PASSWORD_KUAT\n' > sistem/etc/kunci-api.conf
printf 'PermitRootLogin no\n' > sistem/etc/sshd_config
chmod 644 sistem/etc/kunci-api.conf
periksa() {
if [ "$2" = "$3" ]; then
printf 'OK %s\n' "$1"
else
printf 'PERIKSA %s (nyata: %s, harapan: %s)\n' "$1" "$2" "$3"
fi
}
periksa 'permission kunci-api.conf' "$(stat -c %a sistem/etc/kunci-api.conf)" 600
periksa 'jumlah pemberi hak sudo' "$(grep -c 'ALL=(ALL:ALL) ALL' sistem/etc/sudoers.tim)" 1
periksa 'umask bawaan' "$(grep -o 'umask [0-9]*' sistem/etc/profile | cut -d' ' -f2)" 027
periksa 'PermitRootLogin' "$(grep -o 'PermitRootLogin .*' sistem/etc/sshd_config | cut -d' ' -f2)" noOutput yang Dihasilkan:
PERIKSA permission kunci-api.conf (nyata: 644, harapan: 600)
PERIKSA jumlah pemberi hak sudo (nyata: 2, harapan: 1)
PERIKSA umask bawaan (nyata: 022, harapan: 027)
OK PermitRootLoginMari kita bedah blok di atas:
- Baris 1-6: membangun miniatur sistem berisi empat indikator yang akan diperiksa.
chmod 644sengaja dijatuhkan pada file token — kekeliruan khas yang ingin ditangkap laporan ini. - Baris 8-14 (fungsi
periksa): menerima tiga argumen — nama pemeriksaan, nilai nyata, dan nilai harapan — lalu mencetakOKbila keduanya sama, atauPERIKSAlengkap dengan kedua nilai agar pembersihnya langsung tahu ke mana harus melihat. - Empat baris
periksa:stat -c %amembaca permission oktal sebuah file;grep -cmenghitung berapa orang yang diberi hak sudo penuh;cut -d' ' -f2mengambil nilai di balik kataumask; dan baris terakhir membaca arahan sshd yang paling kritis. - Hasilnya tiga
PERIKSAdan satuOK— keadaan yang persis seperti jumpaan dunia nyata. Setiap baris PERIKSA adalah pekerjaan lima menit:chmod 600, rapikan keanggotaan sudo, naikkan umask.
Di sistem sungguhan, indikatornya diperluas — daftar socket yang mendengarkan, service aktif, berkas sysctl kita tadi — dan skrip dijalankan berkala lewat cron atau systemd timer
, hasilnya dibandingkan dengan pemeriksaan sebelumnya. Alat audit siap pakai juga ada: Lynis memeriksa ratusan titik dan memberi skor beserta saran perbaikan, sementara OpenSCAP mengaudit sistem terhadap benchmark baku seperti CIS.
Checklist per Kategori dengan Prioritas #
Seluruh section ini akhirnya bermuara ke satu tabel yang bisa ditempel di dinding ruang server:
| Kategori | Tindakan inti | Prioritas |
|---|---|---|
| Instalasi | mulai minimal; hapus service tak terpakai (avahi, cups, bluetooth) | tinggi |
| Akses remote | SSH key, larangan root login dan password, fail2ban | tinggi |
| Jaringan | firewall default-deny, sysctl hardening | tinggi |
| Pemeliharaan | update otomatis keamanan aktif | tinggi |
| User | keanggotaan sudo terbatas, umask 027, file rahasia 600 | sedang |
| Observasi | auditd menyala, log dipantau, pemeriksaan berkala | sedang |
| Pemulihan | backup terpisah mengikuti pola 3-2-1 | tinggi |
Sebagian baris sudah kita bangun satu per satu di sepanjang section ini: unattended-upgrades menjaga pemeliharaan otomatis keamanan (Chapter Security Updates
), fail2ban mengawal pintu SSH, dan auditd mencatat gerakan di dalam kernel. Dua baris terakhir bukan pelengkap: audit memberi kita mata untuk melihat penyusup (Chapter Audit Logs
), dan backup memberi jalan pulang bila semuanya tetap jebol — strategi 3-2-1-nya kita rancang pada Chapter Backup Strategies
. Kolom prioritas bukan urutan pengerjaan yang kaku, melainkan penentu saat waktu terbatas — sistem yang baru dikerjakan setengah jam sebelum libur panjang sebaiknya mendapat baris “tinggi” lebih dulu.
Dengan checklist ini, keamanan berhenti menjadi produk sekali pasang dan menjadi kebiasaan berulang. Namun mengamankan sistem hanyalah setengah dari kehidupan seorang admin — setengah sisanya dihabiskan membaca: log, konfigurasi, dan keluaran perintah yang semuanya berwujud teks. Kecakapan mengolah teks di terminal itulah topik section berikutnya, dimulai dari perintah paling dasar dan paling sering kita pakai di Chapter cat, less, dan more .
Referensi lanjut: halaman Security di wiki Arch Linux untuk rangkuman hardening yang diperbarui komunitas, sysctl.d(5) untuk format berkas konfigurasinya, serta sysctl(8) untuk daftar lengkap opsinya.