
Estou construindo ambientes Debian personalizados em um servidor remoto, ao qual me conecto por SSH. Isso envolve construir um ambiente debootstrap e, em seguida, fazer chroot nele para executar um instalador personalizado. Como parte do processo de instalação personalizada, preciso que o instalador seja capaz de sair do ambiente chroot para outro servidor remoto, reutilizando as credenciais SSH do meu agente sshforao chroot conhece.
Eu simplesmente não consigo pensar em como fazer isso. Em princípio, eupensarEu deveria ser capaz de usar socat para encaminhar $SSH_AUTH_SOCK para o ambiente chroot antes de chamar chroot assim:
socat UNIX-CONNECT:$SSH_AUTH_SOCK UNIX-LISTEN:chroot_root$SSH_AUTH_SOCK,fork &
sudo -E chroot chroot_root /bin/bash
Mas isso me dá um cano quebrado do socat assim que tento usar o ssh dentro do chroot, o que eu acho que é compreensível (de certa forma).
Existe alguma maneira de contornar isso? Eu tenho a opção de configurar um soquete mestre SSH antes de fazer o chroot e usá-lo para tudo dentro do chroot, mas isso envolveria uma reescrita bastante intrusiva do instalador, então estourealmentenão estou interessado nesse plano.
ATUALIZAR
Acontece que posso obter o efeito desejado simplesmente criando um link físico para o soquete. Sinceramente, não esperava que isso funcionasse.
Responder1
Você pode encaminhar o agente SSH para um chroot, mas precisa passar por alguns obstáculos, o primeiro dos quais é tornar o soquete acessível no chroot e o segundo é informar aos usuários do chroot sobre isso.
Para disponibilizar o soquete, a sugestão do OP de usar socat
funciona desde que as permissões sejam definidas corretamente. Supondo que você esteja usando um script para iniciar o chroot, o trecho a seguir é usado socat
para fornecer o soquete do agente no 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
Estabelece o uid
e gid
do usuário (Aliceno exemplo) dentro do chroot que deve poder acessar o agente. Em seguida, ele cria esse diretório e estabelece socat
praticamente a mesma maneira que o OP. A adição é o user=${_owner%:*}
pirce que define o uid no soquete dentro do chroot para queAlicepode acessá-lo.
Em seguida, ele se lembra do socat
PID para que possa ser eliminado quando o chroot sair. Por fim exporta a SSH_AUTH_SOCK
variável para disponibilizá-la dentro do chroot.
Agora, chroot
só pode ser feito, root
então meu palpite é que o script seja executado sudo
por um usuário comum que possui o processo do agente. Se isso estiver correto, então há mais uma coisa a fazer: permitir sudo
a passagem do ambiente variável para o script. Para fazer isso, edite /etc sudoers
(o mecanismo aprovado é assim sudo visudo
) e adicione o seguinte:
Defaults env_keep+=SSH_AUTH_SOCK
Esta mudança também precisa ser feita /etc/sudoers
dentro do chroot se sudo
for usada dentro do chroot (ou seja, para mudar de root
para alice
).
Aqui está um exemplo de soquete de agente dentro de um chroot visualizado por um usuário comum.
$ ls -l $SSH_AUTH_SOCK
srwxr-xr-x 1 alice root 0 Feb 1 15:06 /tmp/ssh-q1ntaubl6I2z/agent.1443