Pode socat ser usado para encaminhar um soquete ssh-agent para um chroot?

4

Estou criando ambientes Debian personalizados em um servidor remoto, ao qual me conecto por meio de SSH. Isso envolve a criação de um ambiente de debootstrap e, em seguida, o uso de um script para executar um instalador customizado. Como parte do processo de instalação personalizada, eu preciso do instalador para poder fazer ssh fora do ambiente chroot para um servidor remoto adicional, reutilizando as credenciais SSH que meu ssh-agent fora o chroot conhece .

Eu simplesmente não consigo pensar em como fazer isso. Em princípio, eu penso que eu deveria ser capaz de usar socat para encaminhar o $ SSH_AUTH_SOCK para o ambiente chroot antes de chamar o 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 da socat assim que eu 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 um fallback de configurar um socket master SSH antes de chrooting e usar isso para tudo dentro do chroot, mas isso envolveria uma reescrita bastante intrusiva do instalador, então eu sou realmente não interessada sobre esse plano.

UPDATE

Acontece que posso obter o efeito que quero simplesmente criando um link físico para o soquete. Eu sinceramente não esperava que isso funcionasse.

    
por regularfry 12.08.2010 / 10:57

1 resposta

1

Você pode encaminhar o Agente SSH para um chroot, mas você tem que passar por alguns arcos, o primeiro dos quais está tornando o soquete acessível no chroot e o segundo está dizendo aos usuários dentro do chroot sobre isso.

Para disponibilizar o soquete, a sugestão do OP de usar socat funciona desde que as permissões estejam definidas corretamente. Supondo que você esteja usando um script para iniciar o chroot, o snippet a seguir usa 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 ( alice no exemplo) dentro do chroot que deve ser capaz de acessar o agente. Em seguida, ele cria esse diretório e estabelece um socat praticamente da mesma maneira que o OP. A adição é o user=${_owner%:*} pirce que define o uid no socket dentro do chroot para que alice possa acessá-lo.

Em seguida, ele lembra o socat PID para que ele possa ser removido quando o chroot sair. Finalmente, ele exporta a variável SSH_AUTH_SOCK para disponibilizá-la no chroot.

Agora, chroot só pode ser feito por root , então acho que o script é executado com sudo de um usuário comum que possui o processo do agente. Se isto for preciso, então há mais uma coisa a fazer que é permitir que sudo passe o ambiente variável para o script. Para fazer isso, edite /etc sudoers (o mecanismo aprovado é para sudo visudo ) e adicione o seguinte:

Defaults env_keep+=SSH_AUTH_SOCK

Essa mudança também precisa ser feita para /etc/sudoers no chroot se sudo for usado dentro do chroot (ou seja, para mudar de root para alice ).

Aqui está um exemplo de um soquete de agente dentro de um chroot visto 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
    
por 01.02.2017 / 16:30