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

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

Я создаю пользовательские среды Debian на удаленном сервере, к которому я подключаюсь по SSH. Это включает в себя создание среды debootstrap, затем chroot в нее для запуска пользовательского установщика. В рамках процесса пользовательской установки мне нужно, чтобы установщик мог выходить по 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 и использовать его для всего внутри chroot, но это потребует довольно серьезной переделки установщика, поэтому яДействительноне в восторге от этого плана.

ОБНОВЛЯТЬ

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

решение1

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

Чтобы сделать сокет доступным, предложение OP использовать 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пользователя (алисав примере) в chroot, который должен иметь доступ к агенту. Затем он создает этот каталог и устанавливает его socatпрактически так же, как OP. Дополнением является pirce user=${_owner%:*}, который устанавливает uid на сокете в chroot, так чтоалисаможет получить к нему доступ.

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


Теперь, chrootможно сделать только rootтак, я предполагаю, что скрипт запускается sudoот обычного пользователя, который владеет процессом агента. Если это точно, то есть еще одна вещь, которую нужно сделать, а именно разрешить sudoпередавать переменную окружения в скрипт. Чтобы сделать это, отредактируйте /etc sudoers(одобренный механизм — so 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

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