SSH จาก A ถึง B ถึง C โดยใช้คีย์ส่วนตัวบน B


59

ฉันกำลังมองหาวิธีง่ายๆในการ SSH จากเครื่องท้องถิ่นของฉัน, A, ผ่านพร็อกซี, B, ไปยังโฮสต์ปลายทาง, C. คีย์ส่วนตัวที่ไปกับกุญแจสาธารณะบน C อยู่บน B และฉันไม่สามารถ วางรหัสนั้นบนเครื่องท้องถิ่นของฉัน เคล็ดลับใด ๆ

นอกจากนี้ฉันต้องการทำสิ่งนี้โดยใช้ ~ / .ssh / config

ขอบคุณ!


1
คุณกำลังบอกว่าคุณต้องการ ssh จาก A ถึง B แล้ว SSH ถึง C? หรือพร็อกซีเป็นสถานการณ์ของการส่งผ่านที่แท้จริงหรือไม่
thinice

ฉันต้องการ ssh จาก A ถึง C ผ่าน B คำตอบของฉันด้านล่างใช้สำหรับการส่งผ่านส่วนหนึ่ง แต่ก็ยังพยายามค้นหา IdentityFile บนคอมพิวเตอร์ในพื้นที่ของฉันแทนที่จะเป็น B โฮสต์การส่งผ่าน
Wrangler

คำตอบ:


74

แผนผัง:

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

เงื่อนไข:

  • A กำลังเรียกใช้ ssh-agent;
  • Aสามารถเข้าถึงB;
  • Bสามารถเข้าถึงC;
  • Aมีการใช้รหัสสาธารณะของ ssh B:~/.ssh/authorized_keys
  • Bมีการใช้รหัสสาธารณะของ ssh C:~/.ssh/authorized_keys

ใน~/.ssh/configเมื่อAเพิ่ม

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

หากคีย์ส่วนตัว ssh ของคุณบน B อยู่ในตำแหน่งที่ไม่เป็นมาตรฐานให้เพิ่มพา ธ หลังจากssh-addนั้น

ตอนนี้คุณควรจะสามารถเข้าถึงได้CจากA:

A$ ssh C
C$

13
ใช้เวลาเพียง 4 ปี แต่ดูเหมือนว่าเราจะได้คำตอบ! ดีเลิศ
Wrangler

3
เริ่มต้นด้วย openssh v.7.3 ProxyJump Bคุณก็สามารถใช้ แหล่งที่มา: wikibooks
Keith

2
สามารถกำหนดได้ดังนี้: Host user1 @ c ProxyCommand ssh -o 'ForwardAgent ใช่' user2 @ B 'ssh-add && nc% h% p'
Ravindranath Akila

2
วิธีแก้ปัญหาจะเปลี่ยนไปอย่างไรหากเครื่อง B ไม่มีnc?
mjalajel

1
@DrewVS ตกลงหนึ่งต้องการที่จะเพิ่มForwardAgent yes ก่อนProxyJumpคำสั่ง
Graipher

21

ตรวจสอบว่าต่อไปนี้ทำงาน

ssh -t B ssh C

ใช้คำสั่งต่อไปนี้หากคุณต้องการใช้รหัสที่เก็บไว้ใน B

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

ที่นี่เรากำลังระบุคำสั่งเช่นssh -i /path/to/identity_on_B Cที่จะดำเนินการใน B แทนเปลือกเข้าสู่ระบบ


ใช้งานได้ แต่ไม่ได้รับ IdentityFile จาก B มันยังคงดูใน A.
wrangler

@DrewVS ฉันได้อัปเดตคำตอบ โปรดตรวจสอบว่ามันใช้งานได้สำหรับคุณหรือไม่
Sachin Divekar

Sachin ฉลาดมาก มันทำงานได้อย่างสมบูรณ์ ขอบคุณมาก!
Wrangler

@DrewVS ดีใจที่ได้ยินว่าเหมาะกับคุณ ดังนั้นโปรดยอมรับคำตอบ
Sachin Divekar

อย่างไรก็ตามดูเหมือนว่าจะไม่ทำงานกับคีย์ rsa ที่ป้องกันด้วยรหัสผ่าน การป้อนรหัสผ่านถูกซ่อนบังคับให้ผู้ใช้ต้องเพิ่มคีย์ในคีย์ ssh เพื่อให้วิธีการนี้ทำงาน ความคิดใด ๆ
Wrangler

10

ฉันทำมันเสร็จแล้วตอนนี้ นี่คือทางออกซึ่งค่อนข้างตรงไปตรงมา ฉันควรจะเห็นมันเร็วกว่านี้:

~ / .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' เป็นเซิร์ฟเวอร์พร็อกซี่ที่คุณกำลังก้าวผ่าน ควรกำหนดค่าตามปกติคุณจะกำหนดค่าการเข้าถึงเซิร์ฟเวอร์

'C' เป็นโฮสต์ปลายทาง จำเป็นต้องกำหนดค่าให้ใช้ 'B' ในกระบวนการเชื่อมต่อ ไฟล์ข้อมูลประจำตัวใน 'C' คือพา ธ ไปยัง ssh-key บน 'B' ProxyCommand ใช้ Netcat เพื่อเปิดการเชื่อมต่อกับ 'C' จาก 'B' Netcat หรือ nc จะต้องติดตั้งใน 'B'

หวังว่านี่จะช่วยผู้อื่น


3
ฉันพูดเร็วเกินไป วิธีนี้ไม่ได้ผล คีย์ถูกโหลดใน ssh-agent ดังนั้นฉันคิดว่ามันทำงานได้ ในข้างต้นกุญแจสำหรับ C ยังคงต้องอยู่บน A ไม่ใช่ B
wrangler

2

ฉันเขียนสคริปต์อย่างง่ายเพื่อแสดงรายการคีย์ ssh ของฉันบนอินสแตนซ์ระยะไกลจากนั้นเพิ่มรหัสที่ฉันเลือกให้กับตัวแทน ssh ในพื้นที่ของฉัน ที่นี่ไม่สะอาดมาก แต่อนุญาตให้ฉันเก็บกุญแจทั้งหมดไว้ในสถานที่ห่างไกลมากกว่าในพื้นที่

นี่คือสคริปต์หากใครสนใจ:

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

ฉันคิดว่าการเพิ่มคีย์สามารถถือเป็น idempotent ได้จึงไม่จำเป็นต้องรับรายการคีย์
dmourati

คุณควรยอมรับserverfault.com/a/701884/127993ซึ่งทำสิ่งที่คุณต้องการ
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/

1

ทำ:

ssh someuser@IP_D

ดังนั้น

A -> B-> C -> D ที่ A คือโฮสต์ที่คุณอยู่

แก้ไข ~ / .ssh / config ในเครื่องของคุณดังนี้:

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'

คำตอบนี้ขึ้นอยู่กับคำตอบที่เลือก ฉันต้องหาวิธีที่ผู้ใช้หลายคนเข้ากับสถานการณ์ทั้งหมด

มันใช้งานได้สำหรับฉัน HTH


0

คำตอบของสโนว์บอลช่วยได้มาก อย่างไรก็ตามฉันได้ทำการแก้ไขคำสั่งและต้องการอธิบายวิธีการทำงาน รับสถานการณ์นี้:

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

แก้ไข~/.ssh/configไฟล์ของคุณและเพิ่มโฮสต์Bที่คุณต้องการข้ามไปเพียงแค่คุณกำหนดค่าโฮสต์:

Host B
 User myusername
 HostName b.mycompany.com

จากนั้นคุณเพิ่มโฮสต์Cที่คุณต้องการท้าย:

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

สังเกตProxyCommandที่:

  • ssh -T -qบ่งชี้ว่าไม่ควรจัดสรรหลอก -TTY ( -T) และจะเงียบ ( -q);
  • ครั้งหนึ่งในการกระโดดโฮสต์Bเราเพิ่มกุญแจลงในคีย์ SSH ของการAผ่านssh-add;
  • ซึ่งทำงานได้เพียงเพราะเราส่งตัวแทน SSH -o 'ForwardAgent yes'ใช้
  • ssh-add -t 1 ระบุว่าฉันต้องการเพิ่มคีย์สำหรับ 1 วินาทีที่จำเป็นในการตรวจสอบสิทธิ์กับโฮสต์ C สุดท้ายเท่านั้น
  • และในที่สุดก็nc %h %pเริ่มการnetcatเชื่อมต่อกับโฮสต์สุดท้าย%hที่พอร์ต%p(ทั้งสองจะถูกกรอกโดย SSH ตามข้อมูลใน~/.ssh/configไฟล์)

หากคุณต้องการระบุคีย์ที่กำหนดเองที่Bจะใช้คุณสามารถทำได้โดยการแก้ไขssh-addส่วน:

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'
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.