ssh-agent: копирование файлов через rsync между удалёнными серверами

Введение

Как правило, для входа на удаленные серверы используется ssh-ключ. При необходимости скопировать файлы с одного удаленного сервера на другой в такой ситуации подходят два варианта:

  1. копировать к себе на локальный компьютер файлы, а с локального уже по месту назначения
  2. с одного удалённого сервера настраивать доступ ко второму удалённому серверу (пароль или ещё один ключ)

Оба эти варианта имеют право на жизнь, но не всегда применимы, а потому есть более удобный способ с применением ssh-agent. Агент отслеживает идентификационные ключи пользователей и их парольные фразы, для возможности входа на другие серверы без повторного ввода пользователем пароля или ключевой фразы.

Используется такая схема: workstation -> server1 -> server2

Ключ с рабочей станции прокидывается на server1, с которого уже можно подключаться на server2, используя прокинутый ключ.

Запуск ssh-agent

  • Если уже имеется ssh-client, сгенерирован ssh-key и настроен доступ к удалённым серверам по этому ключу, то для запуска ssh-agent достаточно выполнить следующую команду:
eval `ssh-agent`

Используется eval, потому что команда ssh-agent просто выводит переменные окружения, а eval загружает их в оболочку для последующего использования. Переменные следующие:

SSH_AUTH_SOCK=/tmp/ssh-gbpVsO1oELVC/agent.11713; export SSH_AUTH_SOCK;
SSH_AGENT_PID=11714; export SSH_AGENT_PID;
echo Agent pid 11714;

В $SSH_AUTH_SOCK хранится путь до сокета, который собственно и пробрасывается на удаленные серверы.

  • После запуска необходимо добавить ключи в агент, выполнив команду:
ssh-add

По умолчанию будут добавлены ключи из стандартного пути ~./ssh, при необходимости можно указать явно путь.

  • Для проверки, что ключ добавлен, выполнить команду:
ssh-add -l
2048 SHA256:WV4+lDdR32EODDfTodU/+hPVigPyiPQCvGi1qjPpAs /home/it-lux/.ssh/id_rsa (RSA)

Вывод не должен быть пустой. Также можно использовать аргумент ssh-add -L для вывода ключа целиком.

  • Для подключения с возможностью проброса ssh-ключа к удаленному серверу, в конфигурационном файле ~.ssh/config клиента необходимо указать проброс агента:
Host server1
  ForwardAgent yes
  • После чего можно выполнять подключение на удаленный сервер:
ssh $USER@server1
  • Оказавшись на удаленном сервере, необходимо проверить, что в каталоге /tmp появился сокет, а переменная SSH_AUTH_SOCK не пустая:
echo "$SSH_AUTH_SOCK"
/tmp/ssh-9iu1Y7numW/agent.12163

Если переменная пустая, значит что-то сделано не так:

  • агент на клиенте не запущен или наоборот запущено несколько копий
  • не добавлен ключ
  • в конфиге ~.ssh/config ошибка

Теперь с удаленного server1 можно подключаться на server2 при условии, что на server2 настроен вход по ключу с рабочей станции:

server1> ssh $USER@server2

Передача файлов через rsync между удалёнными серверами

После настройки ssh-agent и получения возможности подключения к серверам с пробросом ключа может возникнуть необходимость передачи файлов. При использовании rsync ничего нового придумывать не надо:

server1> rsync -av test_dir server2:/home/$USER/test_dir

Но при необходимости передать по аналогии выше через тот же rsync файлы с server1, принадлежащие root или другому пользователю, даже при наличии требуемых sudo привилегий, может возникнуть нюанс.

sudo rsync -av /root server2:/home/$USER
root@server2's password:

Будет запрошен пароль, причём для root, т.к. изменился пользователь и переменные окружения вместе с ним. А потому обходной путь следующий:

sudo -E sh -c 'rsync -av /root $USER@server2:/home/$USER'

sudo -E сохраняет переменные окружения от текущего пользователя и запускает новую оболочку с ними, а в rysnc для сервера назначения указан пользователь, для которого прокинут ключ, поэтому в таком виде файлы будут успешно переданы без пароля.

При необходимости на удаленном сервере server2 запустить rsync с правами sudo, необходимо добавить флаг:

sudo -E sh -c 'rsync -av --rsync-path 'sudo rsync' /root $USER@server2:/home/$USER'

Заключение

Таким простым и нехитрым способом можно прыгать по серверам и передавать между ними файлы. Важные моменты:

  • в .ssh/config указывать звёздочку, т.е. проброс агента для всех серверов, не очень хорошая идея по части безопасности – любой пользователь может воспользоваться прокинутым ключом в своих интересах
  • для подключения с server2 на server3, т.е. дальше по цепочке, на server2 должен быть настроен проброс ForwardAgent

Понравилась статья? Поделиться с друзьями:
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: