Menggunakan direktif IdentityFile di ssh_config ketika AgentForwarding sedang digunakan

15

Apakah mungkin untuk menentukan kunci yang diteruskan menggunakan direktif IdentityFile di .ssh / config?

Saya mengalami keanehan ini ketika mencoba untuk menyebarkan beberapa kode melalui Capistrano / GIT di server produksi kami. Kunci GIT pribadi dan pekerjaan saya selalu dimuat dalam agen SSH saya dan kebetulan bahwa kunci pribadi saya ditambahkan ke agen terlebih dahulu. Saya menggunakan penerusan agen ketika menggunakan Capistrano sehingga ketika tuan rumah mencoba untuk mengotentikasi operasi `git pull` gagal dengan kesalahan berikut:

GALAT: Izin untuk `beberapa repo` ditolak untuk` pengguna Anda`.

karena mencoba mengotentikasi menggunakan kunci git pribadi saya sebelum mencoba kunci yang sesuai (yang kemudian datang di agen ssh) dan berasumsi bahwa saya sedang mengakses repo asing yang saya tidak punya izin untuk mengakses. Saya berpotensi memberikan akses pengguna pribadi saya ke setiap repo kerja tetapi pada mesin lokal saya, saya bisa mengatasi masalah ini dengan mendefinisikan domain khusus di .ssh / config seperti:

Host personal.github.com
Hostname github.com
User git
IdentityFile ~ / .ssh / some_key

Host work.github.com
Hostname github.com
User git
IdentityFile ~ / .ssh / some_other_key

dan dengan cara ini git tidak pernah bingung. Apakah mungkin untuk membuat aturan .ssh / config untuk kunci yang diteruskan pada kotak produksi saya sehingga mereka selalu tahu kunci mana yang digunakan ketika menarik kode baru? Pada dasarnya saya ingin dapat melakukan:

Host work.github.com
Hostname github.com
User git
IdentityFile some_forwarded_key

Terima kasih!

skryl
sumber

Jawaban:

22

Anda dapat menggunakan bagian publik dari kunci untuk menentukan kunci pribadi mana yang ingin Anda gunakan dari agen yang diteruskan. Ini membutuhkan pembuatan file tambahan (bagian publik dari kunci) pada mesin "perantara" (mesin yang Anda gunakan untuk meneruskan ssh-agent lokal Anda ).

  1. Atur agar mesin perantara memiliki salinan bagian publik dari kunci yang diinginkan di lokasi yang nyaman (mis ~/.ssh/some_other_key.pub.).

    Dari mesin apa pun yang sudah memiliki bagian publik dari kunci:

    scp some_other_key.pub intermediate:.ssh/
    

    atau, pada mesin perantara:

    ssh-add -L | grep something_unique > ~/.ssh/some_other_key.pub
    

    Anda mungkin ingin mengedit bagian "komentar" dari kunci publik untuk mengidentifikasi dengan lebih baik asal / pemilik / tujuan kunci (atau upaya untuk menyembunyikan yang sama).

  2. Gunakan pathname ke file kunci publik di atas dengan -iatau IdentityFile.

  3. Anda mungkin juga perlu menggunakan IdentitiesOnly yes(dalam .ssh/configatau -o) agar ssh tidak mencoba menawarkan identitas tambahan dari agen penerusan Anda.

Chris Johnsen
sumber
Ini adalah satu-satunya hal yang berhasil bagi saya dari 10 solusi lain.
Tracy Fu
1
Bermain dengan ini saya menyadari bahwa jika Anda meletakkan kunci publik yang terkait dengan kunci pribadi yang ingin Anda gunakan di ~ / .ssh / id_rsa.pub pada mesin perantara, itu akan digunakan secara default, tidak perlu konfigurasi apa pun di ~ / .ssh / config.
bschlueter
Terima kasih Chris dan bschlueter! Sekarang saya terhubung dengan: ssh someserver t "ssh-add -L | grep something_unique> ~ / .ssh / id_rsa.pub; cd beberapa / / folder lainnya; pesta --login"
blablabla
Ketika saya mencoba ini dengan ssh -v -T ...server menerima kunci publik, tetapi kemudian ssh mengatakan No such identity: /home/name/.ssh/id_rsa: No such file or directorydan kemudian otentikasi gagal. Saya telah mengaktifkan ForwardAgent di semua konfigurasi saya. Apa yang bisa menjadi masalah?
Lars Nyström