我使用的是Mac OS X与泊坞窗机(默认boot2docker机)泊坞窗,我用泊坞窗,撰写设置我的开发环境。
比方说,其中一个容器被称为“stack
”。现在我想要做的就是调用:
docker-composer run stack ssh [email protected]
我(已经被添加到stackoverflow.com
和将被用于验证我的)公共密钥所在的主机上。我想这个键可用来泊坞窗机容器,这样我就可以使用该密钥从容器内,以自己的身份验证对stackoverflow
。最好不用物理拷贝我的关键泊坞窗机。
有没有办法做到这一点?另外,如果我的关键是密码保护,有没有什么办法来解锁一次所以每次注射后,我就不用手动输入密码?
您可以将它添加到您的泊坞窗,compose.yml(假设容器里面你是root用户):
volumes:
- ~/.ssh:/root/.ssh
您还可以检查more advanced solution with ssh agent(我没有尝试过自己)
码头工人有一个叫做秘密功能,它可以帮助在这里。要使用一个可以添加以下代码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
秘密文件不会被复制到容器:
当您授予新创建或运行的服务访问一个秘密,解密的秘密被装入容器中的内存文件系统
有关详细信息,请参阅:
如果您使用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密钥。因为它是不切实际每次我们开始一个容器时都要输入密码,不会在码头工人的工作。我们可以删除密码(见下面的例子),但有一个安全问题。
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剂基本上是监听到一个特殊的文件,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
不幸的是,OS X用户,码头工人的Mac有一些不足之处,其中之一就是它无法共享Mac和Linux之间的Unix套接字。这里有一个open issue in D4M Github。由于2019年2月的它仍然是开放的。
所以,是死路一条?不,还有一个哈克解决方法。
幸运的是,这并不是一个新问题。龙泊坞窗之前有到远程SSH会话中使用本地SSH密钥的一种方式。这就是所谓的ssh代理转发。这个想法很简单:你通过SSH连接到远程服务器,您可以使用所有相同的远程服务器出现,从而分享你的钥匙。
随着码头工人的Mac,我们可以使用智能把戏:股SSH代理使用TCP ssh连接泊坞窗虚拟机,从虚拟机文件安装到另一个容器中,我们需要的是SSH连接。这里有一个画面显示的解决方案:
首先,我们通过一个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域套接字。
你可以把SSH代理:
there's a suggestion