A'dan B'ye C'ye SSH, B'de özel anahtar kullanarak


59

Yerel makinemden A, bir proxy, B, bir hedef ana bilgisayara, C’ye SSH’nin basit bir yolunu arıyorum. C’nin genel anahtarına giden özel anahtar B’de ve o anahtarı yerel makineme koy. Herhangi bir ipucu?

Ayrıca, ~ / .ssh / config kullanarak bunu yapabilmek istiyorum.

Teşekkürler!


1
A'dan B'ye, sonra da SSH'den C'ye ssh yapmak istediğini mi söylüyorsun? Yoksa vekil gerçek bir geçiş durumu mu?
thinice

A'dan C'ye ssh atmak, B'den geçmek istiyorum. Aşağıdaki cevabım geçen bölüm için işe yarıyor, ancak yine de yerel bilgisayarımda B yerine geçiş sunucusu yerine IdentityFile'ı aramaya çalışıyor.
wrangler

Yanıtlar:


74

Şematik:

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

Ön koşullar:

  • A ssh-agent kullanıyor;
  • Aerişebilir B;
  • Berişebilir C;
  • A'nin ssh ortak anahtarı var B:~/.ssh/authorized_keys
  • B'nin ssh ortak anahtarı var C:~/.ssh/authorized_keys

Gelen ~/.ssh/configüzerine Aekleyin

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

B'deki ssh özel anahtarınız standart olmayan bir konumda ise, yolunu sonra ekleyin ssh-add.

Şimdi yeniden gerekir Cdan A:

A$ ssh C
C$

13
Sadece 4 yıl sürdü, ama bir cevabımız var gibi görünüyor! Awesome
wrangler

3
Openssh v.7.3 ile başlayarak, sadece kullanabilirsiniz ProxyJump B. Kaynak: wikibooks
Keith

2
Bu şöyle tanımlanabilir: Host user1 @ c ProxyCommand ssh -o 'ForwardAgent evet' user2 @ B 'ssh-add & & nc% h% p'
Ravindranath Akila

2
B makinesi yoksa çözüm nasıl değişebilir nc?
mjalajel

1
Tamam @DrewVS, tek eklemesi gerekir ForwardAgent yes önceProxyJump komuta.
Graipher

21

Aşağıdakilerin çalışıp çalışmadığını kontrol edin.

ssh -t B ssh C

B'de depolanan anahtarı kullanmak istiyorsanız aşağıdaki komutu kullanın.

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

Burada ssh -i /path/to/identity_on_B Cbir giriş kabuğu yerine B'de yürütülecek komutu belirtiyoruz.


Bu işe yarar ancak B'den IdentityFile'ı almaz. Yine de A'ya bakar
wrangler

@DrewVS Ben cevabı güncelledik. Lütfen sizin için çalışıp çalışmadığını kontrol edin.
Sachin Divekar

Sachin, çok zekice. Bu mükemmel çalıştı. Çok teşekkürler!
wrangler

@DrewVS sizin için çalıştığını duyduğuma sevindim. lütfen cevabı kabul et.
Sachin Divekar

Ancak, bu parola korumalı rsa tuşları ile çalışmıyor gibi görünüyor. Parola girişi gizlenir ve kullanıcının bu yaklaşımın çalışması için anahtarı ssh anahtarına eklemesi gerekir. Herhangi bir fikir?
wrangler,

10

Bunu şimdi çalıştım. İşte oldukça basit olan çözüm. Daha önce görmeliydim:

~ / .Ssh / yapılandırma:

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', atladığınız Proxy sunucusudur. Bir sunucuya erişimi normalde yapılandırdığınız gibi yapılandırılmalıdır.

'C' hedef ana bilgisayardır. Bağlantı sürecinde 'B' kullanacak şekilde yapılandırılması gerekiyor. 'C' içindeki kimlik dosyası, 'B' üzerindeki ssh-anahtarına giden yoldur. ProxyCommand 'B' ile 'C' bağlantısını açmak için Netcat kullanır. Netcat veya nc'nin 'B' üzerine yüklenmesi gerekir.

Umarım bu başkalarına yardımcı olur.


3
Çok erken konuştum. Bu çözüm işe görünmüyor. Anahtar ssh aracısına yüklenmişti, ben de işe yaradığını düşündüm. Yukarıda, C anahtarı hala A olması gerekmektedir değil, B.
bakıcısı

2

Uzaktaki ssh anahtarlarını basitçe listelemek için basit bir betik yazdım ve ardından yerel ssh ajanıma seçtiğimi yazdım. Bu çok temiz değil, ancak tüm anahtarları yerel olarak değil uzak bir konumda tutmama izin veriyor.

İşte ilgilenen varsa senaryo:

#!/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

Bir anahtarın eklenmesi, aptalca olarak değerlendirilebileceğini ve böylece anahtar listesinin alınmasına gerek kalmayacağını düşünüyorum.
dmourati

Tam olarak istediğinizi yapan serverfault.com/a/701884/127993 adresini kabul etmelisiniz .
sjas 20:16

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/

1

Yapmak:

ssh someuser@IP_D

öyle ki

A -> B-> C -> D bulunduğunuz ev sahibi A,

Yerel ~ / .ssh / config benzeri düzenleyin:

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'

Bu cevap seçilen cevaba dayanmaktadır. Çeşitli kullanıcıların tüm senaryoya ne kadar uyduğunu bulmak zorunda kaldım.

Bu benim için çalışıyor. HTH.


0

Kartopunun cevabı çok yardımcı oldu. Ancak, komutta bazı değişiklikler yaptım ve nasıl çalıştığını açıklamak istedim. Bu durum göz önüne alındığında:

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

~/.ssh/configDosyanızı değiştirin ve Biçinden geçmek istediğiniz ana bilgisayarı ekleyin , tıpkı normalde bir ana bilgisayarı nasıl yapılandırdığınızı:

Host B
 User myusername
 HostName b.mycompany.com

Ardından C, sonlandırmak istediğiniz ana bilgisayarı ekleyin :

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

Şunlara dikkat edin ProxyCommand:

  • ssh -T -qbir sözde TTY ( -T) tahsis etmemesi ve sessiz kalması gerektiğini belirtir -q;
  • bir kez atlama ana bilgisayarda B, biz SSH anahtarlarına anahtarı eklemek Athrough ssh-add;
  • sadece SSH aracısını kullanarak yönlendirdiğimiz için çalışıyor -o 'ForwardAgent yes'.
  • ssh-add -t 1 anahtarın yalnızca son ana C'ye kimlik doğrulaması için gereken 1 saniye boyunca eklenmesini istediğimi belirtir;
  • ve son olarak, nc %h %pbir başlatır netcatnihai ana bilgisayara bağlantı %hlimanında %p(bilgilere dayanarak SSH tarafından doldurulacaktır hangi ikisi ~/.ssh/configdosyası).

Kullanmak için özel bir anahtar belirtmeniz gerekiyorsa B, ssh-addparçayı değiştirerek bunu yapabilirsiniz :

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'
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.