Dua chapter sebelumnya berulang kali menyebut satu benda tanpa membedahnya: kunci privat di IdentityFile. Chapter ssh dan scp memperkenalkannya sebagai pengganti password, dan chapter Remote Shell memakainya untuk membedakan mesin pribadi dari mesin kerja. Sekarang benda itu naik ke meja operasi: bagaimana pasangan kunci bekerja, bagaimana ssh-keygen membuatnya, mengapa kunci privat sebaiknya dikunci passphrase, dan bagaimana ssh-agent membuat kunci terkunci itu tetap nyaman dipakai sepanjang hari. Perintah pembuat kunci tidak tersedia di lingkungan latihan kita, jadi sesi nyatanya kita lihat lewat contoh tampilan — tetapi berkas yang menjadi muaranya, authorized_keys, kita bangun dan bedah sungguhan.

Pasangan Kunci: Menandatangani, Bukan Mengirim Rahasia #

Autentikasi kunci bekerja seperti tanda tangan, bukan seperti password. Server menyimpan hanya salinan kunci publik di ~/.ssh/authorized_keys; ketika kita menyambung, server mengirim sebuah tantangan, klien menjawabnya dengan tanda tangan matematis yang hanya bisa dibuat oleh pemegang kunci privat, dan server memverifikasi tanda tangan itu memakai kunci publik yang tersimpan. Kunci privat tidak pernah dikirim ke mana pun — bahkan ke server yang kita tuju. Bandingkan dengan password yang harus dikirim (dalam bentuk terenkripsi) setiap login: kunci privat cukup membuktikan dirinya tanpa menyerahkan dirinya.

Pasangan itu dibuat sekali dengan ssh-keygen. Algoritma yang dianjurkan hari ini adalah ed25519: kuncinya pendek (satu baris), cepat diverifikasi, dan dirancang sejak awal untuk kriptografi modern — RSA 4096 bit masih sah, tetapi barisnya panjang dan verifikasinya lebih berat. Berikut contoh tampilan pembuatan kunci di laptop Budi:

console
$ ssh-keygen -t ed25519 -C "budi@laptop-budi"
Generating public/private ed25519 key pair.
Enter file in which to save the key (/home/budi/.ssh/id_ed25519):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/budi/.ssh/id_ed25519
Your public key has been saved in /home/budi/.ssh/id_ed25519.pub
The key fingerprint is:
SHA256:F4k3F1ng3rpr1n7C0n70hXy9mBudiL4pt0p budi@laptop-budi

Dua berkas lahir dari perintah itu. Berkas id_ed25519 adalah kunci privat — inilah benda yang tidak boleh meninggalkan laptop; berkas id_ed25519.pub adalah kunci publik yang justru dibuat untuk ditempel ke server. Opsi -C "budi@laptop-budi" hanyalah komentar yang menempel di ujung kunci publik; komentar inilah yang membuat baris authorized_keys di server terbaca jelas: “ini kunci dari laptop Budi”.

authorized_keys: Format Tiga Kolom di Sisi Server #

Menanam kunci publik ke server berarti menambahkan satu baris ke berkas ~/.ssh/authorized_keys milik user tujuan — pekerjaan ssh-copy-id, atau salin-tempel manual bila perlu. Format satu barisnya: tipe kunci, spasi, isi kunci, spasi, komentar. Kita bangun berkas berisi dua kunci milik dua orang berbeda, lalu periksa isinya:

bash
mkdir -p ~/.ssh
chmod 700 ~/.ssh
printf 'ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIC0nt0hKunc1Bud1Dipersingkat budi@laptop-budi\nssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIC0nt0hKunc1Sit1Dipersingkat siti@server-ops\n' > ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
cat ~/.ssh/authorized_keys

Output yang Dihasilkan:

text
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIC0nt0hKunc1Bud1Dipersingkat budi@laptop-budi
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIC0nt0hKunc1Sit1Dipersingkat siti@server-ops

Mari kita bedah baris demi baris:

  1. Baris 1–2 (mkdir + chmod 700): folder ~/.ssh dibuat dengan permission khusus pemilik — sshd menolak memakai berkas di dalamnya bila folder bisa ditulis pihak lain.
  2. Baris 3 (printf ... >): dua baris ditulis sekaligus — satu baris per kunci, karena satu baris adalah satu identitas yang boleh masuk.
  3. Kolom pertama (ssh-ed25519): tipe algoritma kunci; ssh-rsa dan ecdsa-sha2-nistp256 adalah tetangganya yang mungkin kita temui.
  4. Kolom kedua (blok AAAA...): isi kunci publik itu sendiri, berupa data base64 — di sini dipersingkat agar muat di halaman; kunci ed25519 sungguhan masih satu baris panjang.
  5. Kolom ketiga (budi@laptop-budi): komentar tempat asal kunci; sshd mencatat komentar ini di log setiap kali kunci dipakai masuk.
  6. Baris 4 (chmod 600): berkas hanya boleh ditulis pemiliknya — permission yang longgar membuat autentikasi kunci diam-diam gagal.

Menyunting berkas ini aman dilakukan dengan awk karena kolomnya dipisah spasi. Dua pertanyaan yang paling sering muncul — “berapa kunci yang terpasang?” dan “kunci siapa saja ini?” — jawabannya satu baris:

bash
mkdir -p ~/.ssh
printf 'ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIC0nt0hKunc1Bud1Dipersingkat budi@laptop-budi\nssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIC0nt0hKunc1Sit1Dipersingkat siti@server-ops\n' > ~/.ssh/authorized_keys
awk '{printf "baris %d: tipe=%s panjang-kunci=%d komentar=%s\n", NR, $1, length($2), $3}' ~/.ssh/authorized_keys

Output yang Dihasilkan:

text
baris 1: tipe=ssh-ed25519 panjang-kunci=52 komentar=budi@laptop-budi
baris 2: tipe=ssh-ed25519 panjang-kunci=52 komentar=siti@server-ops
  1. mkdir -p ~/.ssh dan printf ... >: fixture ditulis ulang di awal blok karena setiap blok latihan berdiri sendiri.
  2. NR: nomor baris — sekaligus jumlah kunci yang terpasang, karena satu baris adalah satu kunci.
  3. length($2): panjang kolom kunci dalam karakter — cara cepat menandai baris yang rusak (terpotong saat salin-tempel) karena jauh lebih pendek dari saudaranya.
  4. $3: kolom komentar — daftar “siapa saja yang punya pintu ke akun ini”.

Passphrase: Kunci di Dalam Kunci #

Kunci privat yang baru dibuat berupa berkas biasa di disk. Passphrase mengenkripsi berkas itu, sehingga berkas yang dicuri — dari laptop hilang, dari cadangan yang bocor, dari repository yang lalai — tidak langsung bisa dipakai: pencuri masih harus menebak frasanya lebih dulu. Dengan passphrase, masuk ke server butuh dua faktor: sesuatu yang kita punya (berkas kunci) dan sesuatu yang kita tahu (frasanya). Tanpa passphrase, tersisa satu faktor saja, dan kualitasnya persis seperti password yang panjang — siapa pun yang memegang berkasnya langsung terautentikasi.

SituasiPassphraseAlasan
Kunci pribadi di laptop/workstationyalaptop bisa hilang atau dicuri; berkas bocor tidak langsung terpakai
Kunci khusus otomasi (skrip, CI)tidakskrip berjalan tanpa manusia; pembatasan dipindah ke sisi server
Kunci di hardware token (mis. YubiKey)tidak perlukunci tidak pernah keluar dari perangkatnya
Kunci sementara untuk uji cobabebascukup pastikan kunci dihapus setelah selesai

Baris kedua tabel perlu kejujuran: kunci otomasi tanpa passphrase memang lazim, tetapi keamanannya tidak lagi bergantung pada kerahasiaan berkas — praktik yang benar adalah membatasi kunci seperti itu di sisi server dengan prefiks opsi pada baris authorized_keys, misalnya command="/usr/local/bin/backup.sh" agar kunci hanya bisa menjalankan satu perintah, atau from="192.0.2.99" agar hanya diterima dari satu alamat sumber.

ssh-agent: Kunci Terbuka Hanya di Memori #

Passphrase menimbulkan gesekan baru: kunci terkunci bertanya frasanya setiap kali dipakai. ssh-agent adalah proses kecil sesi kita yang menyimpan kunci yang sudah dibuka di memori — bukan di disk — dan melayani permintaan tanda tangan dari klien ssh. Kita membuka kunci satu kali lewat ssh-add ~/.ssh/id_ed25519, dan semua koneksi berikutnya, termasuk scp, mengambil tanda tangan dari agen tersebut. Berikut contoh tampilan daftar kunci yang sedang dipegang agen:

console
$ ssh-add -l
256 SHA256:F4k3F1ng3rpr1n7C0n70hXy9mBudiL4pt0p budi@laptop-budi (ED25519)

Prinsip kerjanya bisa kita rasakan lewat simulasi yang menyimpan “kunci” dalam variabel shell — pengganti memori sang agen:

bash
kunci="RAHASIA-DEMO-budi-laptop"   # pengganti kunci privat yang tersimpan di memori agen
tandatangan() {
  printf '%s|%s' "$1" "$kunci" | sha256sum | cut -c1-16
}
echo "tanda tangan A: $(tandatangan tantangan-abc)"
kunci=""                           # agen 'melupakan' kuncinya
echo "tanda tangan B: $(tandatangan tantangan-abc)"

Output yang Dihasilkan:

text
tanda tangan A: 4bca4f9b75f7b777
tanda tangan B: 0d7fce1c70478f3d
  1. Baris 1 (kunci=...): rahasia disimpan di variabel — padanan kunci terbuka di memori agen; tidak ada berkas di disk yang berisi nilai terbuka ini.
  2. Baris 2–4 (tandatangan()): fungsi mem-hash gabungan tantangan dan rahasia — pengganti sederhana tanda tangan digital; kunci privat tidak pernah dikirim, hanya dipakai menghitung.
  3. Baris 5: tantangan yang sama berhasil ditandatangani selama rahasia masih ada di memori.
  4. Baris 6 (kunci=""): variabel dikosongkan — padanan agen dilog-out atau kunci dibuang lewat ssh-add -d.
  5. Baris 7: tantangan yang sama kini menghasilkan tanda tangan berbeda karena rahasianya hilang — bukti bahwa tanpa memori agen, berkas kunci terkunci tidak berdaya.

Agent Forwarding: Nyaman, Tetapi Menitipkan Kunci #

Satu fitur lagi yang sering muncul di obrolan admin: agent forwarding lewat ssh -A. Fitur ini membuat koneksi berikutnya dari server jauh (misalnya dari server-kantor menuju backup) tetap bisa memakai kunci yang ada di agen laptop kita — berguna untuk melompat antar mesin tanpa menyalin kunci privat ke mana-mana. Mekanismenya: sshd di mesin perantara mendapat akses ke socket agen kita, sehingga permintaan tanda tangan dari mesin perantara diteruskan ke agen di laptop.

Kunci yang baik seperti pasangan di chapter ini membuat autentikasi nyaman — tetapi pekerjaan kita di mesin jauh belum selesai dengan sekadar masuk. Selanjutnya: memindahkan berkas dua arah antar mesin, dari satu dokumen hingga pohon direktori utuh.

Referensi lanjut: ssh-keygen(1) untuk opsi pembuatan kunci dan format berkas, ssh-agent(1) untuk perilaku agen, serta OpenSSH sebagai sumber utamanya.