web-dev-qa-db-fra.com

Utilisation de ssh-agent avec docker sur macOS

Je voudrais utiliser ssh-agent pour transférer mes clés dans l'image docker et les extraire d'un dépôt github privé.

J'utilise une version légèrement modifiée de https://github.com/phusion/passenger-docker avec boot2docker sur Yosemite.

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

Ensuite, j'utilise la commande que j'ai vue à plusieurs endroits (c'est-à-dire 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

Mais cela ne semble pas fonctionner:

root@299212f6fee3:/# ssh-add -l
Could not open a connection to your authentication agent.

root@299212f6fee3:/# eval `ssh-agent -s`
Agent pid 19

root@299212f6fee3:/# ssh-add -l
The agent has no identities.

root@299212f6fee3:/# 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).
25
Paul Odeon

Un one-liner:

Voici comment le configurer sur Ubuntu 16 exécutant une image 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/

5
MJ1

J'ai développé la réponse de @ wilwilson et créé un script qui configurera le transfert d'agent dans un environnement boot2docker OSX.

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 docker@localhost \
    -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 docker@localhost 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" \
    "$@"

# we're done; kill off the boot2docker ssh agent
ssh -S $SSH_SOCK -O exit docker@localhost

Collez-le dans ~/bin/docker-run-ssh, chmod +x it, et utilisez docker-run-ssh au lieu de docker run.

4
rcoup

J'ai rencontré un problème similaire et j'ai pu rendre les choses assez transparentes en utilisant ssh en mode maître avec un socket de contrôle et en enveloppant le tout dans un script comme celui-ci:

#!/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 "$@"

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

Pas la plus jolie chose de l'univers, mais bien mieux que de maintenir manuellement une session SSH ouverte IMO.

1
willwilson

Pour moi, accéder à ssh-agent pour transférer les clés a fonctionné sur OSX Mavericks et docker 1.5 comme suit:

  1. ssh dans le boot2docker VM avec boot2docker ssh -A. N'oubliez pas d'utiliser l'option -A qui permet le transfert de la connexion de l'agent d'authentification.

  2. Dans la session ssh boot2docker:

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

Cette session doit être laissée ouverte. Prenez note de la valeur de la variable d'environnement SSH_AUTH_SOCK.

  1. Dans un autre terminal OS X, exécutez la commande docker run avec la valeur SSH_AUTH_SOCK de l'étape 2 comme suit:

    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)
    

Je n'aime pas vraiment le fait que je doive garder une session ssh boot2docker ouverte pour que cela fonctionne, mais jusqu'à ce qu'une meilleure solution soit trouvée, cela a au moins fonctionné pour moi.

1
henrjk

Le transfert de socket ne fonctionne pas encore sous OS X. Voici une variante de la réponse @henrjk introduite en 2019 en utilisant Docker pour Mac au lieu de boot2docker qui est maintenant obsolète.

  1. Exécutez d'abord un serveur ssh dans le conteneur, avec/tmp se trouvant sur le volume exportable. Comme ça

     docker run -v tmp:/tmp -v \
     ${HOME}/.ssh/id_rsa.pub:/root/.ssh/authorized_keys:ro \
     -d -p 2222:22 arvindr226/Alpine-ssh
    
  2. Puis ssh dans ce conteneur avec le transfert d'agent

     ssh -A -p 2222 root@localhost
    
  3. À l'intérieur de cette session ssh, découvrez le socket actuel pour ssh-agent

     3f53fa1f5452:~# echo $SSH_AUTH_SOCK
     /tmp/ssh-9zjJcSa3DM/agent.7
    
  4. Vous pouvez maintenant exécuter votre véritable conteneur. Assurez-vous simplement de remplacer la valeur de SSH_AUTH_SOCK ci-dessous, par la valeur que vous avez obtenue à l'étape ci-dessus

     docker run -it -v tmp:/tmp  \
     -e SSH_AUTH_SOCK=/tmp/ssh-9zjJcSa3DM/agent.7 \
     vladistan/ansible
    
0
Vlad

Impossible d'ouvrir une connexion avec votre agent d'authentification.

Cette erreur se produit lorsque$SSH_AUTH_SOCK env var n'est pas défini correctement sur l'hôte ou n'est pas défini du tout. Vous pouvez essayer différentes solutions. Ma suggestion, cependant, est de Linux et macOS à double démarrage .

Ressources supplémentaires:

0
Josh Habdas

Depuis la version 2.2.0.0, docker pour macOS permet aux utilisateurs d'accéder à l'agent SSH de l'hôte à l'intérieur des conteneurs.

Voici un exemple de commande qui vous permet de le faire:

docker run --rm -it \
-v /run/Host-services/ssh-auth.sock:/ssh-agent \
-e SSH_AUTH_SOCK="/ssh-agent" \
my_image

Notez que vous devez monter le chemin spécifique (/run/Host-services/ssh-auth.sock) au lieu du chemin d'accès contenu dans $SSH_AUTH_SOCK variable d'environnement, comme vous le feriez sur des hôtes Linux.

0
Jakub Kukul