B의 개인 키를 사용하여 A에서 B에서 C로 SSH


59

로컬 컴퓨터 A에서 프록시 B를 통해 대상 호스트 C로 SSH하는 간단한 방법을 찾고 있습니다 .C의 공개 키와 함께 제공되는 개인 키는 B에 있으며, 로컬 컴퓨터에 해당 키를 넣습니다. 팁이 있습니까?

또한 ~ / .ssh / config를 사용 하여이 작업을 수행하고 싶습니다.

감사!


1
A에서 B로 SSH하고 C에서 SSH로 하시겠습니까? 아니면 프록시가 진정한 통과 상황입니까?
Thinice

A에서 C로 ssh하고 B를 통과하고 싶습니다. 아래의 대답은 통과 부분에서 작동하지만 여전히 통과 호스트 인 B 대신 로컬 컴퓨터에서 IdentityFile을 찾으려고 시도합니다.
커맨더

답변:


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/configA추가

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

B의 ssh 개인 키가 비표준 위치에 있으면 뒤에 경로를 추가하십시오 ssh-add.

이제 액세스 할 수 있어야 C에서 A:

A$ ssh C
C$

13
4 년 밖에 걸리지 않았지만 답이있는 것 같습니다! 최고
커맨더 September

3
openssh v.7.3부터는을 사용할 수 있습니다 ProxyJump B. 출처 : Wikibooks
Keith

2
이 같은 것을 정의 할 수 있습니다 : @ C ProxyCommand SSH -o 사용자 1 호스트 'ForwardAgent 예'사용자 2의 @의 B 'NC % 시간 % 포인트 && SSH-추가'
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에서 실행될 명령을 지정 합니다.


이것은 작동하지만 B에서 IdentityFile을 가져 오지 않습니다. 여전히 A를 찾습니다.
wrangler

@DrewVS 답변을 업데이트했습니다. 그것이 당신을 위해 작동하는지 확인하십시오.
Sachin Divekar

Sachin, 매우 영리합니다. 완벽하게 작동했습니다. 정말 고마워!
커맨더

@DrewVS는 여러분에게 도움이되었다 니 다행입니다. 답변을 수락하십시오.
Sachin Divekar

그러나 암호로 보호 된 rsa 키에서는 작동하지 않는 것 같습니다. 비밀번호 입력이 숨겨져 있으므로 사용자가이 방법을 사용하려면 ssh 키에 키를 추가해야합니다. 어떤 아이디어?
커맨더

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'의 ID 파일은 'B'의 ssh 키 경로입니다. ProxyCommand는 Netcat을 사용하여 'B'에서 'C'에 대한 연결을 엽니 다. Netcat 또는 nc는 'B'에 설치해야합니다.

이것이 다른 사람들을 돕기를 바랍니다.


3
너무 빨리 말 했어요 이 솔루션은 작동하지 않습니다. 키가 ssh-agent에로드되었으므로 작동한다고 생각했습니다. 위에서 C의 키는 여전히 B가 아닌 A에 있어야합니다.
wrangler

2

기본적으로 원격 인스턴스에 내 ssh 키를 나열하고 선택한 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

키를 추가하면 dem 등원으로 취급되어 키 목록을 가져올 필요가 없다고 생각합니다.
dmourati 2016 년

원하는 것을 정확하게 수행하는 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, 우리는 A통해 SSH 키에 키를 추가합니다 ssh-add;
  • 우리는를 사용하여 SSH 에이전트를 전달했기 때문에 작동합니다 -o 'ForwardAgent yes'.
  • ssh-add -t 1 최종 호스트 C에 인증하는 데 필요한 1 초 동안 만 키를 추가하고 싶다는 것을 나타냅니다.
  • 마지막으로 포트에서 최종 호스트 에 nc %h %p대한 netcat연결을 시작합니다 (둘 다 파일 의 정보를 기반으로 SSH로 채워짐 ).%h%p~/.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.