O socat pode ser usado para encaminhar um soquete do agente ssh para um chroot?

O socat pode ser usado para encaminhar um soquete do agente ssh para um chroot?

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 socatfunciona desde que as permissões sejam definidas corretamente. Supondo que você esteja usando um script para iniciar o chroot, o trecho a seguir é usado socatpara 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 uide giddo usuário (Aliceno exemplo) dentro do chroot que deve poder acessar o agente. Em seguida, ele cria esse diretório e estabelece socatpraticamente 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 socatPID para que possa ser eliminado quando o chroot sair. Por fim exporta a SSH_AUTH_SOCKvariável para disponibilizá-la dentro do chroot.


Agora, chrootsó pode ser feito, rootentão meu palpite é que o script seja executado sudopor um usuário comum que possui o processo do agente. Se isso estiver correto, então há mais uma coisa a fazer: permitir sudoa 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/sudoersdentro do chroot se sudofor usada dentro do chroot (ou seja, para mudar de rootpara 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

informação relacionada