
Я создаю пользовательские среды 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, так чтоалисаможет получить к нему доступ.
Затем он запоминает socat
PID, чтобы его можно было удалить при выходе из 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