Я создаю пользовательские среды 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