pengantar
SSH-agent adalah bagian dari OpenSSH. Dalam posting ini saya akan menjelaskan apa itu agen, bagaimana menggunakannya dan bagaimana cara kerjanya agar kunci Anda tetap aman. Saya juga akan menjelaskan penerusan agen dan cara kerjanya. Saya akan membantu Anda mengurangi risiko menggunakan penerusan agen dan akan membagikan alternatif untuk penerusan agen yang dapat Anda gunakan saat mengakses host internal Anda melalui bastion.Apa itu agen SSH
ssh-agent
Adalah manajer kunci untuk SSH. Ini menyimpan kunci dan sertifikat Anda dalam memori, tidak terenkripsi dan siap digunakan ssh
. Ini menghilangkan kebutuhan untuk memasukkan kata sandi setiap kali Anda terhubung ke server. Ini berjalan di latar belakang pada sistem Anda, terpisah dari ssh
, dan biasanya dimulai pada awal pertama ssh
.Agen SSH menjaga kunci rahasia tetap aman karena tidak :- Itu tidak menulis informasi kunci ke disk.
- Itu tidak memungkinkan Anda untuk mengekspor kunci pribadi Anda.
Kunci rahasia yang disimpan dalam Agen hanya dapat digunakan untuk satu tujuan: menandatangani pesan.Tetapi jika agen hanya dapat menandatangani pesan, bagaimana SSH mengenkripsi dan mendekripsi lalu lintas?Dalam studi pertama kunci publik dan pribadi SSH, wajar untuk mengasumsikan bahwa SSH menggunakan pasangan kunci ini untuk mengenkripsi dan mendekripsi lalu lintas. Itulah yang saya pikirkan. Tapi ini bukan masalahnya. Pasangan kunci SSH hanya digunakan untuk otentikasi selama koneksi awal.Misalnya, inilah cara memverifikasi kunci pengguna selama koneksi SSH, dari perspektif server:- Klien menyediakan server dengan kunci publik.
- Server menghasilkan dan mengirim pesan acak singkat yang meminta klien untuk menandatanganinya menggunakan kunci pribadi.
- Klien meminta agen SSH untuk menandatangani pesan dan mengirimkan hasilnya kembali ke server.
- Server memverifikasi tanda tangan menggunakan kunci publik klien.
- Sekarang server memiliki bukti bahwa klien memiliki kunci pribadi.
Kemudian, selama proses koneksi, satu set kunci baru, sesaat dan simetris dihasilkan, yang digunakan untuk mengenkripsi lalu lintas sesi SSH. Kunci-kunci ini bahkan mungkin tidak berlangsung sepanjang sesi; Acara rekey terjadi secara berkala.Protokol Agen
SSH menggunakan soket domain Unix untuk berkomunikasi dengan agen melalui protokol agen SSH . Kebanyakan orang menggunakan ssh-agent
yang datang dengan OpenSSH, tetapi ada banyak alternatif sumber terbuka.Protokol agen sangat sederhana sehingga Anda bisa menulis SSH-agen dasar dalam satu atau dua hari. Ini hanya memiliki beberapa operasi dasar:- Tambahkan pasangan kunci reguler (kunci privat publik dan dekripsi)
- Tambahkan pasangan kunci terbatas (kunci privat publik dan dekripsi)
- Tambahkan kunci (reguler atau terbatas) dari kartu pintar (hanya kunci publik)
- Hapus kunci
- Kunci daftar disimpan di agen
- Menandatangani pesan dengan kunci yang disimpan di agen
- Kunci atau buka kunci seluruh agen dengan kata sandi
Apa itu kunci terbatas? Ini biasanya merupakan kunci yang memiliki masa pakai terbatas atau memerlukan konfirmasi eksplisit oleh pengguna saat menggunakannya.Perintah ssh-add
adalah gerbang Anda ke agen SSH. Dia melakukan semua operasi ini kecuali untuk tanda tangan. Ketika Anda menjalankan ssh-add tanpa parameter apa pun, itu akan memindai direktori home Anda untuk beberapa kunci standar dan menambahkannya ke agen Anda. Secara default, ini mencari:~/.ssh/id_rsa
~/.ssh/id_ed25519
~/.ssh/id_dsa
~/.ssh/id_ecdsa
Segera setelah Anda menambahkan kunci ke gantungan kunci, mereka akan secara otomatis digunakan ssh
.ssh-
dan MacOS Keychainssh-agent
, yang dikirimkan bersama macOS, dapat menyimpan frasa sandi untuk kunci di macOS Keychain, yang membuatnya lebih mudah untuk menambahkan kembali kunci ke agen setelah reboot. Tergantung pada pengaturan Keychain Anda, Anda mungkin masih perlu membukanya setelah reboot. Untuk menyimpan frasa sandi utama ke Keychain, jalankan perintah ssh-add -K [ ]
. Frasa sandi biasanya disimpan dalam "Item Lokal". ssh-agent
akan menggunakan frasa sandi yang disimpan ini secara otomatis sesuai kebutuhan.Apa itu penerusan agen?
Fitur penerusan agen memungkinkan agen SSH lokal Anda untuk berkomunikasi melalui koneksi SSH yang ada dan mengautentikasi secara transparan ke server yang lebih jauh. Sebagai contoh, misalkan Anda masuk ke EC2 melalui SSH dan ingin mengkloning repositori GitHub pribadi dari sana. Tanpa penerusan agen, Anda harus menyimpan salinan kunci pribadi GitHub Anda pada host EC2. Saat agen dialihkan, klien SSH di EC2 dapat menggunakan kunci di komputer lokal Anda untuk otentikasi di GitHub.Cara kerja penerusan agen
Pertama, sedikit latar belakang. Koneksi SSH dapat memiliki beberapa saluran. Berikut ini adalah contoh umum: koneksi interaktif ke bastion-host (kotak melompat) dilakukan pada satu saluran. Ketika penerusan agen diaktifkan untuk koneksi (biasanya menggunakan ssh -A
), saluran kedua terbuka di latar belakang untuk meneruskan setiap permintaan agen kembali ke komputer lokal Anda.Dalam hal ssh
, tidak ada perbedaan antara jarak jauh dan lokal ssh-agent
. SSH selalu melihat variabel lingkungan $SSH_AUTH_SOCK
untuk menemukan soket domain Unix untuk agen. Saat menyambungkan ke host jarak jauh dengan penerusan agen diaktifkan, SSHD akan membuat soket domain Unix jarak jauh yang dikaitkan dengan saluran penerusan agen dan mengekspor $SSH_AUTH_SOCK
yang menunjuk ke sana.
Penerusan agen dikaitkan dengan risiko tertentu
Ketika Anda mengarahkan soket domain ssh-agent
Unix ke host jarak jauh, ini menimbulkan risiko keamanan: siapa pun dengan akses root pada host jarak jauh dapat secara diam-diam mengakses agen SSH lokal Anda melalui soket. Mereka dapat menggunakan kunci Anda untuk menyamar sebagai Anda di komputer lain di jaringan.Berikut adalah contoh bagaimana ini terlihat:
Cara mengurangi risiko Anda dengan penerusan agen
Berikut adalah beberapa cara untuk membuat pengalihan agen lebih aman:- Jangan aktifkan
ForwardAgent
secara default.
Blokir agen ssh Anda saat Anda menggunakan penerusan agen. ssh-add -x
memblokir agen dengan kata sandi, dan ssh-add -X
membukanya. Ketika Anda terhubung ke host jarak jauh dengan penerusan agen, tidak ada yang bisa memasukkan agen Anda tanpa kata sandi.Atau gunakan agen SSH alternatif yang menanyakan Anda ketika sedang digunakan. Sekey menggunakan Touch ID pada macOS untuk menyimpan kunci di kantong keamanan MacBook Pro.Atau jangan gunakan penerusan agen sama sekali. Jika Anda mencoba mengakses host internal melalui bastion, ada ProxyJump
alternatif yang jauh lebih aman untuk use case ini. (Lihat di bawah)Gunakan ProxyJump
: alternatif yang lebih aman
Ketika Anda ingin melewati host-bastion (jumpbox), Anda benar-benar tidak perlu meneruskan agen. Pendekatan terbaik adalah dengan menggunakan arahan ProxyJump
.Alih-alih mengarahkan agen melalui saluran terpisah, ia ProxyJump
mengarahkan ulang input dan output standar klien SSH lokal Anda melalui bastion dan lebih jauh ke host jarak jauh. Begini cara kerjanya:- Jalankan
ssh -J bastion.example.com cloud.computer.internal
untuk terhubung cloud.computer.internal
melalui host benteng Anda bastion.example.com
. cloud.computer.internal
Apakah nama host yang dapat ditemukan dengan mencari DNS aktif bastion.example.com
. - Klien SSH Anda menggunakan kunci dari agen Anda untuk terhubung
bastion.example.com
. - Setelah menghubungkan SSHD ke benteng, itu menghubungkan ke
cloud.computer.internal
dan mentransfer koneksi ini ke klien SSH lokal Anda. - Klien SSH lokal Anda melewati koneksi lagi, kali ini dengan
cloud.computer.internal
Anda dapat menganggapnya sebagai SSH dalam sesi SSH; kecuali bahwa ssh tidak pernah berjalan di atas bastion. Sebagai gantinya, ia sshd
terhubung ke cloud.computer.internal
dan memberikan kontrol koneksi ini (input dan output standar) kembali ke SSH lokal Anda, yang kemudian membuat koneksi kedua.Mengkonfigurasi ProxyJumpKatakanlah bastion-host ini bastion.example.com
. Saya dapat mengkonfigurasi ~/.ssh/config
seperti ini:Host bastion.example.com
User carl
Host *.computer.internal
ProxyJump bastion.example.com
User carl
Lalu saya hanya berlari ssh cloud.computer.internal
untuk terhubung ke tujuan internal melalui benteng - tanpa agen forwarding.Jika ProxyJump tidak berfungsi ...Versi SSH dan SSHD yang lebih lama (sebelum versi 7.2, dirilis pada 2016) tidak mendukung ProxyJump
. Tetapi Anda dapat melakukan operasi yang setara menggunakan ProxyCommand
dan netcat . Berikut ini sebuah contoh:ssh -o ProxyCommand="ssh bastion.example.com nc %h %p" cloud.computer.internal
Yang ajaib di sini adalah SSH itu sendiri adalah server proxy yang Anda gunakan untuk SSH. Bagian nc %h %p
hanya membuka koneksi socket mentah ke cloud.computer.internal
pada port 22. Standar input / output dari perintah ssh induk diteruskan langsung ke ProxyCommand
sehingga induk ssh dapat mengotentikasi ke host internal melalui koneksi proxy.
Pelajari detail tentang cara mendapatkan profesi yang dicari dari awal atau Tingkatkan keterampilan dan gaji dengan mengambil kursus online SkillFactory:Baca lebih banyak