SSH dari A hingga B ke C, menggunakan kunci pribadi pada B

59

Saya mencari cara sederhana untuk SSH dari mesin lokal saya, A, melalui proxy, B, ke host tujuan, C. Kunci pribadi yang berjalan dengan kunci publik pada C ada di B, dan saya tidak bisa letakkan kunci itu di mesin lokal saya. Ada tips?

Juga, saya ingin dapat melakukan ini menggunakan ~ / .ssh / config.

Terima kasih!

penengkar
sumber
1
Apakah Anda mengatakan Anda ingin ssh dari A ke B, dan kemudian SSH ke C? Atau apakah proxy adalah situasi pass-thru yang sebenarnya?
thinice
Saya ingin ssh dari A ke C, melewati B. Jawaban saya di bawah ini berfungsi untuk bagian yang melewati, tetapi masih mencoba untuk mencari IdentityFile di komputer lokal saya alih-alih pada B, host pass-through.
wrangler

Jawaban:

74

Skema:

    ssh       ssh
A ------> B ------> C
    ^          ^
 using A's   using B's
 ssh key     ssh key

Prasyarat:

  • A menjalankan ssh-agent;
  • Adapat mengakses B;
  • Bdapat mengakses C;
  • AKunci publik ssh hadir di B:~/.ssh/authorized_keys
  • BKunci publik ssh hadir di C:~/.ssh/authorized_keys

Di ~/.ssh/configatas A, tambahkan

Host C
    ProxyCommand ssh -o 'ForwardAgent yes' B 'ssh-add && nc %h %p'

Jika kunci pribadi ssh Anda pada B berada di lokasi yang tidak standar, tambahkan jalurnya setelah ssh-add.

Anda sekarang dapat mengakses Cdari A:

A$ ssh C
C$
Semakin bertambah
sumber
13
Hanya butuh 4 tahun, tapi sepertinya kita punya jawaban! Luar biasa
wrangler
3
Dimulai dengan openssh v.7.3, Anda bisa menggunakannya ProxyJump B. sumber: wikibooks
Keith
2
Dapatkah ini didefinisikan sedemikian rupa sehingga: Host user1 @ c ProxyCommand ssh -o 'ForwardAgent yes' user2 @ B'ssh-add && nc% h% p '
Ravindranath Akila
2
Bagaimana solusinya akan berubah jika mesin B tidak memiliki nc?
mjalajel
1
@DrewVS Ok, salah satu kebutuhan untuk menambahkan ForwardAgent yes sebelum itu ProxyJumpperintah.
Graipher
22

Periksa apakah berikut ini berfungsi.

ssh -t B ssh C

Gunakan perintah berikut jika Anda ingin menggunakan kunci yang tersimpan di B.

ssh -t B ssh -i /path/to/identity_on_B C

Di sini kita menentukan perintah yaitu ssh -i /path/to/identity_on_B Cuntuk dieksekusi pada B bukannya shell login.

Sachin Divekar
sumber
Ini berfungsi tetapi tidak mengambil IdentityFile dari B. Masih terlihat pada A.
wrangler
@DrewVS Saya telah memperbarui jawabannya. Silakan periksa apakah itu berfungsi untuk Anda.
Sachin Divekar
Sachin, sangat pintar. Itu bekerja dengan sempurna. Terima kasih banyak!
wrangler
@DrewVS senang mendengar bahwa itu berhasil untuk Anda. jadi tolong terima jawabannya.
Sachin Divekar
Namun, sepertinya ini tidak berfungsi dengan kunci rsa yang dilindungi kata sandi. Input kata sandi disembunyikan, memaksa pengguna harus menambahkan kunci ke kunci ssh mereka agar pendekatan ini berfungsi. Ada ide?
wrangler
10

Saya sudah menyelesaikan ini sekarang. Inilah solusinya, yang agak langsung. Saya seharusnya melihatnya lebih cepat:

~ / .ssh / config:

Host B
  HostName 1.2.3.4
  User myuser
  IdentityFile ~/.ssh/rsa_key
  ControlMaster auto
  ControlPath ~/.ssh/socket/master-%l-%r@%h:%p

Host C.*
  User customer_username
  Port customer_port
  IdentityFile remote/path/to/ssh/key
  ForwardAgent yes
  ProxyCommand ssh accessable.server nc %h %p

Host C.server-1
  HostName 2.3.4.5

'B' adalah server Proksi yang Anda lompati. Ini harus dikonfigurasi seperti biasanya Anda mengkonfigurasi akses ke server.

'C' adalah tuan rumah tujuan. Perlu dikonfigurasikan untuk menggunakan 'B' dalam proses koneksi. File identitas dalam 'C' adalah path ke ssh-key pada 'B'. ProxyCommand menggunakan Netcat untuk membuka koneksi ke 'C' dari 'B'. Netcat, atau nc, harus diinstal pada 'B'.

Semoga ini bisa membantu orang lain.

penengkar
sumber
3
Saya berbicara terlalu cepat. Solusi ini tidak berhasil. Kunci telah dimuat di ssh-agent, jadi saya pikir itu berfungsi. Di atas, kunci untuk C masih perlu berada di A, bukan B.
wrangler
2

Saya menulis sebuah skrip sederhana untuk pada dasarnya daftar kunci ssh saya pada contoh jarak jauh, dan kemudian menambahkan yang saya pilih ke agen ssh lokal saya. Ini tidak terlalu bersih, tetapi memungkinkan saya untuk menyimpan semua kunci di lokasi yang jauh daripada secara lokal.

Berikut skripnya jika ada yang tertarik:

#!/usr/bin/ruby

require "rubygems"
require "fileutils"

# Get key list
key_list = (`ssh jumpbox "cd ~/.ssh/ ; ls id_rsa*" | sed 's/id_rsa_/  /g' | sed     's/id_rsa//g'`)
puts ' '
puts 'Available customer keys:'
puts key_list

# Get customer name input
puts ' '
puts 'Enter customer name: '
customer_name = gets.chomp

# Add key to ssh-agent
key_name = "~/.ssh/id_rsa_#{customer_name}"
puts ' '
puts "Adding #{key_name} to local ssh-agent"
`ssh jumpbox "ssh-add ~/.ssh/id_rsa_#{customer_name}"`
exit 0
penengkar
sumber
Saya pikir menambahkan kunci dapat diperlakukan sebagai idempoten sehingga menghilangkan kebutuhan untuk mendapatkan daftar kunci.
dmourati
Anda harus menerima serverfault.com/a/701884/127993 yang melakukan apa yang Anda inginkan.
sjas
1
#!/usr/bin/env bash
target_host=10.121.77.16
target_port=22
target_user=vagrant

bastion_user=yourusername
bastion_host=10.23.85.245
bastion_port=32780

scp -P $target_port -o ProxyCommand="ssh -o 'ForwardAgent yes' $bastion_user@$bastion_host -p $bastion_port 'ssh-add ~/.ssh/*.rsa && nc %h %p'" /tmp/x.txt $target_user@$target_host:/tmp/
wcc526
sumber
1

Melakukan:

ssh someuser@IP_D

seperti yang

A -> B-> C -> D di mana A adalah tuan rumah Anda,

edit ~ / .ssh / config lokal Anda seperti:

Host IP_D
  ProxyCommand ssh -o 'ForwardAgent yes' userX@IP_C 'ssh-add && nc %h %p'
Host IP_C
  ProxyCommand ssh -o 'ForwardAgent yes' userY@IP_B 'ssh-add && nc %h %p'

Jawaban ini didasarkan pada jawaban yang dipilih. Saya harus mencari tahu bagaimana berbagai pengguna cocok dengan keseluruhan skenario.

Ini bekerja untuk saya. HTH.

Ravindranath Akila
sumber
0

Jawaban Snowball sangat membantu. Namun, saya membuat beberapa modifikasi pada perintah dan ingin menjelaskan cara kerjanya. Mengingat situasi ini:

    ssh        ssh
A -------> B -------> C
     ^          ^
  using A's  using B's
  ssh key    ssh key

Ubah ~/.ssh/configfile Anda dan tambahkan host Byang ingin Anda lompati, seperti biasanya Anda mengkonfigurasi host:

Host B
 User myusername
 HostName b.mycompany.com

Kemudian Anda menambahkan host Cyang Anda ingin berakhir pada:

Host C
 User myusername
 HostName c.intranet.mycompany.com
 ProxyCommand ssh -T -q -o 'ForwardAgent yes' B 'ssh-add -t 1 && nc %h %p'

Perhatikan ProxyCommand, di mana:

  • ssh -T -qmenunjukkan bahwa ia tidak boleh mengalokasikan pseudo-TTY ( -T) dan diam ( -q);
  • sekali pada host lompat B, kami menambahkan kunci ke kunci SSH Amelalui ssh-add;
  • yang hanya berfungsi karena kami meneruskan agen SSH menggunakan -o 'ForwardAgent yes'.
  • ssh-add -t 1 menunjukkan bahwa saya ingin kunci ditambahkan hanya untuk 1 detik yang diperlukan untuk mengautentikasi ke host terakhir C;
  • dan akhirnya, nc %h %pmemulai netcatkoneksi ke host terakhir %hdi port %p(keduanya akan diisi oleh SSH berdasarkan informasi dalam ~/.ssh/configfile).

Jika Anda perlu menentukan kunci khusus Buntuk digunakan, Anda dapat melakukannya dengan memodifikasi ssh-addbagian:

Host C
 User myusername
 HostName c.intranet.mycompany.com
 ProxyCommand ssh -T -q -o 'ForwardAgent yes' B 'ssh-add -t 1 ~/.ssh/mykey && nc %h %p'
Daniel AA Pelsmaeker
sumber