Linux : Praktikum Hardening SSH dan Audit Konfigurasi

Revision as of 18:20, 11 November 2026 by Maintenance script (talk | contribs) (Revisi: sudut audit server warisan + tautan artikel konsep pasangan (Page 761))
(diff) ← Older revision | Latest revision (diff) | Newer revision β†’ (diff)

Lima lapis hardening SSH sudah dipasang. Port diganti, password dimatikan, Fail2ban berjalan, dan log tampak tenang. Lalu datang pertanyaan yang jarang ditanyakan: kapan terakhir kali kamu membuktikan lapis mana yang benar-benar aktif?

Artikel ini adalah lab audit, bukan lab pemasangan. Artikel konsep Linux : SSH Hardening Lanjutan (Lima Lapis Kunci Akses) membangun lima lapis dari nol. Di sini arahnya dibalik: kamu menerima server warisan yang katanya "sudah aman", lalu membuat lembar temuan yang setiap barisnya punya bukti perintah.

🎯 Tujuan

Setelah mengikuti lab ini, kamu bisa:

  • Mengaudit konfigurasi SSH yang sudah berjalan tanpa mengubah apa pun lebih dulu.
  • Menunjuk lapis mana yang menolak sebuah login, bukan menebak.
  • Membaca konfigurasi efektif per user dengan sshd -T -C.
  • Menemukan dua jebakan paling sering: urutan Include dan Match yang bertentangan.
  • Menyusun lembar temuan berisi temuan, bukti, risiko, dan tindakan.
  • Memperbaiki temuan tanpa mengunci diri sendiri di luar server.

πŸ“ Konteks nyata

Bayangkan kamu menerima kunci gedung lab dari admin sebelumnya. Ia bilang: "pintunya sudah diganti nomornya, satpam sudah dipasang, aman."

Tugasmu bukan mempercayai kalimat itu, tetapi berkeliling: mencoba pintu, membaca daftar tamu, mengecek ruang mana yang terbuka, dan menanyakan di mana bukunya. Audit bekerja persis begitu β€” kecurigaan bukan bukti, dan ingatan bukan catatan.

  • πŸ”₯ Kasus nyata: sebuah SMK memindahkan SSH ke port 2222 dan memasang Fail2ban. Di berkas /etc/ssh/sshd_config tertulis PasswordAuthentication no, dan admin sudah memverifikasinya berkali-kali. Yang tidak dibaca: /etc/ssh/sshd_config.d/50-cloud-init.conf dari image server berisi PasswordAuthentication yes. Karena Include duduk di baris pertama, nilai itu dibaca lebih dulu dan menang. Tujuh bulan kemudian akun operator dengan sandi operator123 dipakai bergantian empat orang, dan nilai dua kelas berubah pada suatu malam.

🧠 Konsep singkat

Audit SSH berarti memeriksa lima lapis yang sama seperti artikel konsep, tetapi dengan urutan terbalik: mulai dari bukti, bukan dari niat.

Lapis Pertanyaan audit Alat bukti
1. Identitas Sandi masih diterima? passwordauthentication efektif
2. Keanggotaan Siapa yang dibatasi? allowusers, allowgroups
3. Kewenangan Boleh apa setelah masuk? permitrootlogin, disableforwarding
4. Batas Berapa lama dan berapa kali? maxauthtries, logingracetime
5. Bukti Apa yang tercatat? loglevel, auth.log

Aturan kerjanya: berhenti di lapis pertama yang gagal. Kalau login ditolak karena AllowUsers, jangan menyimpulkan "kuncinya salah" lalu membuat kunci baru.

πŸ”Ή Tiga perintah yang mirip, artinya beda

  • sshd -t β€” hanya memeriksa keabsahan berkas. Tidak mencetak apa pun kalau sehat. Ini rem darurat sebelum reload.
  • sshd -T β€” mencetak konfigurasi efektif setelah semua Include diterapkan. Inilah kebenaran yang dipakai daemon.
  • sshd -T -C user=...,addr=...,host=... β€” konfigurasi efektif untuk satu koneksi tertentu, termasuk blok Match.
  • πŸ’‘ Tips: jadikan sshd -T sebagai saksi utama. Selama audit, setiap temuan harus bisa dijawab dengan satu baris keluarannya.

πŸ”Ή Nilai pertama yang menang

sshd_config(5) menyatakan: untuk setiap kata kunci, nilai pertama yang ditemukan itulah yang dipakai. Paket Debian dan Ubuntu menaruh Include /etc/ssh/sshd_config.d/*.conf di baris paling atas, sehingga drop-in dibaca lebih dulu dan menimpa berkas utama.

  • ⚠️ Hati-hati: "sudah saya matikan di berkas utama" bukan bukti. Bukti adalah baris passwordauthentication no pada keluaran sshd -T.

πŸ”Ή Satu berkas, dua kebenaran

Match membuat blok bersyarat yang menimpa bagian global untuk user, group, atau alamat tertentu. Satu berkas konfigurasi bisa berarti dua hal berbeda untuk dua orang β€” dan hanya -C yang bisa memisahkannya.

🧩 Istilah penting

  • Konfigurasi efektif β€” hasil akhir setelah Include dan Match diterapkan; yang benar-benar dibaca sshd.
  • Drop-in β€” berkas di sshd_config.d/; nomor kecil dibaca lebih dulu, jadi lebih kuat.
  • Socket activation β€” mode di mana systemd yang memegang port lewat ssh.socket, bukan sshd.
  • Match block β€” blok bersyarat berdasarkan User, Group, Address, Host, atau LocalPort.
  • prohibit-password β€” root tidak boleh memakai password, tetapi masih boleh memakai kunci.
  • StrictModes β€” sshd memeriksa pemilik dan izin berkas kunci sebelum login diterima.
  • MaxAuthTries β€” batas percobaan autentikasi per koneksi; kegagalan mulai dicatat setelah separuh nilai.
  • MaxStartups β€” batas koneksi yang belum terautentikasi, ditulis start:rate:full.
  • DisableForwarding β€” mematikan semua penerusan port, tunnel, dan agent dalam satu saklar.
  • auth.log β€” berkas jejak autentikasi di Debian/Ubuntu, biasanya milik syslog:adm.

πŸ”§ Praktik: audit server warisan tanpa mengunci diri

Semua pengujian dilakukan pada salinan konfigurasi di /tmp/ssh-audit dan instance kedua di port 2222. Layanan asli tidak disentuh sampai kamu yakin.

  • ⚠️ Hati-hati: buka dua sesi sebelum mulai β€” satu untuk bekerja, satu dibiarkan terbuka sebagai jalan pulang. Audit yang mengunci diri sendiri bukan audit, itu insiden.

πŸ”Ή Langkah 1 β€” potret dan simpan sebagai pembanding

sudo sshd -T | sort > /tmp/audit-awal.txt
sudo sshd -T | grep -Ei '^(port|permitrootlogin|passwordauthentication|pubkeyauthentication|kbdinteractive|allowusers|allowgroups|maxauthtries|logingracetime|loglevel|disableforwarding)'
ss -tlnp | grep -i ssh
systemctl is-enabled ssh ssh.socket 2>&1
  1. Catat juga unit yang aktif. Di Ubuntu 24.04, ssh.socket bisa ikut aktif dan memegang port sendiri.
  • πŸ“Š Angka penting: saat ssh.socket aktif, systemd yang membuka port. Mengubah Port di sshd_config tidak memindahkan pintu, karena yang mendengarkan bukan sshd.

πŸ”Ή Langkah 2 β€” petakan berkas yang benar-benar dibaca

  1. Lihat urutan Include dan isi folder drop-in. Ini peta sumber konflik.
sudo grep -n '^Include' /etc/ssh/sshd_config
sudo ls -1 /etc/ssh/sshd_config.d/ 2>/dev/null
sudo grep -Hn -Ei 'password|permitrootlogin|allowusers|maxauthtries' /etc/ssh/sshd_config /etc/ssh/sshd_config.d/*.conf 2>/dev/null
  1. Bandingkan jumlah baris konfigurasi efektif dengan jumlah baris yang kamu baca. Selisihnya berasal dari bawaan dan drop-in.
sudo sshd -T | wc -l
  • πŸ§ͺ Uji cepat: sudo sshd -T | grep -c . memberi jumlah baris efektif. Kalau kamu baru mengubah satu baris tetapi angka ini tidak berubah, perubahanmu tidak terbaca.

πŸ”Ή Langkah 3 β€” lapis 1: apakah sandi masih diterima

sudo sshd -T | grep -Ei '^(passwordauthentication|kbdinteractiveauthentication|pubkeyauthentication|permitemptypasswords)'
  1. Cari akun yang masih punya sandi aktif. Ini daftar calon pintu masuk kalau lapis 1 jebol.
sudo passwd -S -a | awk '$2=="P" {print $1, $2}'
  1. Inventaris kunci yang tertanam: siapa pun yang punya baris di sini bisa masuk tanpa sandi.
sudo find /home /root -maxdepth 3 -name authorized_keys -printf '%p %TY-%Tm-%Td\n' 2>/dev/null
  1. Hasil yang diharapkan: tiga daftar yang bisa kamu tunjuk β€” status sandi, nilai efektif, dan kunci yang ada.

πŸ”Ή Langkah 4 β€” lapis 2: siapa yang dibatasi

sudo sshd -T | grep -Ei '^(allowusers|allowgroups|denyusers|denygroups)' || echo "KOSONG: semua akun boleh masuk"
  1. Keluaran kosong adalah temuan, bukan hasil netral. Artinya tidak ada daftar tamu sama sekali.
sudo sshd -T -C user=nobody,addr=192.168.100.10,host=admin-pc | grep -Ei '^(allowusers|allowgroups|passwordauthentication)'
  1. Hasil yang diharapkan: nilai yang sama persis untuk user yang tidak berhak β€” bukti bahwa lapis 2 belum bekerja.

πŸ”Ή Langkah 5 β€” lapis 3: kewenangan setelah masuk

sudo sshd -T | grep -Ei '^(permitrootlogin|disableforwarding|x11forwarding|allowtcpforwarding|permittunnel|allowagentforwarding)'
  1. Periksa pengecualian per user. Inilah tempat Match biasanya menyimpan kejutan.
sudo sshd -T -C user=guru1,addr=192.168.100.20,host=laptop-guru | grep -Ei '^(forcecommand|chrootdirectory|permittty|allowtcpforwarding|disableforwarding)'
  1. Uji nyata: coba buka tunnel ke port lokal. Kalau DisableForwarding yes bekerja, permintaan ditolak.
ssh -p 2222 -N -L 8080:127.0.0.1:80 lab@127.0.0.1
# channel 2: open failed: administratively prohibited: open failed
  • πŸ’‘ Tips: pesan administratively prohibited adalah bukti lapis 3 yang bekerja. Kalau tunnel justru terbuka, temuanmu berbunyi "kewenangan terlalu luas" β€” bukan "jaringan bermasalah".

πŸ”Ή Langkah 6 β€” lapis 4: batas percobaan dan waktu

sudo sshd -T | grep -Ei '^(maxauthtries|logingracetime|maxstartups|clientaliveinterval)'
sudo command -v fail2ban-client && sudo fail2ban-client status sshd
  1. Baca angkanya, bukan status layanannya. Fail2ban yang aktif tetap tidak menolong kalau MaxAuthTries dibiarkan besar dan sandi masih diterima.
  • πŸ“Š Angka penting: bawaan MaxAuthTries 6, LoginGraceTime 120 detik, MaxStartups 10:30:100, ClientAliveInterval 0. Kegagalan autentikasi mulai dicatat setelah mencapai separuh MaxAuthTries.

πŸ”Ή Langkah 7 β€” lapis 5: bukti yang tersedia

sudo sshd -T | grep -i '^loglevel'
ls -l /var/log/auth.log 2>/dev/null
sudo journalctl --disk-usage
sudo lastb -n 5
  1. Hitung bukti yang benar-benar ada, bukan yang seharusnya ada.
sudo grep -c 'Accepted publickey' /var/log/auth.log
sudo grep -c 'Failed password' /var/log/auth.log
  1. Hasil yang diharapkan: dua angka. Kalau keduanya nol padahal server menghadap internet, curigai LogLevel atau lokasi log, bukan "tidak ada serangan".

πŸ”Ή Langkah 8 β€” susun lembar temuan

Inilah keluaran utama audit. Setiap baris harus bisa dipertahankan dengan perintah, bukan pendapat.

Temuan Bukti Risiko Tindakan
Sandi masih diterima passwordauthentication yes tebakan sandi berhasil matikan, sisakan kunci
Tanpa daftar tamu allowusers kosong akun lama ikut masuk AllowGroups
Root boleh dengan kunci permitrootlogin without-password kunci lama tak tercabut no + akun sudo
Forwarding terbuka allowtcpforwarding yes server jadi jalan pintas DisableForwarding yes
Port tidak berlaku ssh.socket aktif perubahan port sia-sia ubah di unit socket
Log minim loglevel INFO sidik jari kunci tak tercatat LogLevel VERBOSE
  1. Beri urutan prioritas: lapis 1 dan 2 dulu, karena keduanya menentukan siapa yang boleh masuk.

πŸ”Ή Langkah 9 β€” dua jebakan yang membatalkan temuanmu

  1. Jebakan urutan Include. Buat salinan konfigurasi di /tmp agar produksi aman, lalu buat dua berkas yang bertentangan.
sudo mkdir -p /tmp/ssh-audit/sshd_config.d
sudo tee /tmp/ssh-audit/sshd_config > /dev/null <<'EOF'
Include /tmp/ssh-audit/sshd_config.d/*.conf
Port 2222
PidFile /tmp/ssh-audit/sshd.pid
HostKey /etc/ssh/ssh_host_ed25519_key
PasswordAuthentication no
EOF
sudo tee /tmp/ssh-audit/sshd_config.d/99-warisan.conf > /dev/null <<'EOF'
PasswordAuthentication yes
EOF
sudo sshd -T -f /tmp/ssh-audit/sshd_config | grep -i passwordauth
  1. Hasil yang diharapkan: passwordauthentication yes. Berkas utama menulis no, tetapi drop-in dibaca lebih dulu. Inilah bentuk persis kegagalan yang tidak terlihat saat membaca berkas utama.
  2. Jebakan Match. Tambahkan pengecualian untuk satu user, lalu tanyakan dua kali dengan user berbeda.
sudo tee /tmp/ssh-audit/sshd_config.d/20-pengecualian.conf > /dev/null <<'EOF'
Match User lab
    PasswordAuthentication yes
    AllowTcpForwarding yes
EOF
sudo sshd -T -f /tmp/ssh-audit/sshd_config -C user=lab,addr=192.168.100.30,host=pc-lab | grep -Ei 'passwordauth|allowtcpforwarding'
sudo sshd -T -f /tmp/ssh-audit/sshd_config -C user=tamu,addr=192.168.100.30,host=pc-lab | grep -Ei 'passwordauth|allowtcpforwarding'
  1. Hasil yang diharapkan: dua jawaban berbeda untuk berkas yang sama. Audit tanpa -C akan melaporkan satu kebenaran saja.
  2. Konfigurasi rusak. Buktikan bahwa rem darurat bekerja sebelum menyentuh layanan asli.
sudo sh -c 'echo PasswordAuthenticaion no >> /tmp/ssh-audit/sshd_config'
sudo sshd -t -f /tmp/ssh-audit/sshd_config; echo "kode keluar: $?"
  1. Hasil yang diharapkan: Bad configuration option: passwordauthenticaion dan kode keluar bukan nol.

πŸ”Ή Langkah 10 β€” perbaiki, lalu audit ulang

  1. Perbaikan ditaruh di drop-in bernomor kecil supaya menang atas berkas bawaan. Nama berkas adalah bagian dari strategi, bukan hiasan.
sudo tee /etc/ssh/sshd_config.d/10-hardening.conf > /dev/null <<'EOF'
PubkeyAuthentication yes
PasswordAuthentication no
KbdInteractiveAuthentication no
PermitEmptyPasswords no
PermitRootLogin no
AllowGroups ssh-users
MaxAuthTries 3
LoginGraceTime 30
LogLevel VERBOSE
EOF
sudo sshd -t && echo "konfigurasi sah"
  1. Reload, lalu bandingkan potret lama dengan yang baru. Perbedaan itulah bukti pekerjaanmu.
sudo systemctl reload ssh
sudo sshd -T | sort > /tmp/audit-akhir.txt
diff /tmp/audit-awal.txt /tmp/audit-akhir.txt
  1. Verifikasi hasil akhir dengan pertanyaan yang sama seperti awal audit: sandi, daftar tamu, kewenangan, batas, bukti.
sudo sshd -T | grep -Ei '^(passwordauthentication|permitrootlogin|allowgroups|maxauthtries|loglevel)'
sudo sshd -T -C user=tamu,addr=192.168.100.10,host=admin-pc | grep -Ei '^(allowgroups|passwordauthentication)'
  1. Bersih-bersih bahan audit.
sudo rm -rf /tmp/ssh-audit
  • ⚠️ Hati-hati: systemctl reload ssh pada konfigurasi rusak bisa membuat layanan berhenti dan port tertutup. Selalu sshd -t lebih dulu, dan pastikan sesi kedua masih terbuka.

🏭 Dipakai di dunia kerja

  • Sekolah: server CBT dan e-rapor sering diwarisi dari tahun sebelumnya. Audit lima lapis menghasilkan daftar akun dan kunci yang bisa dicabut sebelum tahun ajaran baru, tanpa menebak siapa masih aktif.
  • Kantor distributor: audit dilakukan sebelum akses vendor diperpanjang. Temuan "sandi masih diterima" dan "root boleh dengan kunci" biasanya cukup untuk menolak perpanjangan sampai diperbaiki.
  • Klinik dan layanan data pribadi: auditor eksternal tidak menerima jawaban "sudah kami amankan". Mereka meminta keluaran konfigurasi efektif dan daftar akun yang boleh masuk.
  • Hosting dan VPS: pemilik layanan perlu tahu apakah image yang dipakai meninggalkan drop-in bawaan yang menimpa hardening mereka. Audit berkas drop-in adalah langkah pertama.
  • ISP dan warnet: perangkat dikelola dari jarak jauh; audit memastikan tidak ada akun bersama yang masih memakai sandi default setelah pergantian teknisi.
  • Industri: perubahan konfigurasi di jaringan operasi harus bisa dipertanggungjawabkan. Lembar temuan bercap waktu lebih berguna daripada ingatan teknisi.

βœ… Verifikasi

Pemeriksaan Perintah Bukti lulus
Konfigurasi sah sshd -t kode keluar 0, tanpa pesan
Sandi mati sshd -T passwordauthentication no
Daftar tamu ada sshd -T allowgroups terisi
Root tertutup sshd -T -C user=root,... permitrootlogin no
Pengecualian terbatas -C user=lab vs user=tamu dua nilai berbeda, sesuai rencana
Tunnel ditolak ssh -L administratively prohibited
Batas aktif sshd -T maxauthtries 3
Bukti tersedia grep -c 'Accepted publickey' angka bukan nol
Port sesuai ss -tlnp port yang direncanakan, bukan bawaan

Kalau satu baris gagal, jangan menutup audit. Tulis sebagai temuan terbuka dengan bukti perintahnya.

⚠️ Kesalahan umum & troubleshooting

Pesan atau gejala Artinya Tindakan
Connection refused tidak ada daemon di port itu ss -tlnp, cek unit dan firewall
Port tidak berubah walau Port diedit ssh.socket memegang port ubah ListenStream di unit socket
Permission denied (publickey) kunci tidak cocok atau ditolak lapis 2 ssh -vvv, cek AllowGroups
Permission denied (publickey,password) sandi masih ditawarkan tetapi gagal cek sshd -T -C
bad ownership or modes for directory StrictModes menolak izin home chmod 750, chown user:user
administratively prohibited forwarding dimatikan ini hasil yang diharapkan saat audit
Too many authentication failures MaxAuthTries habis pakai -o IdentitiesOnly=yes
Bad configuration option: ... salah ketik kata kunci sshd -t lalu perbaiki
Log kosong padahal ada percobaan salah lokasi log atau level rendah cek LogLevel, rsyslog, journal
Perubahan hilang setelah reboot drop-in tidak terbaca atau unit menimpa cek urutan nama berkas dan unit aktif
  • πŸ’‘ Tips: saat men-debug klien, pakai ssh -v (cukup) atau -vvv (detail). Di sisi server, LogLevel VERBOSE mencatat sidik jari kunci tanpa membocorkan isi sesi; kembalikan ke INFO setelah audit selesai.

πŸ” Catatan keamanan & etika

  • Audit dulu, ubah kemudian. Perintah baca tidak mengubah apa pun; setiap perubahan konfigurasi butuh sesi cadangan dan snapshot.
  • Jangan mencetak isi berkas rahasia. /etc/shadow dan kunci privat tidak perlu dibaca untuk audit; cukup status dan nama berkasnya.
  • Hasil audit adalah data pribadi. Daftar akun, kunci, dan alamat IP adalah informasi sensitif. Simpan di tempat terbatas, jangan di grup chat.
  • LogLevel DEBUG bukan alat permanen. Manpage sshd_config(5) menyebut level DEBUG melanggar privasi pengguna.
  • Cabut akses dengan mencabut kunci. Mengganti sandi tidak menyentuh authorized_keys yang sudah tertanam.
  • Etika: audit hanya pada server milik sendiri atau yang kamu diberi izin tertulis. Memindai server orang lain adalah pelanggaran hukum.

πŸ“Œ Kesimpulan

Audit hardening SSH bukan membaca berkas dengan teliti, tetapi menunjuk bukti: nilai efektif, user yang terkena, dan pesan penolakan yang muncul.

Dua perintah menjadi tulang punggungnya: sshd -T untuk kebenaran umum, dan sshd -T -C untuk kebenaran per user. Selama keduanya belum dijalankan, "sudah diamankan" masih sekadar kalimat.

Langkah berikutnya: ambil satu server warisan di labmu, jalankan Langkah 1 sampai 8 tanpa mengubah apa pun, lalu presentasikan lembarnya ke teman satu kelompok untuk diuji balik.

πŸ”— Materi terkait

πŸ“š Referensi