Autentikasi Kunci

ssh-keygen, authorized_keys, dan disiplin passphrase.

Daftar isi

Autentikasi kunci menggantikan kata sandi dengan sepasang kunci kriptografi, sehingga server tidak lagi menerima rahasia yang diketik, yaitu jenis rahasia yang dapat ditebak dari internet. Topik ini membahas pembuatan pasangan kunci dengan ssh-keygen, penempatan kunci publik pada berkas authorized_keys di server, alur verifikasinya, dan disiplin passphrase yang menjaga berkas kunci privat tetap terlindungi.

Kunci publik dan kunci privat#

Sepasang kunci terdiri atas kunci publik (public key) yang bebas disebar dan kunci privat (private key) yang hanya tinggal di mesin klien. Kunci publik ditempelkan pada server yang akan dimasuki, sedangkan kunci privat disimpan pada ~/.ssh/id_ed25519 dan tidak pernah dikirim ke mana pun. Apa pun yang ditandatangani kunci privat hanya dapat diverifikasi dengan kunci publik pasangannya, dan hubungan searah inilah yang membuat penyebaran kunci publik tidak berbahaya.

Algoritme yang disarankan untuk kunci baru adalah Ed25519, yaitu algoritme kunci modern dengan ukuran kunci kecil dan verifikasi yang cepat. Nama algoritmenya terlihat pada bagian awal setiap kunci publik, misalnya ssh-ed25519, sehingga pilihan ini dapat diperiksa langsung dari isi berkas .pub. OpenSSH juga masih mendukung RSA, tetapi panjang kuncinya harus 3072 bit ke atas agar keamanannya setara dengan Ed25519. Pemilihan algoritme dilakukan sekali pada saat kunci dibuat, dan kunci yang sudah ada tetap berlaku sampai diganti dengan yang baru.

Membuat pasangan kunci dengan ssh-keygen#

bash
# tidak-dijalankan
# ssh-keygen tidak terpasang di sandbox, sehingga pembuatan kunci dicoba pada mesin dengan OpenSSH
ssh-keygen -t ed25519 -C "ali@laptop"

Opsi -t menentukan algoritme kunci, sedangkan -C memberi komentar yang secara default berisi pengguna@mesin. Perintah itu menanyakan lokasi berkas, dan jawaban default ~/.ssh/id_ed25519 diterima hanya dengan menekan Enter. Apabila lokasi lain diinginkan, jalurnya ditulis sebagai jawaban, dan pasangan berkasnya tetap berdampingan pada direktori yang sama. Kunci privat ditulis tanpa akhiran, sedangkan kunci publik ditulis ke ~/.ssh/id_ed25519.pub, dan keduanya mendapat izin baku yang ketat karena kunci privat justru bagian yang harus dilindungi.

Setelah menanyakan lokasi berkas, ssh-keygen meminta passphrase. Frasa yang diketik tidak muncul di layar, sama seperti perilaku kata sandi pada login. Frasa tersebut bukan rahasia server, melainkan kunci pembuka berkas kunci privat di mesin lokal. Karena itu, passphrase yang berbeda pada setiap kunci tidak menimbulkan masalah teknis. Keluaran perintahnya menampilkan sidik jari kunci dan gambar kecil yang disebut randomart, dan keduanya berguna untuk membandingkan kunci secara kasat mata.

Menempatkan kunci publik di server#

Dari berkas ~/.ssh/authorized_keys milik pengguna tujuan, server membaca daftar kunci publik yang diizinkan masuk. Setiap baris berisi satu kunci dengan tiga bagian, yaitu nama algoritme, kunci dalam bentuk base64, dan komentar. Berkas berikut adalah contoh authorized_keys milik pengguna budi.

text authorized_keys
# kunci publik laptop Ali, algoritme ed25519
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIFlmJ7Z9DSUkVbfuDsMiYteTIdWCHkUpgoPL2TAr2k+8 ali@laptop

Baris pertama adalah komentar yang diabaikan sshd, sedangkan baris kedua adalah kuncinya. Karena setiap kunci wajib menempati satu baris penuh, berkas ini tidak boleh disunting dengan editor yang memenggal baris panjang secara otomatis. Satu berkas boleh memuat kunci dari banyak mesin sekaligus, sehingga laptop dan komputer kerja dapat masuk dengan kunci masing-masing tanpa berbagi kunci privat. Penempelan manual isi berkas .pub ke akhir authorized_keys juga sah dilakukan, selama izin berkas tetap benar.

Perintah ssh-copy-id merapikan langkah tersebut menjadi satu perintah, yaitu menyalin kunci publik yang disebut opsi -i, menempelkannya ke authorized_keys di server, lalu membetulkan izin berkasnya.

bash
# tidak-dijalankan
# ssh-copy-id memerlukan klien ssh yang tidak terpasang di sandbox
ssh-copy-id -i ~/.ssh/id_ed25519.pub [email protected]

Alur verifikasi di server#

Diagram berikut merangkum urutan pesan yang berlangsung ketika klien mencoba masuk dengan kunci.

Klien (laptop)kunci privatid_ed25519dilindungi passphrasetidak pernah dikirimServerauthorized_keysdaftar kunci publikmemverifikasi tanda tanganmembuka sesi bila cocok1. permintaan login2. tantangan, yaitu nilai acak3. tanda tangan digital4. sesi dibuka
Alur autentikasi kunci dari klien ke server

Server mengirim nilai acak sebagai tantangan (challenge), klien menandatanganinya dengan kunci privat, dan sshd memeriksa tanda tangan itu terhadap setiap kunci publik pada authorized_keys. Sesi dibuka hanya bila verifikasi lolos. Tantangan yang selalu berbeda pada setiap percobaan membuat tanda tangan lama tidak dapat diputar ulang oleh penyadap, dan inilah alasan nilainya harus acak. Kunci privat tidak pernah meninggalkan mesin klien, sehingga penyadap jaringan tidak memperoleh bahan apa pun untuk meniru klien. Perilaku ini berbeda dari autentikasi kata sandi yang mengirim rahasianya ke server untuk diperiksa, meskipun di dalam kanal terenkripsi.

sshd juga menolak membaca berkas yang izinnya terlalu longgar sebelum memeriksa isinya. Direktori ~/.ssh dibuat dengan izin 700 dan authorized_keys dengan izin 600, sehingga hanya pemiliknya yang dapat membaca dan menyunting.

Disiplin passphrase#

Passphrase melindungi kunci privat pada saat berkasnya jatuh ke tangan yang salah, misalnya lewat pencurian laptop atau kebocoran cadangan. Kunci tanpa passphrase membuat siapa pun yang memegang berkasnya dapat masuk ke semua server yang tercatat pada authorized_keys, tanpa batas waktu. Dengan passphrase, berkas kunci hanyalah benda terkunci yang isinya tidak terbaca sebelum frasanya diberikan.

Kerugian praktisnya adalah frasa perlu diketik setiap kali kunci dipakai, dan justru di titik ini banyak orang memilih kunci tanpa passphrase. Solusi resminya adalah ssh-agent, yaitu proses yang menyimpan kunci yang sudah terbuka di dalam memori selama sesi berlangsung, sehingga frasa hanya diketik satu kali.

bash
# tidak-dijalankan
# ssh-add bekerja bersama ssh-agent dan memerlukan kunci yang sudah dibuat
ssh-add ~/.ssh/id_ed25519

Kesalahan umum#

  • Melonggarkan izin ~/.ssh atau authorized_keys. sshd menolak membaca berkas semacam itu dan kunci tidak dipertimbangkan, sehingga login kunci berakhir dengan Permission denied (publickey). Perbaikannya adalah chmod 700 ~/.ssh dan chmod 600 ~/.ssh/authorized_keys.
  • Menyalin kunci privat ke server. Arah penyalinan yang benar adalah kunci publik menuju server, sedangkan kunci privat tetap di klien, dan berkas .pub adalah satu-satunya yang dibagikan.
  • Menyunting authorized_keys dengan editor yang memenggal baris. Satu kunci menempati satu baris, sehingga kunci yang terpecah menjadi dua baris tidak pernah terbaca sebagai kunci yang sah.
  • Mengira autentikasi kunci gagal berarti kuncinya salah. Penyebab lain sering lebih dahulu ditemui, misalnya izin berkas atau kepemilikan direktori home yang keliru, dan opsi -v pada ssh memperlihatkan tahap mana yang gagal.

Ringkasan#

  • ssh-keygen -t ed25519 menghasilkan pasangan kunci di ~/.ssh, dengan -C sebagai pemberi komentar dan kunci publik berakhiran .pub.
  • Kunci publik masuk ke ~/.ssh/authorized_keys di server, satu baris per kunci, dengan izin 700 pada ~/.ssh dan 600 pada berkasnya.
  • Autentikasi berjalan dengan tantangan yang ditandatangani kunci privat lalu diverifikasi server, sehingga kunci privat tidak pernah dikirim.
  • Passphrase melindungi berkas kunci privat ketika kunci tidak sedang dipakai, dan ssh-agent meniadakan keharusan mengetiknya berulang-ulang.

Referensi#