ssh

Eksekusi jarak jauh dengan ssh, autentikasi kunci publik, dan berkas konfigurasi ~/.ssh/config.

Daftar isi

Topik ini membahas ssh, yaitu klien untuk masuk ke host jarak jauh dan menjalankan perintah melalui koneksi terenkripsi. Bahasan mencakup pola eksekusi perintah jarak jauh, mekanisme autentikasi kunci publik, dan berkas konfigurasi ~/.ssh/config yang meringkas panggilan berulang. ssh hadir di hampir semua server, runner CI, dan container Linux, sehingga pola-pola ini dapat dipakai di lingkungan mana pun. Setelah membacanya, pekerjaan pada server dapat dipicu dari terminal lokal melalui satu alias pendek tanpa mengetik kata sandi pada setiap koneksi.

Menjalankan perintah di host jarak jauh#

Dalam bentuk paling sederhana, ssh pengguna@hostname membuka sesi login interaktif pada host tujuan. Apabila perintah disertakan sebagai argumen terakhir, ssh menjalankan perintah itu di host jarak jauh, mengalirkan keluarannya ke terminal lokal, dan kembali segera setelah perintah selesai. Kode keluar perintah jarak jauh menjadi kode keluar ssh, sehingga pola ini dapat disisipkan ke dalam skrip dengan pemeriksaan kode keluar seperti biasa.

Perintah jarak jauh dieksekusi oleh shell login pengguna pada host tersebut, bukan oleh shell lokal. Tanda kutip tunggal menjaga agar variabel seperti $HOME diperluas di sisi jarak jauh, bukan di komputer lokal sebelum perintah dikirim. Contoh berikut tidak dapat dieksekusi di sandbox karena memerlukan host yang benar-benar hidup.

bash
# tidak-dijalankan
# ssh memerlukan host jarak jauh yang hidup sehingga tidak dapat dieksekusi di sandbox
ssh [email protected] 'uptime && df -h /'

Selain perintah tunggal, masukan lokal dapat dialirkan ke perintah jarak jauh melalui pipe, misalnya cat laporan.csv | ssh [email protected] 'cat > laporan.csv' untuk menyalin satu berkas. Pola yang sama berlaku untuk aliran arsip tar antarmesin. Apabila transfer berkas yang teratur menjadi kebutuhan utama, scp dan sftp menyediakan antarmuka yang lebih khusus dengan autentikasi yang sama.

Autentikasi kunci publik#

Secara bawaan ssh meminta kata sandi pada setiap koneksi. Kata sandi dikirim melalui koneksi yang sudah terenkripsi, tetapi pengetikan berulang menghambat skrip otomatis dan menambah risiko kata sandi tercatat di log. Alternatifnya adalah autentikasi kunci publik (public key authentication), yaitu metode yang memakai sepasang kunci kriptografi. Kunci privat (private key) dijaga di komputer lokal, sedangkan kunci publik (public key) diletakkan di server.

Di server, kunci publik pengguna tersimpan sebagai baris dalam berkas ~/.ssh/authorized_keys. Saat koneksi dibuat, server mengirim tantangan (challenge) yang hanya dapat dijawab dengan menandatanganinya menggunakan kunci privat. Server memverifikasi tanda tangan itu dengan kunci publik yang tersimpan, lalu meloloskan koneksi bila cocok. Mekanisme ini membuktikan kepemilikan kunci tanpa pernah mengirim kunci privat melewati jaringan.

Kunci privat biasanya diberi passphrase, yaitu kata sandi tersendiri yang melindungi berkas kuncinya, sehingga kunci yang tercuri tetap tidak terpakai. Untuk tidak mengetik passphrase pada setiap koneksi, ssh-agent menyimpan kunci yang passphrase-nya sudah diketik dalam memori selama sesi berlangsung. Agent ini umum dijalankan otomatis oleh lingkungan desktop dan dijalankan secara manual pada sesi terminal.

Membuat pasangan kunci dengan ssh-keygen#

Pasangan kunci dibuat dengan ssh-keygen, yaitu utilitas yang menghasilkan kunci, mengatur tipenya, dan mengubah passphrase-nya. Tipe ed25519 menjadi pilihan modern karena kuncinya pendek dan cepat, sedangkan rsa dengan panjang 4096 bit masih umum ditemui pada sistem lama. Contoh berikut tidak dapat dieksekusi di sandbox karena ssh-keygen tidak tersedia.

bash
# tidak-dijalankan
# membuat pasangan kunci bertipe ed25519, tipe kunci modern yang ringkas
ssh-keygen -t ed25519 -C "budi laptop kerja"

Perintah di atas menghasilkan dua berkas di ~/.ssh, yaitu id_ed25519 untuk kunci privat dan id_ed25519.pub untuk kunci publik. Kunci publik kemudian disalin sebagai satu baris ke ~/.ssh/authorized_keys di server, misalnya lewat perintah ssh-copy-id [email protected] yang menangani penyalinan dan izinnya sekaligus. Setelah langkah ini, koneksi dari pengguna yang sama tidak lagi meminta kata sandi akun.

Izin berkas menjadi bagian dari keamanannya. Berkas kunci privat sebaiknya diberi izin 600, sedangkan direktori ~/.ssh dan authorized_keys tidak boleh ditulis oleh pengguna lain. ssh menolak memakai kunci privat yang izinnya terlalu longgar, dan perilaku ini dibahas kembali pada bagian Kesalahan umum.

Berkas konfigurasi ~/.ssh/config#

Koneksi berulang dengan opsi panjang dapat diringkas lewat berkas konfigurasi per pengguna di ~/.ssh/config. ssh membaca berkas ini sebelum menghubungi host, mengambil nilai dari blok Host yang cocok, lalu menerapkannya seolah-olah diketik di baris perintah. Nilai pertama yang diperoleh untuk suatu opsi menang, sehingga blok yang paling spesifik ditulis sebelum blok umum.

DirektifIsiContoh
Hostpola alias yang dicocokkanlab
HostNamehostname tujuan yang sebenarnya192.168.10.20
Usernama pengguna di serverbudi
Portport server, bawaannya 222222
IdentityFileberkas kunci privat yang dipakai~/.ssh/id_ed25519
text Contoh: berkas ~/.ssh/config
Host lab
    HostName 192.168.10.20
    User budi
    Port 22
    IdentityFile ~/.ssh/id_ed25519

Dengan konfigurasi di atas, perintah ssh lab setara dengan ssh [email protected] -i ~/.ssh/id_ed25519. Alias yang sama berlaku untuk perintah terkait seperti scp, sehingga konfigurasi cukup ditulis sekali untuk seluruh klien openssh. Untuk kunci yang dipakai lintas banyak server, blok Host * di bagian akhir berkas dapat menetapkan nilai bawaan seperti IdentityFile untuk semua tujuan.

Kesalahan umum#

Kesalahan berikut sering muncul saat autentikasi kunci dan berkas konfigurasi dipraktikkan.

  1. Kunci privat ditolak karena izinnya longgar. ssh menampilkan pesan error yang menyebut UNPROTECTED PRIVATE KEY dan kembali meminta kata sandi alih-alih memakai kunci. Perbaikannya adalah menjalankan chmod 600 ~/.ssh/id_ed25519.
  2. Ekspansi variabel terjadi di sisi lokal. Tanda kutip ganda membuat $HOME diperluas sebelum perintah dikirim, sehingga nilai yang sampai ke server berbeda dari harapan. Gunakan tanda kutip tunggal untuk perintah jarak jauh.
  3. Blok Host umum ditulis lebih dulu. Karena nilai pertama menang, Host * di awal berkas membatasi opsi blok berikutnya. Urutkan blok dari yang paling spesifik dan letakkan Host * di akhir berkas.

Ringkasan#

  • ssh menjalankan perintah pada host jarak jauh dan mengembalikan keluaran beserta kode keluarnya ke terminal lokal.
  • Autentikasi kunci publik memakai pasangan kunci dari ssh-keygen, dengan kunci publik di authorized_keys server dan kunci privat yang tetap di komputer lokal.
  • Berkas ~/.ssh/config meringkas koneksi berulang menjadi alias melalui direktif Host, HostName, User, Port, dan IdentityFile.
  • Izin berkas kunci dan urutan blok Host menentukan apakah konfigurasi bekerja sebagaimana diharapkan.

Referensi#