Можно ли использовать socat для перенаправления сокета ssh-agent в chroot?

Я создаю пользовательские среды Debian на удаленном сервере, к которому я подключаюсь по SSH. Это включает создание среды debootstrap, а затем привязку к ней для запуска пользовательского установщика. Как часть процесса пользовательской установки, мне нужно, чтобы установщик имел возможность ssh выйти из среды chroot на другой удаленный сервер, повторно используя учетные данные SSH, о которых знает мой ssh-agent вне chroot.

Я просто не могу думать, как это сделать. В принципе, я думаю, что я должен иметь возможность использовать socat для перенаправления $SSH_AUTH_SOCK в среду chroot перед вызовом chroot следующим образом:

socat UNIX-CONNECT:$SSH_AUTH_SOCK UNIX-LISTEN:chroot_root$SSH_AUTH_SOCK,fork &
sudo -E chroot chroot_root /bin/bash

Но это дает мне сломанный канал от socat, как только я пытаюсь использовать ssh внутри chroot, что, я думаю, понятно (в некотором смысле).

Есть ли способ обойти это? У меня есть запасной вариант настройки мастер-сокета SSH до начала хроматирования и его использования для всего, что находится внутри chroot, но это может повлечь за собой довольно навязчивую переписку установщика, поэтому я действительно не заинтересован в этом плане.

ОБНОВИТЬ

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

1 ответ

Вы можете переслать SSH-агент в chroot, но вы должны перепрыгнуть через несколько циклов, первый из которых делает сокет доступным в chroot, а второй рассказывает об этом пользователям внутри chroot.

Чтобы сделать розетку доступной, предложение ОП использовать socat работает до тех пор, пока разрешения установлены правильно. Предполагая, что вы используете скрипт для запуска chroot, следующий фрагмент использует socat для предоставления сокета агента в chroot:

# Set up a SSH AGENT forward socket
if [ -n "$SSH_AUTH_SOCK" ]
then
  _dir="$mnt$(dirname $SSH_AUTH_SOCK)"
  _owner=$(awk -F':' '{if ($1=="alice") {print $3":"$4}}' $mnt/etc/passwd)
  mkdir "$_dir"
  chown "$_owner" "$_dir"
  socat UNIX-CONNECT:$SSH_AUTH_SOCK \
        UNIX-LISTEN:$mnt$SSH_AUTH_SOCK,fork,user=${_owner%:*} &
  socat_pid=$!
  export SSH_AUTH_SOCK
fi

Это устанавливает uid а также gid пользователя (в примереalice) в chroot, который должен иметь доступ к агенту. Затем он создает этот каталог и устанавливает socat в значительной степени так же, как ОП. Дополнение является user=${_owner%:*} pirce, который устанавливает uid на сокете внутри chroot, чтобы Алиса могла получить к нему доступ.

Затем он вспоминает socat PID, чтобы его можно было снести при выходе из chroot. Наконец это экспортирует SSH_AUTH_SOCK переменная, чтобы сделать его доступным в chroot.


Сейчас, chroot может быть сделано только root так что я думаю, что скрипт запускается с sudo от обычного пользователя, которому принадлежит процесс агента. Если это точно, то есть еще одна вещь, которая должна сделать sudo передать окружение в сценарий. Для этого отредактируйте /etc sudoers (утвержденный механизм так sudo visudo) и добавьте следующее:

Defaults env_keep+=SSH_AUTH_SOCK

Это изменение также необходимо внести в /etc/sudoers в chroot, если sudo будет использоваться внутри chroot (т.е. для переключения с root в alice).

Вот пример сокета агента в chroot, который просматривает обычный пользователь.

$ ls -l $SSH_AUTH_SOCK
srwxr-xr-x 1 alice root 0 Feb  1 15:06 /tmp/ssh-q1ntaubl6I2z/agent.1443
Другие вопросы по тегам