Gunakan kunci penerusan khusus dari agen SSH?

30

Katakanlah saya punya kunci untuk Github, bersama dengan kunci lainnya. Saya telah menambahkan banyak kunci ke agen ssh saya ( ssh-add -Lmengembalikan banyak baris) di komputer rumah saya A. Dalam saya, .ssh/configsaya telah mengatur kunci mana yang akan digunakan dengan host mana, jadi mis.

ssh -T -vvv [email protected] 2>&1 | grep Offering

memberi

debug1: Offering RSA public key: /Users/doxna/.ssh/id_rsa.github

Hanya satu kunci yang ditawarkan, seperti yang diharapkan. Tapi kemudian ssh-ing ke beberapa host B dengan ForwardAgent yesdan mengulangi perintah yang sama, saya mengerti

debug1: Offering RSA public key: /Users/doxna/.ssh/id_rsa.linode2
debug1: Offering RSA public key: /Users/doxna/.ssh/id_rsa.helium
debug1: Offering RSA public key: /Users/doxna/.ssh/id_rsa.github

artinya mencoba semua kunci saya. Ini bermasalah karena hanya sejumlah kunci yang dapat dicoba sebelum server kembali Too many authentication failures. Jadi saya mencoba mengedit .ssh/configpada host B untuk memasukkan

Host github.com
  IdentityFile /Users/doxna/.ssh/id_rsa.github
  IdentitiesOnly yes

tapi kemudian saya tidak mendapatkan penawaran kunci, melainkan

debug2: key: /Users/doxna/.ssh/id_rsa.github ((nil))

yang saya kira berarti kuncinya tidak ditemukan (?) Dan setelah semua, kuncinya terletak di komputer rumah saya A, bukan host B, jadi pertanyaannya adalah bagaimana merujuknya di host B? Semoga saya berhasil menjelaskan pertanyaan itu.

danmichaelo
sumber

Jawaban:

28

Anda punya ide yang tepat. Satu-satunya bagian yang Anda lewatkan adalah bahwa file yang ditunjuk oleh IdentityFileharus ada. Tidak perlu mengandung kunci privat, hanya memiliki kunci publik yang tersedia sudah cukup.

Pada host B Anda dapat mengekstrak kunci publik dari agen dengan mengetik ssh-add -L | grep /Users/doxna/.ssh/id_rsa.github > ~/.ssh/id_rsa.github.pubdan lalu arahkan ke file tersebut~/.ssh/config

kasperd
sumber
FYI nama kunci publik tidak masalah. Ini akan memilih kunci yang tepat dari agen berdasarkan konten.
akostadinov
@akostadinov Benar. Jika Anda menunjuk sshke file kunci publik tanpa file kunci privat terkait, itu harus hanya membaca kunci publik dari file dan meminta agen menggunakan kunci pribadi terkait untuk menghasilkan tanda tangan.
kasperd
Ini secara efektif menyimpan kunci Anda di host B! Lihat jawaban di bawah ini dengan @ mc0e untuk solusi yang tidak menyimpan kunci di server.
Pitt
2
@Tidak, tidak. Ini hanya menyimpan kunci publik . Dan itu bukan masalah karena kunci publik tidak pernah diharapkan dirahasiakan. Penerusan agen memberi tuan rumah akses untuk menggunakan kunci selama agen penerus ada, tetapi agen tidak akan pernah mengirim kunci rahasia di mana pun.
kasperd
@kasperd Anda tidak memerlukan salinan kunci privat yang sebenarnya saat Anda memiliki koneksi langsung ke agen pengguna dengan kunci tersebut. Sebagai root, Anda dapat mengakses koneksi agen pengguna login lain.
mc0e
5

Jawaban bagus dari @Kasperd, tetapi perhatikan juga bahwa jika Host B dikompromikan, atau jika Anda tidak mempercayai semua yang memiliki hak akses root di sana, maka Anda masih mengekspos semua kunci Anda untuk penyalahgunaan selama Anda login di host itu.

Jadi pendekatan yang lebih baik mungkin hanya meneruskan akses ke kunci yang Anda butuhkan. Mungkin coba ssh-agent-filteryang ada di repositori debian / Ubuntu, atau dari github .

EDIT: Saya ssh-identlebih memilih daripada ssh-agent-filtermeneruskan tombol secara selektif, meskipun itu tidak semulus pengalaman yang diharapkan.

mc0e
sumber
1
Dari komentar @ kasperd pada jawabannya: "tidak. Itu hanya menyimpan kunci publik. Dan itu bukan masalah karena kunci publik tidak pernah diharapkan dirahasiakan sejak awal. Penerusan agen memberi tuan rumah akses ke gunakan kunci selama agen diteruskan, tetapi agen tidak akan pernah mengirim kunci rahasia di mana pun "
Bdoserror
1
@Bdoserror Sebagai root, Anda dapat menyalahgunakan koneksi ssh-agent ketika pengguna terkait login. Anda cukup menyalin SSH_*variabel lingkungan dan masuk ke mana pun Anda ingin menggunakan kunci, meskipun tidak pernah memiliki salinan yang sebenarnya.
mc0e
Untuk memperjelas: jawaban ini memang salah - sementara skenario penyalahgunaan dari mc0e adalah nyata, itu tidak ada hubungannya dengan menyimpan kunci publik - jika host perantara terganggu, koneksi agen Anda dapat digunakan untuk mengotentikasi dengan kunci pribadi Anda, terlepas dari apakah Anda menyimpan kunci publik pada host perantara atau tidak. Wilkl kunci pribadi Anda tidak akan dikompromikan, dan menyimpan kunci publik tidak akan membuatnya lebih mudah, karena penyerang yang memiliki koneksi ke agen tetap saja meminta kunci publik.
Pasang kembali Monica
@ marc-lehmann membaca kembali apa yang saya tulis. Jika Anda meneruskan kunci maka mereka akan terbuka, tetapi Anda dapat membatasi kunci mana yang diteruskan.
mc0e
Saya menginjak apa yang Anda tulis - mohon alamat substansi komentar kami, bukan orangnya. Masalahnya adalah bahwa jawaban Anda benar-benar salah karena mengasumsikan, ketika Anda menulis, bahwa kunci "diteruskan" ke host jarak jauh. Tidak ada hal seperti itu terjadi, dan kunci itu sendiri tidak terbuka.
Pasang kembali Monica