Вопрос или проблема
Я хочу подключиться с хоста A через хост B через хост C к хосту D с использованием SSH-ключей, не изменяя конфигурацию SSH.
Хост A находится в открытом интернете, хосты B, C и D находятся в одной локальной сети.
- Хост B принимает ключи от хоста A.
- Хост C принимает только ключи от хоста A.
- Хост D принимает только ключи от хоста A.
Это возможно?
При условии, что все хосты — A, B, C и D — имеют открытый ключ вашего клиента в соответствующем файле ~/.ssh/authorized_keys
, вам просто нужно использовать опцию -A
(пересылка агента аутентификации) с начальным SSH-соединением так:
ssh -A hostA.com
Дополнительную информацию об опции -A
(пересылка агента аутентификации) можно найти на странице man
; man ssh
:
“
-A
Включает пересылку соединения агента аутентификации. Это также может быть указано для каждого хоста в конфигурационном файле.Пересылка агента должна быть включена с осторожностью. Пользователи, имеющие возможность обойти права доступа к файлам на удалённом хосте (для сокета Unix-домена агента), могут получить доступ к локальному агенту через пересланное соединение. Нападающий не может получить ключевые материалы от агента, однако он может выполнять операции с ключами, которые позволяют ему аутентифицироваться с использованием идентификаторов, загруженных в агента.”
Ответ или решение
Как подключиться к нескольким хостам через SSH с помощью ключей
Подключение через SSH к нескольким хостам, где каждый промежуточный хост принимает только ключи от первого хоста, является распространенной задачей среди системных администраторов и DevOps-специалистов. В данной статье мы подробно рассмотрим, как организовать такое подключение, с использованием SSH-агента и ключей, не редактируя конфигурацию SSH.
Проблема
В данном сценарии у нас имеется четыре хоста:
- Хост A: ваш локальный компьютер с доступом к интернету.
- Хост B: первый промежуточный хост, который принимает ключи только от хоста A.
- Хост C: второй промежуточный хост с такими же ограничениями.
- Хост D: конечный хост, куда вы хотите подключиться.
Все хосты B, C и D находятся в одной локальной сети и должны принимать ключи только от хоста A.
Решение
Для решения данной задачи нам поможет параметр -A
, который позволяет использовать перенаправление SSH-агента. Это дает возможность гостевым хостам (B, C и D) использовать ключи, загруженные в SSH-агент на вашем локальном компьютере (A).
Шаги для выполнения
-
Подготовьте SSH-ключи: Убедитесь, что на хосте A у вас есть SSH-ключи (по умолчанию это
~/.ssh/id_rsa
и~/.ssh/id_rsa.pub
). Обязательно добавьте открытый ключ в файл~/.ssh/authorized_keys
на хостах B, C и D. -
Запустите SSH-агент: На вашем локальном хосте A убедитесь, что SSH-агент запущен. Откройте терминал и выполните команду:
eval "$(ssh-agent -s)"
-
Добавьте ключ в агент: Если ключи уже не добавлены в агент, выполните следующую команду:
ssh-add ~/.ssh/id_rsa
-
Подключитесь к хосту B с перенаправлением агента: Используйте параметр
-A
при подключении к хосту B:ssh -A user@hostB
Замените
user
на ваше имя пользователя на хосте B. -
Подключитесь к хосту C: Теперь, находясь на хосте B, вы можете подключиться к хосту C также с перенаправлением агента:
ssh -A user@hostC
-
Подключитесь к хосту D: Последний шаг – подключение к хосту D:
ssh -A user@hostD
Теперь вы успешно подключились к хосту D через промежуточные хосты B и C, используя ключи от вашего локального компьютера A.
Важные замечания
-
Безопасность: Применяйте перенаправление агента с осторожностью. Если на промежуточных хостах кто-то сможет обойти права доступа к файлам, то это может привести к компрометации вашего агентского доступа.
-
Избегайте хранения паролей: На хостах B, C и D не должно быть сохраненных паролей. Используйте только ключи для аутентификации.
-
Мониторинг: Рекомендуется применять мониторинг доступа на промежуточных и конечных хостах, чтобы быть в курсе любых потенциально несанкционированных действий.
Заключение
Подключение через несколько хостов с помощью SSH с использованием ключей возможно и достаточно просто, благодаря возможностям SSH-агента. Следуя описанным шагам, вы можете обеспечить безопасное и эффективное соединение между хостами, сохраняя при этом высокие стандарты безопасности.