Di Chapter ssh dan scp
kita berdiri di sisi klien: mengetuk pintu server, memasang kunci publik, lalu bekerja dari jauh. Sekarang kita pindah ke balik pintu itu: mesin kita yang menjalankan sshd, daemon yang menerima koneksi SSH dan mengelola siapa saja yang boleh masuk. Pola klien dan server inilah kerangka kerja harian seorang administrator — hampir semua pekerjaan di Section ini dimulai dari sesi ssh. Karena paket openssh-server tidak terpasang di lingkungan latihan, sesi instalasi kita lihat lewat contoh tampilan, sementara berkas konfigurasi sshd_config — inti dari chapter ini — kita bangun dan bedah sungguhan.
Memasang openssh-server #
Di keluarga Debian, daemon SSH hadir dalam paket openssh-server dan dipasang dengan sudo apt install openssh-server. Paket tersebut membawa binary /usr/sbin/sshd, unit systemd ssh.service, dan berkas konfigurasi /etc/ssh/sshd_config. Yang menarik terjadi di akhir proses instalasi: skrip paket membuat kunci host — identitas mesin yang nantinya diperiksa setiap klien. Berikut contoh tampilan bagian akhir instalasi di Debian:
Setting up openssh-server (1:9.6p1-1) ...
Creating config file /etc/ssh/sshd_config with new version
Creating SSH2 RSA key pair ... done (3072 bits)
Creating SSH2 ECDSA key pair ... done (256 bits)
Creating SSH2 ED25519 key pair ... done (256 bits)
Created symlink /etc/systemd/system/sshd.service → /usr/lib/systemd/system/ssh.service.
Processing triggers for man-db (2.11.2-2) ...Setelah proses itu selesai, ssh.service aktif dan enabled — daemon mendengarkan di port 22, siap menerima koneksi. Nama unitnya sendiri berbeda antar keluarga distro: Debian menyebutnya ssh.service, sedangkan RHEL dan Fedora menyebutnya sshd.service — systemctl status ssh di satu mesin setara dengan systemctl status sshd di mesin lain.
Kunci Host: Identitas Mesin #
Ketika klien menyambung pertama kalinya, sshd menunjukkan sidik jari (fingerprint) kunci host-nya dan meminta konfirmasi. Mekanismenya sudah kita lihat dari sisi klien; dari sisi server, fingerprint itu berasal dari pasangan kunci di direktori /etc/ssh/:
| Berkas | Peran |
|---|---|
ssh_host_ed25519_key dan .pub | pasangan kunci host algoritma Ed25519 |
ssh_host_rsa_key dan .pub | pasangan kunci host algoritma RSA |
ssh_host_ecdsa_key dan .pub | pasangan kunci host algoritma ECDSA |
Kunci privat hanya boleh dibaca oleh root, sedangkan kunci publik dikirim ke klien saat handshake. Sidik jari kunci publik inilah yang tampil pada koneksi pertama — berikut contoh tampilan sesinya dari sisi klien:
$ ssh [email protected]
The authenticity of host '192.0.2.10 (192.0.2.10)' can't be established.
ED25519 key fingerprint is SHA256:Qw9mZx7cVb2nLk4Jh8RsT1uYp3aD6fG0hJ5kE2wQ1uI.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '192.0.2.10' (ED25519) to the list of known hosts.
Setelah dijawab yes, kunci host tersimpan di ~/.ssh/known_hosts klien. Sidik jari yang berubah pada mesin yang sudah dikenal membuat ssh menolak menyambung — perilaku yang menjengkelkan bila server memang diinstal ulang, tetapi menyelamatkan kita bila ada penyusup di tengah jalan.
sshd_config: Konfigurasi Utama Daemon #
Seluruh perilaku sshd diatur dari satu berkas: /etc/ssh/sshd_config. Formatnya sederhana — satu directive per baris, keyword lalu nilai, dan baris berawalan # adalah komentar. Berkas bawaan Debian berisi ratusan baris yang hampir semuanya komentar; nilai yang dikomentari berarti “pakai bawaan”. Kita bangun versi rapian berisi directive yang paling sering disentuh admin:
cat > sshd_config <<'EOF'
# /etc/ssh/sshd_config - konfigurasi utama daemon sshd
# Baris berawalan '#' adalah komentar;
# directive yang dikomentari memakai nilai bawaan.
Port 22
#ListenAddress 0.0.0.0
#ListenAddress ::
#LoginGraceTime 2m
PermitRootLogin no
#MaxAuthTries 6
PubkeyAuthentication yes
PasswordAuthentication no
AllowUsers budi siti
EOF
cat sshd_configOutput yang Dihasilkan:
# /etc/ssh/sshd_config - konfigurasi utama daemon sshd
# Baris berawalan '#' adalah komentar;
# directive yang dikomentari memakai nilai bawaan.
Port 22
#ListenAddress 0.0.0.0
#ListenAddress ::
#LoginGraceTime 2m
PermitRootLogin no
#MaxAuthTries 6
PubkeyAuthentication yes
PasswordAuthentication no
AllowUsers budi sitiMari kita bedah directive demi directive:
Port 22: port tempat sshd mendengarkan — persis konsep port dan binding di Chapter Server Basics . Mengubahnya ke2222berarti semua klien harus menyebut-p 2222dan firewall harus membuka port itu.#ListenAddress 0.0.0.0: dikomentari, jadi sshd mendengarkan di semua alamat. MengaktifkanListenAddress 192.0.2.10membatasi daemon ke satu interface saja.PermitRootLogin no: akun root tidak boleh login langsung. Administrator masuk sebagai user biasa, lalu menaikkan hak lewatsudo— jejak siapa melakukan apa tetap tercatat.PubkeyAuthentication yes: autentikasi kunci publik diizinkan; pasangan kuncinya sudah kita tangani di Chapter ssh dan scp .PasswordAuthentication no: menebak password jadi mustahil karena password memang tidak pernah ditanyakan. Matikan opsi ini hanya setelah login ber-kunci terbukti berhasil.AllowUsers budi siti: daftar putih — user lain ditolak meskipun kredensialnya benar, dan koneksi di luar daftar tidak pernah sampai tahap autentikasi.
Dengan berkas bawaan yang penuh komentar, cara tercepat melihat pengaturan yang benar-benar aktif adalah menyaringnya. Karena setiap blok latihan di buku ini berdiri sendiri, blok berikut menulis ulang berkas yang sama lalu menyaring baris aktifnya — pola grep inilah yang menjadi refleks admin di berkas asli ratusan baris:
cat > sshd_config <<'EOF'
# /etc/ssh/sshd_config - konfigurasi utama daemon sshd
# Baris berawalan '#' adalah komentar;
# directive yang dikomentari memakai nilai bawaan.
Port 22
#ListenAddress 0.0.0.0
#ListenAddress ::
#LoginGraceTime 2m
PermitRootLogin no
#MaxAuthTries 6
PubkeyAuthentication yes
PasswordAuthentication no
AllowUsers budi siti
EOF
grep -Ev '^(#|[[:space:]]*$)' sshd_configOutput yang Dihasilkan:
Port 22
PermitRootLogin no
PubkeyAuthentication yes
PasswordAuthentication no
AllowUsers budi sitiPola ^(#|[[:space:]]*$) membuang dua kelompok baris sekaligus: yang berawalan # dan yang kosong (hanya spasi). Yang tersisa hanyalah directive aktif — lima baris yang menentukan seluruh pintu masuk mesin ini.
Menguji dan Menerapkan Perubahan #
Setelah mengedit, dua langkah menutup prosedurnya. Pertama, sshd -t menguji sintaks berkas konfigurasi tanpa menerapkannya — sshd menolak memuat berkas yang salah tulis, dan sudo sshd -t menampilkan letak kesalahan persis sebelum daemon yang sedang berjalan terganggu. Kedua, sudo systemctl reload ssh memerintahkan daemon memuat ulang konfigurasi tanpa memutus sesi yang sedang berjalan. Perubahan seperti AllowUsers berlaku untuk koneksi baru saja; sesi lama tetap hidup.
Pembatasan di sshd_config baru lapisan pertama. Daemon yang terbuka ke internet tetap dihujani percobaan login dari bot, dan menahannya butuh lapisan berikutnya — memindahkan port, MaxAuthTries, fail2ban, hingga firewall — yang kita praktikkan di Chapter SSH Hardening
. Sebelum ke sana, Section ini lebih dulu menempatkan kita di posisi admin yang membangun layanan: pintu masuk berikutnya yang akan kita pasang adalah web server. Kita mulai dari cara kerjanya di Chapter Web Server
.
Referensi lanjut: halaman manual sshd_config(5) untuk daftar directive lengkap beserta nilai bawaannya, serta situs OpenSSH untuk rilis dan catatan keamanan terbaru.