注入主机的SSH密钥到泊坞窗机与码头工人撰写

问题描述 投票:18回答:4

我使用的是Mac OS X与泊坞窗机(默认boot2docker机)泊坞窗,我用泊坞窗,撰写设置我的开发环境。

比方说,其中一个容器被称为“stack”。现在我想要做的就是调用:

docker-composer run stack ssh [email protected]

我(已经被添加到stackoverflow.com和将被用于验证我的)公共密钥所在的主机上。我想这个键可用来泊坞窗机容器,这样我就可以使用该密钥从容器内,以自己的身份验证对stackoverflow。最好不用物理拷贝我的关键泊坞窗机。

有没有办法做到这一点?另外,如果我的关键是密码保护,有没有什么办法来解锁一次所以每次注射后,我就不用手动输入密码?

ssh docker docker-compose docker-machine
4个回答
37
投票

您可以将它添加到您的泊坞窗,compose.yml(假设容器里面你是root用户):

volumes:
    - ~/.ssh:/root/.ssh

您还可以检查more advanced solution with ssh agent(我没有尝试过自己)


21
投票

码头工人有一个叫做秘密功能,它可以帮助在这里。要使用一个可以添加以下代码docker-compose.yml

---
version: '3.1' # Note the minimum file version for this feature to work
services:
  stack:
    ...
    secrets:
      - host_ssh_key

secrets:
  host_ssh_key:
    file: ~/.ssh/id_rsa

然后,新的秘密文件可以在这样Dockerfile访问:

RUN mkdir ~/.ssh && ln -s /run/secrets/host_ssh_key ~/.ssh/id_rsa

秘密文件不会被复制到容器:

当您授予新创建或运行的服务访问一个秘密,解密的秘密被装入容器中的内存文件系统

有关详细信息,请参阅:


9
投票

如果您使用OS X和加密的密钥这将是PITA。 Here are the steps我通过搞清楚了这一点去了。

简单的方法

有人可能会认为没有任何问题。只需安装你的ssh文件夹:

...
volumes:
  - ~/.ssh:/root/.ssh:ro
...

这应该是工作的,对不对?

用户问题

我们会发现接下来的事情是,我们使用了错误的用户ID。好吧,我们将编写一个脚本来复制和更改SSH密钥的所有者。让SSH服务器知道谁是连接我们还将设置SSH用户的配置。

...
volumes:
  - ~/.ssh:/root/.ssh-keys:ro
command: sh -c ‘./.ssh-keys.sh && ...’
environment:
  SSH_USER: $USER
...

# ssh-keys.sh
mkdir -p ~/.ssh
cp -r /root/.ssh-keys/* ~/.ssh/
chown -R $(id -u):$(id -g) ~/.ssh

cat <<EOF >> ~/.ssh/config
  User $SSH_USER
EOF

SSH密钥密码问题

在我们公司,我们保护使用密码SSH密钥。因为它是不切实际每次我们开始一个容器时都要输入密码,不会在码头工人的工作。我们可以删除密码(见下面的例子),但有一个安全问题。

openssl rsa -in id_rsa -out id_rsa2
# enter passphrase
# replace passphrase-encrypted key with plaintext key:
mv id_rsa2 id_rsa

SSH剂溶液

您可能已经注意到,在本地就不需要每次需要SSH访问时输入密码。这是为什么?这就是SSH代理是。 SSH剂基本上是监听到一个特殊的文件,Unix套接字,所谓的“SSH权威性袜子”的服务器。你可以看到你的系统上的位置:

echo $SSH_AUTH_SOCK
# /run/user/1000/keyring-AvTfL3/ssh

SSH客户端通过这个文件,SSH代理进行通信,这样你输入的密码只有一次。一旦它的加密,SSH代理将其存储在内存中,发送到SSH客户端的请求。我们可以使用,在泊坞窗?当然,只是挂载特别的文件,并指定相应的环境变量:

environment:
  SSH_AUTH_SOCK: $SSH_AUTH_SOCK
  ...
volumes:
  - $SSH_AUTH_SOCK:$SSH_AUTH_SOCK

我们甚至不需要在这种情况下复制钥匙。为了确认键可用,我们可以使用ssh-添加实用程序:

if [ -z "$SSH_AUTH_SOCK" ]; then
  echo "No ssh agent detected"
else
  echo $SSH_AUTH_SOCK
  ssh-add -l
fi

Unix套接字的问题泊坞窗安装的Mac支持

不幸的是,OS X用户,码头工人的Mac有一些不足之处,其中之一就是它无法共享Mac和Linux之间的Unix套接字。这里有一个open issue in D4M Github。由于2019年2月的它仍然是开放的。

所以,是死路一条?不,还有一个哈克解决方法。

SSH代理转发的解决方案

幸运的是,这并不是一个新问题。龙泊坞窗之前有到远程SSH会话中使用本地SSH密钥的一种方式。这就是所谓的ssh代理转发。这个想法很简单:你通过SSH连接到远程服务器,您可以使用所有相同的远程服务器出现,从而分享你的钥匙。

随着码头工人的Mac,我们可以使用智能把戏:股SSH代理使用TCP ssh连接泊坞窗虚拟机,从虚拟机文件安装到另一个容器中,我们需要的是SSH连接。这里有一个画面显示的解决方案:

SSH forwarding

首先,我们通过一个TCP端口创建一个SSH会话到Linux虚拟机内部的容器内的SSH服务器。在这里,我们使用一个真正的SSH身份验证袜子。

接下来,SSH服务器转发我们的SSH密钥SSH代理该容器上。 SSH剂具有其使用安装到Linux VM的位置的Unix套接字。即Unix套接字工作在Linux上。在苹果机不工作的Unix套接字文件没有任何影响。

之后,我们创造我们的SSH客户端有用的容器。我们分享,我们的本地SSH会话使用Unix套接字文件。

还有,简化了流程脚本的一串:qazxsw POI

结论

获取SSH在码头工人的工作可以一直容易。但这是可以完成的。它很可能是在未来的改善。至少多克开发商都意识到这个问题。甚至https://github.com/avsm/docker-ssh-agent-forward。而solved it for Dockerfiles with build time secrets如何支持Unix域套接字。


5
投票

你可以把SSH代理:

there's a suggestion
© www.soinside.com 2019 - 2024. All rights reserved.