Назад | Перейти на главную страницу

Можно ли использовать 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 и использовать его для всего внутри chroot, но это потребует довольно навязчивой перезаписи установщика, поэтому я действительно не в восторге от этого плана.

ОБНОВИТЬ

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

Вы можете перенаправить агента 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. Дополнением является 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