Как подключиться по SSH к серверу, который доступен и адресуем только с хоста Jump?

Как подключиться по SSH к серверу, который доступен и адресуем только с хоста Jump?

Я могу подключиться по SSH к серверу Jump Host B с моей локальной машины A через ssh B.

Сервер C адресуем (имеет адрес C.internal) и доступен из B только через ssh C.

Как подключиться по SSH к C напрямую с моей локальной машины?

Как будут выглядеть команда SSH и файл конфигурации?

Конфигурация ssh на A:

Host B
    User userB
    HostName B.example.com
    IdentityFile ~/.ssh/keyB

Конфигурация ssh на B:

Host C
  HostName C.internal
  User userC
  IdentityFile ~/.ssh/keyC

Можно ли это сделать без копирования ~/.ssh/keyCс хоста B на локальную машину A?

решение1

Существует несколько вариантов, но ни один из них не является «единой командой»:

Вы можете запустить команду SSH для B, которая просто запустит вторую команду SSH для C; вам нужно добавить опцию, -tчтобы она работала для интерактивного SSH:

  • ssh -t hostB "ssh hostC"
  • ssh -t hostB "ssh -t hostC htop"
  • ssh hostB ssh hostC ls -la /etc

Если вам нужен способ SSH «напрямую» из A в C, вам понадобится дополнительное приспособление для перенаправления соединения ssh-agent.из Бк местной системе (т.е. наоборот тому, что ssh -Aобычно делается).

  1. SSH к хосту B, затем запустите ssh-agent по указанному вручную пути. Используйте функцию SSH "stream forward", чтобы разрешить локальным клиентам доступ к удаленному процессу агента:

    HostA$ ssh -t -L /tmp/agent:/tmp/agent HostB \
        "ssh-agent -a /tmp/agent sh -c 'ssh-add ~/.ssh/keyC && sleep infinity'"
    

    (Опция ssh/config — LocalForward.)

  2. Пока указанное выше соединение работает, вы можете подключиться с HostA на HostC, используя обычную конфигурацию ProxyJump, используя ключи, которые существуют только на HostB:

    HostA$ export SSH_AUTH_SOCK=/tmp/agent
    HostA$ ssh -J HostB HostC
    

    (Параметры ssh/config — IdentityAgentи ProxyJump.)


Другой вариант — скопировать keyCиз B в A и сохранить его.на защищенном оборудованиинапример, чип TPM или смарт-карта (Yubikey с режимом PIV также считается). Это позволяет использовать ключ локально на машине A без возможности его кражи.

(Для TPM2.0 в Linux можно выбрать либо , tpm2-pkcs11либо ssh-tpm-agent; TPM2.0 в Windows можно использовать через PuTTY-CAC. Для Yubikeys с PIV существуют модули PKCS#11 как для Windows, так и для Linux. Я использую eToken 5110 с Ebay. Также есть способ использовать ключи FIDO2 с SSH, но для этого потребуется сгенерировать новый ключ.)

решение2

Вам нужен файл ssh_config, например глобальный /etc/ssh/ssh_configили пользовательский ~/.ssh/config:

Host B
  HostName 10.0.0.1
  User username_on_B
  IdentityFile ~/.ssh/id_rsa_for_B
  ForwardAgent yes

# final destination
Host C
  HostName C.internal
  User your_username_on_C
  ProxyJump B
  IdentityFile ~/.ssh/id_rsa_for_C

Теперь, из A, вы можете ssh C.

Связанный контент