Использование ssh-агента с докере

Я хотел бы использовать ssh-agent для пересылки моих ключей в образ докеры и вытащить из частного репита github.

Я использую слегка измененную версию https://github.com/phusion/passenger-docker с boot2docker на Yosemite.

ssh-add -l
...key details
boot2docker up

Затем я использую команду, которую я видел в нескольких местах (т.е. https://gist.github.com/d11wtq/8699521):

docker run --rm -t -i -v $SSH_AUTH_SOCK:/ssh-agent -e SSH_AUTH_SOCK=/ssh-agent my_image /bin/bash

Однако он не работает:

[email protected]:/# ssh-add -l
Could not open a connection to your authentication agent.

[email protected]:/# eval `ssh-agent -s`
Agent pid 19

[email protected]:/# ssh-add -l
The agent has no identities.

[email protected]:/# ssh [email protected]
Warning: Permanently added the RSA host key for IP address '192.30.252.128' to the list of known hosts.
Permission denied (publickey).

Ответы

Ответ 1

Я расширил ответ @wilwilson и создал script, который будет настраивать перенаправление агентов в среде OS2 boot2docker.

https://gist.github.com/rcoup/53e8dee9f5ea27a51855

#!/bin/bash

# Use a unique ssh socket name per-invocation of this script
SSH_SOCK=boot2docker.$$.ssh.socket

# ssh into boot2docker with agent forwarding
ssh -i ~/.ssh/id_boot2docker \
    -o StrictHostKeyChecking=no \
    -o IdentitiesOnly=yes \
    -o UserKnownHostsFile=/dev/null \
    -o LogLevel=quiet \
    -p 2022 [email protected] \
    -A -M -S $SSH_SOCK -f -n \
    tail -f /dev/null

# get the agent socket path from the boot2docker vm
B2D_AGENT_SOCK=$(ssh -S $SSH_SOCK [email protected] echo \$SSH_AUTH_SOCK)

# mount the socket (from the boot2docker vm) onto the docker container
# and set the ssh agent environment variable so ssh tools pick it up
docker run \
    -v $B2D_AGENT_SOCK:/ssh-agent \
    -e "SSH_AUTH_SOCK=/ssh-agent" \
    "[email protected]"

# we're done; kill off the boot2docker ssh agent
ssh -S $SSH_SOCK -O exit [email protected]

Вставьте его в ~/bin/docker-run-ssh, chmod +x и используйте docker-run-ssh вместо docker run.

Ответ 2

Я столкнулся с подобной проблемой и смог сделать все довольно легко, используя ssh в режиме master с помощью управляющего сокета и завернув все это в script следующим образом:

#!/bin/sh   

ssh -i ~/.vagrant.d/insecure_private_key -p 2222 -A -M -S ssh.socket -f [email protected] tail -f /dev/null

HOST_SSH_AUTH_SOCK=$(ssh -S ssh.socket [email protected] env | grep "SSH_AUTH_SOCK" | cut -f 2 -d =)

docker run -v $HOST_SSH_AUTH_SOCK:/ssh-agent \
       -e "SSH_AUTH_SOCK=/ssh-agent" \
       -t hello-world "[email protected]"

ssh -S ssh.socket -O exit [email protected]

Не самая красивая вещь во вселенной, но намного лучше, чем ручное сохранение сеанса SSH, открывающего IMO.

Ответ 4

Для меня доступ к ssh-agent для пересылки ключей, работающих на OSX Mavericks и докере 1.5, следующим образом:

  • ssh в виртуальную машину boot2docker с помощью boot2docker ssh -A. Не забудьте использовать опцию -A, которая позволяет перенаправлять соединение агента аутентификации.

  • Внутри сеанса ssh boot2docker:

    docker @boot2docker: ~ $echo $SSH_AUTH_SOCK /tmp/ssh -BRLb99Y69U/agent.7750

Этот сеанс должен оставаться открытым. Обратите внимание на значение переменной среды SSH_AUTH_SOCK.

  1. В другом терминале OS X команда docker запускается со значением SSH_AUTH_SOCK с шага 2 следующим образом:

    docker run --rm -t -i \ -v/tmp/ssh-BRLb99Y69U/agent.7750:/ssh-agent \ -e SSH_AUTH_SOCK =/ssh-agent my_image/bin/bash root @600d0e9b443d:/# ssh-add -l 2048 6c: 8e: 82: 08: 74: 33: 78: 61: f9: 9a: 74: 1b: 65: 46: be: eb/Users/dev/.ssh/id_rsa (RSA)

Мне действительно не нравится тот факт, что я должен держать сессию ssh boot2docker открытой для выполнения этой работы, но пока не будет найдено лучшее решение, это по крайней мере сработало для меня.

Ответ 5

По умолчанию boot2docker использует только файлы под /Users. SSH_AUTH_SOCK, вероятно, находится под /tmp, поэтому -v монтирует агент VM, а не тот, который находится на вашем Mac.

Если вы настроите VirtualBox на общий доступ /tmp, он должен работать.