Pengerasan SSH

Menonaktifkan login root, membatasi autentikasi ke kunci, dan kesadaran fail2ban.

Daftar isi

Server yang baru tersambung ke internet menerima upaya login otomatis dalam hitungan menit, dan sshd menjadi salah satu sasaran yang paling sering dicoba. Topik ini membahas pengerasan (hardening) sshd, yaitu pengetatan konfigurasi server SSH untuk mengurangi permukaan serangannya: login root dinonaktifkan, autentikasi dibatasi ke kunci, dan upaya login berulang dihadapi dengan fail2ban. Setelah membacanya, berkas konfigurasi sshd yang dikeraskan dapat disusun lengkap dengan pemahaman atas arti setiap arahannya.

Mengapa sshd menjadi pintu utama#

sshd (Secure Shell daemon) adalah layanan yang menerima koneksi SSH pada server dan berjalan sepanjang waktu. Karena portnya dikenal luas, pemindai otomatis mencoba kombinasi nama pengguna dan kata sandi secara terus-menerus terhadap setiap server yang ditemukannya. Pada banyak distribusi, login root dengan kata sandi memang sudah dibatasi sejak bawaan, tetapi autentikasi kata sandi untuk pengguna biasa umumnya masih terbuka, dan itulah celah yang diincar percobaan login otomatis tersebut.

Pengerasan sshd bekerja sebagai lapisan pertama dari beberapa lapisan. Firewall pada modul jaringan mengatur siapa yang boleh menghubungi port, autentikasi kunci menutup jalur tebakan kata sandi, dan fail2ban menutup akses sementara bagi alamat yang berulang kali gagal. Sebelum menyentuh konfigurasi, permukaan layanan diperiksa terlebih dahulu dengan melihat port yang mendengarkan. Perintah berikut menyaring daftar listener hanya untuk port 22.

bash
# memeriksa apakah ada layanan yang mendengarkan pada port 22
ss -tln sport = :22
text Keluaran
State Recv-Q Send-Q Local Address:Port Peer Address:Port

Pada sandbox latihan ini sshd tidak terpasang, sehingga keluarannya hanya baris kepala tabel tanpa satu pun listener. Pada server sungguhan, baris LISTEN untuk port 22 akan tampak di posisi yang sama, dan baris itulah titik masuk yang permukaannya hendak diperkecil.

Berkas konfigurasi sshd yang dikeraskan#

Konfigurasi sshd terpusat pada berkas /etc/ssh/sshd_config dengan format satu arahan per baris berupa Arahan nilai. Ubuntu dan Debian memuat baris Include /etc/ssh/sshd_config.d/*.conf pada berkas tersebut, sehingga potongan konfigurasi dari paket lain dapat mengubah perilaku efektif. Karena itu, direktori tersebut perlu diperiksa dahulu sebelum menyimpulkan konfigurasi yang benar-benar berlaku di sebuah server. Berkas berikut merupakan contoh konfigurasi yang dikeraskan untuk server latihan, lengkap dengan komentar pengelompokannya.

text sshd_config.keras
# Contoh sshd_config yang dikeraskan untuk server latihan.
# Terapkan dengan menyalin isinya ke /etc/ssh/sshd_config.

Port 22
AddressFamily any
ListenAddress 0.0.0.0

# Autentikasi hanya melalui kunci
PermitRootLogin no
PubkeyAuthentication yes
PasswordAuthentication no
KbdInteractiveAuthentication no
AuthenticationMethods publickey
PermitEmptyPasswords no
MaxAuthTries 3
LoginGraceTime 30

# Pembatasan siapa yang boleh masuk
AllowUsers budi

# Fitur yang tidak dipakai dimatikan
X11Forwarding no
ClientAliveInterval 300
ClientAliveCountMax 2

Subsystem sftp internal-sftp

Arti setiap arahan pada kelompok autentikasi dirangkum dalam tabel berikut.

ArahanArtinya
PermitRootLogin noakun root tidak dapat login lewat SSH sama sekali, sehingga penyerang harus menembus dua lapis, yaitu akun biasa dan eskalasi lokal
PubkeyAuthentication yesautentikasi kunci publik diaktifkan sebagai metode utama
PasswordAuthentication nokata sandi ditolak, sehingga tebakan otomatis kehabisan sasaran
KbdInteractiveAuthentication nomekanisme tanya-jawab interaktif di luar kunci ikut ditutup
AuthenticationMethods publickeymembatasi metode autentikasi yang harus diselesaikan menjadi kunci publik saja
PermitEmptyPasswords nokata sandi kosong ditolak sebagai pertahanan berlapis
MaxAuthTries 3koneksi diputus setelah tiga upaya autentikasi gagal
LoginGraceTime 30waktu menyelesaikan login dibatasi 30 detik

Arahan pada kelompok berikutnya mengatur siapa yang boleh masuk dan fitur apa yang tersedia. AllowUsers budi membuat daftar putih (allowlist): selain pengguna yang disebut, semua upaya login ditolak sebelum autentikasi dihitung. X11Forwarding no mematikan penerusan aplikasi grafis yang tidak dipakai di server, sedangkan pasangan ClientAliveInterval 300 dan ClientAliveCountMax 2 menutup sesi yang tidak merespons setelah sekitar sepuluh menit agar sesi terbuka tidak menumpuk. Tiga arahan pembuka menetapkan alamat mendengarkan sebagaimana bawaan, yaitu Port 22 pada semua antarmuka, sehingga pengerasan ini berfokus pada autentikasi dan bukan pada perpindahan port. Terakhir, Subsystem sftp internal-sftp menyediakan transfer berkas SFTP langsung dari proses sshd tanpa biner tambahan.

Penerapan berkas tersebut mengikuti prosedur yang selalu sama, yaitu cadangkan, sunting, periksa sintaks, baru muat ulang. Perintah-perintahnya memerlukan hak root sehingga tidak dapat dieksekusi di sandbox.

bash
# tidak-dijalankan
# sshd tidak terpasang di sandbox dan penyuntingan berkas sistem memerlukan root
# cadangkan konfigurasi lama terlebih dahulu
sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
# salin berkas yang dikeraskan lalu sesuaikan daftar AllowUsers
sudo cp sshd_config.keras /etc/ssh/sshd_config
# periksa sintaks sebelum memuat ulang
sudo sshd -t
# muat ulang layanan agar konfigurasi baru berlaku
sudo systemctl restart ssh

Membatasi autentikasi ke kunci#

Autentikasi kunci bekerja berdasarkan pasangan kunci: klien membuktikan kepemilikan kunci privat, sedangkan server memeriksa tanda tangannya terhadap kunci publik yang terdaftar pada berkas ~/.ssh/authorized_keys di akun tujuan. Mekanisme pendaftarannya dibahas pada topik autentikasi kunci di modul SSH. Di sini fokusnya adalah konsekuensi konfigurasinya: begitu PasswordAuthentication no berlaku, kekuatan autentikasi bergantung sepenuhnya pada kunci. Tebakan otomatis tidak lagi berhadapan dengan kata sandi yang mungkin lemah, melainkan dengan kunci yang tidak mungkin ditebak dalam waktu singkat.

Peralihan dari kata sandi ke kunci tidak boleh dibalik urutannya. Kunci publik dipasang dan login dengan kunci diuji terlebih dahulu, baru kemudian kata sandi dinonaktifkan dan sshd dimuat ulang. Apabila urutannya terbalik dan kunci ternyata belum terpasang dengan benar, satu-satunya jalan masuk adalah konsol luar seperti konsol web yang disediakan penyedia VPS. Kombinasi MaxAuthTries 3 dan LoginGraceTime 30 bekerja pada lapisan yang sama, yaitu memangkas jumlah tebakan sekaligus waktu yang tersedia bagi setiap koneksi. Setelah konfigurasi baru berlaku, percobaan login dengan kata sandi akan ditolak, dan pesan penolakannya dapat diverifikasi dari mesin klien sebagai tanda bahwa pengerasan sudah aktif.

Kesadaran fail2ban#

fail2ban menambah lapisan kedua yang bekerja setelah upaya login terjadi. Layanan ini membaca berkas log autentikasi seperti /var/log/auth.log, lalu mencari baris kegagalan melalui filter, yaitu pola yang mengenali bentuk kegagalan pada log. Setiap filter dipasangkan dengan tindakan pemblokiran melalui jail, yaitu aturan yang menghubungkan keduanya. Apabila satu alamat gagal login melebihi maxretry dalam jangka waktu findtime, alamat tersebut diblokir firewall selama bantime. Bagi server latihan, jail berikut sudah memadai sebagai titik awal.

ini Contoh: jail sshd pada /etc/fail2ban/jail.local
[sshd]
enabled = true
port = ssh
maxretry = 5
findtime = 10m
bantime = 1h

Pemasangannya pada server memerlukan hak root dan tidak dapat dieksekusi di sandbox.

bash
# tidak-dijalankan
# fail2ban tidak terpasang di sandbox dan instalasi paket memerlukan root
sudo apt install fail2ban
# layanan diaktifkan agar berjalan sejak boot
sudo systemctl enable --now fail2ban
# memeriksa jail sshd beserta daftar alamat yang sedang diblokir
sudo fail2ban-client status sshd

fail2ban bukan pengganti autentikasi kunci. Dengan PasswordAuthentication no, serangan tebakan kata sandi kehilangan sasarannya sejak awal, sedangkan fail2ban meredam kebisingan log dan tetap berguna bagi layanan lain yang memang masih menerima kata sandi. Pemblokiran berbasis log juga memiliki batasnya, karena upaya yang disebarkan ke banyak alamat dengan tempo lambat tidak pernah melampaui ambang maxretry pada satu alamat pun.

Kesalahan umum#

Kesalahan yang sering terjadi saat menerapkan topik ini beserta jalan keluarnya adalah sebagai berikut.

  • sshd menolak berjalan setelah konfigurasi disunting. Penyebabnya biasanya salah ketik nama arahan atau nilainya, dan sudo sshd -t akan menampilkan nomor barisnya. Karena sesi yang sudah terbuka tidak diputus oleh kegagalan start, kesalahan tersebut dapat diperbaiki tanpa kehilangan akses.
  • Login terkunci setelah kata sandi dinonaktifkan. Kunci publik ternyata belum terpasang dengan benar di ~/.ssh/authorized_keys, sehingga satu-satunya jalan keluar adalah konsol luar yang disediakan penyedia server untuk menyalin kunci.
  • fail2ban tampak tidak melakukan pemblokiran apa pun. Jail yang dimaksud belum aktif atau namanya tidak cocok, dan sudo fail2ban-client status menampilkan daftar jail yang benar-benar berjalan beserta hitungan kegagalannya. Berkas /var/log/fail2ban.log melengkapi gambaran saat jail berjalan tetapi hitungannya tetap nol.
  • Konfigurasi baru tidak terasa efeknya. Direktori /etc/ssh/sshd_config.d/ memuat potongan dari paket lain yang dibaca lebih dulu oleh sshd, sehingga arahan ganda perlu dicari di sana ketika perubahan tidak berlaku.

Ringkasan#

  • Pengerasan sshd menutup jalur masuk yang paling sering diserang: root tidak dapat login, kata sandi ditolak, dan hanya kunci publik yang diterima.
  • Berkas sshd_config.keras memuat arahan inti seperti PermitRootLogin no, PasswordAuthentication no, dan AllowUsers, yang diterapkan setelah divalidasi dengan sudo sshd -t.
  • fail2ban menambah lapisan kedua berupa pemblokiran sementara bagi alamat yang berulang kali gagal login, tetapi bukan pengganti autentikasi kunci.
  • Pemeriksaan ss -tln sport = :22 menunjukkan apa yang benar-benar terekspos di server sebelum dan sesudah pengerasan.

Referensi#