SSH từ A đến B đến C, sử dụng khóa riêng trên B


59

Tôi đang tìm một cách đơn giản để SSH từ máy cục bộ của mình, A, thông qua proxy, B, đến máy chủ đích, C. Khóa riêng đi cùng với khóa chung trên C là trên B và tôi không thể đặt chìa khóa đó vào máy cục bộ của tôi Lời khuyên nào?

Ngoài ra, tôi muốn có thể làm điều này bằng cách sử dụng ~ / .ssh / config.

Cảm ơn!


1
Bạn đang nói rằng bạn muốn ssh từ A đến B, và sau đó SSH đến C? Hoặc proxy là một tình huống thông qua thực sự?
mỏng

Tôi muốn ssh từ A đến C, đi qua B. Câu trả lời của tôi dưới đây hoạt động cho phần chuyển qua, nhưng nó vẫn cố gắng tìm kiếm IdentityFile trên máy tính cục bộ của tôi thay vì trên B, máy chủ lưu trữ.
wrangler

Câu trả lời:


74

Sơ đồ:

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

Điều kiện tiên quyết:

  • A đang chạy ssh-agent;
  • Acó thể truy cập B;
  • Bcó thể truy cập C;
  • AKhóa công khai ssh có mặt trong B:~/.ssh/authorized_keys
  • BKhóa công khai ssh có mặt trong C:~/.ssh/authorized_keys

Trong ~/.ssh/configngày A, thêm

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

Nếu khóa riêng ssh của bạn trên B ở vị trí không chuẩn, hãy thêm đường dẫn của nó sau ssh-add.

Bây giờ bạn có thể truy cập Ctừ A:

A$ ssh C
C$

13
Chỉ mất 4 năm, nhưng có vẻ như chúng tôi đã có câu trả lời! Tuyệt vời
wrangler

3
Bắt đầu với openssh v.7.3, bạn chỉ có thể sử dụng ProxyJump B. nguồn: wikibooks
Keith

2
Điều này có thể được định nghĩa sao cho: Host user1 @ c ProxyCommand ssh -o 'ForwardAgent yes' user2 @ B 'ssh-add && nc% h% p'
Ravindranath Akila

2
Giải pháp sẽ thay đổi như thế nào nếu máy B không có nc?
mjalajel 18/03/2017

1
@DrewVS Ok, chúng ta cần thêm ForwardAgent yes trước khi các ProxyJumplệnh.
Graodes

22

Kiểm tra nếu sau đây là làm việc.

ssh -t B ssh C

Sử dụng lệnh sau nếu bạn muốn sử dụng khóa được lưu trữ trên B.

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

Ở đây chúng tôi đang chỉ định lệnh tức là ssh -i /path/to/identity_on_B Cđược thực thi trên B thay vì shell đăng nhập.


Điều này hoạt động nhưng nó không nhận được IdentityFile từ B. Nó vẫn nhìn vào A.
wrangler

@DrewVS Tôi đã cập nhật câu trả lời. Vui lòng kiểm tra nếu nó đang làm việc cho bạn.
Sachin Divekar

Sachin, rất thông minh. Điều đó đã làm việc hoàn hảo. Cám ơn rất nhiều!
wrangler

@DrewVS rất vui khi biết rằng nó hiệu quả với bạn. vì vậy hãy chấp nhận câu trả lời
Sachin Divekar

Tuy nhiên, có vẻ như điều này không hoạt động với các khóa rsa được bảo vệ bằng mật khẩu. Đầu vào mật khẩu bị ẩn, buộc người dùng phải thêm khóa vào khóa ssh của họ để phương pháp này hoạt động. Có ý kiến ​​gì không?
wrangler

10

Tôi đã làm việc này bây giờ. Đây là giải pháp, khá đơn giản. Tôi nên thấy nó sớm hơn:

~ / .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' là máy chủ Proxy mà bạn đang nhảy qua. Nó nên được cấu hình như bình thường bạn sẽ cấu hình quyền truy cập vào một máy chủ.

'C' là máy chủ đích. Nó cần được cấu hình để sử dụng 'B' trong quá trình kết nối. Tệp nhận dạng trong 'C' là đường dẫn đến khóa ssh trên 'B'. ProxyCommand sử dụng Netcat để mở kết nối tới 'C' từ 'B'. Netcat, hoặc nc, sẽ cần phải được cài đặt trên 'B'.

Hy vọng điều này sẽ giúp những người khác.


3
Tôi đã nói quá sớm. Giải pháp này không nhìn thấy để làm việc. Khóa đã được tải trong ssh-agent, vì vậy tôi nghĩ rằng nó đang hoạt động. Ở phần trên, chìa khóa cho C vẫn cần phải ở trên A, chứ không phải B.
wrangler

2

Tôi đã viết một tập lệnh đơn giản để cơ bản liệt kê các khóa ssh của tôi trên cá thể từ xa, và sau đó thêm tập lệnh tôi đã chọn vào tác nhân ssh cục bộ. Điều này không phải là rất sạch sẽ, nhưng cho phép tôi giữ tất cả các phím trên một vị trí từ xa chứ không phải cục bộ.

Đây là kịch bản nếu có ai quan tâm:

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

Tôi nghĩ rằng việc thêm một khóa có thể được coi là tạm thời do đó loại bỏ sự cần thiết phải có danh sách khóa.
dmourati

Bạn nên chấp nhận serverfault.com/a/701884/127993 , chính xác những gì bạn muốn.
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

Làm:

ssh someuser@IP_D

như vậy mà

A -> B-> C -> D nơi A là máy chủ bạn đang ở,

chỉnh sửa cục bộ của bạn ~ / .ssh / config như vậy:

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'

Câu trả lời này dựa trên câu trả lời được chọn. Tôi đã phải tìm ra cách nhiều người dùng phù hợp với toàn bộ kịch bản.

Điều này làm việc cho tôi. HTH.


0

Câu trả lời của Snowball đã giúp rất nhiều. Tuy nhiên, tôi đã thực hiện một số sửa đổi cho lệnh và muốn giải thích cách thức hoạt động của nó. Đưa ra tình huống này:

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

Sửa đổi ~/.ssh/configtệp của bạn và thêm máy chủ Bmà bạn muốn nhảy qua, giống như cách bạn thường định cấu hình máy chủ:

Host B
 User myusername
 HostName b.mycompany.com

Sau đó, bạn thêm máy chủ Cmà bạn muốn kết thú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'

Lưu ý ProxyCommand, trong đó:

  • ssh -T -qchỉ ra rằng nó không nên phân bổ giả TTY ( -T) và im lặng ( -q);
  • một lần trên máy chủ nhảy B, chúng tôi thêm khóa vào các khóa SSH Athông qua ssh-add;
  • chỉ hoạt động vì chúng tôi đã chuyển tiếp tác nhân SSH bằng cách sử dụng -o 'ForwardAgent yes'.
  • ssh-add -t 1 chỉ ra rằng tôi muốn khóa chỉ được thêm trong 1 giây để xác thực với máy chủ C cuối cùng;
  • và cuối cùng, nc %h %pbắt đầu một netcatkết nối đến máy chủ cuối cùng %htại cổng %p(cả hai sẽ được điền bởi SSH dựa trên thông tin trong ~/.ssh/configtệp).

Nếu bạn cần chỉ định một khóa tùy chỉnh Bđể sử dụng, bạn có thể làm điều đó bằng cách sửa đổi ssh-addphần:

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'
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.