Использование 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.
Ответ 3
Однострочный:
Вот как настроить его на Ubuntu 16, на котором запущено изображение Debian Jessie:
docker run --rm -it --name container_name \
-v $(dirname $SSH_AUTH_SOCK):$(dirname $SSH_AUTH_SOCK) \
-e SSH_AUTH_SOCK=$SSH_AUTH_SOCK my_image
https://techtip.tech.blog/2016/12/04/using-ssh-agent-forwarding-with-a-docker-container/
Ответ 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.
-
В другом терминале 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
, он должен работать.