我是否可以在不给Docker容器ssh授予私钥的情况下授予其对主机的访问权限?

时间:2019-04-19 20:14:07

标签: docker ssh

请求

此docker命令将我的ssh密钥和用户名注入到容器中,将该容器连接到远程主机,然后在主机上运行:echo hello world

docker run --rm \
    -e "host=the.host" \
    -e "user=my.user.name" \
    -v "/home/me/.ssh/id_rsa:/key" \
    ubuntu:18.04 /bin/bash -c \
        'apt update && apt install -y ssh \
         && ssh -o StrictHostKeyChecking=no $user@$host -i /key
             echo hello world'

我希望该命令能够连接到远程主机,但我希望它能够cat /key并查看我的ssh密钥。

我可以进行哪些更改来实现这一目标?


上下文

我正在写一个测试跑步者。我的代码负责确定可以针对哪些主机运行哪些测试,但是测试本身可能不是我编写的(当我的测试运行程序启动时,它会从git repo中拉进来)。

担心我的同事滥用其测试代码来滥用服务器,因为这种滥用在源代码控制中可见。在这种情况下,它们是半信任的。我担心某人编写的测试会导致我的ssh密钥出现在日志输出中的某个地方。

理想情况下,我会先建立ssh连接,然后创建容器-以某种方式授予它访问连接的权限,但不授予密钥的访问权限。

1 个答案:

答案 0 :(得分:0)

我需要的功能是SSH Multiplexing,我了解到here

此文件位于~/.ssh.config的docker映像中

Host foo
    HostName foo.bar.com
    User my.user.name
    ControlMaster auto
    ControlPath ~/.ssh/cm_socket/%r@%h:%p

此文件在主机上:

Host foo
    HostName foo.bar.com
    User my.username
    IdentityFile /path/to/key
    IdentitiesOnly yes
    ControlMaster auto
    ControlPath ~/.ssh/cm_socket/%r@%h:%p

我将图像称为keylesssh,因此此命令创建了一个容器,该容器没有有密钥,但是确实具有包含一个密钥的文件夹。套接字(如果存在现有连接)。

docker run --rm \
    -v "/home/matt/.ssh/cm_socket:/root/.ssh/cm_socket" \
        keylesssh /bin/bash -c 'ssh dev1 hostname'

它像这样在一起:

  1. 我从托管docker守护程序的计算机到远程主机打开ssh连接
  2. SSH将创建一个套接字,并以可预测的名称将其放入〜/ .ssh / cm_socket中
  3. 我创建了一个容器,与其共享该文件夹
  4. 容器尝试ssh到主机,注意到套接字存在,并使用现有连接而不进行身份验证-不需要密钥
  5. 测试完成运行后,容器将关闭
  6. 当我的代码注意到容器关闭时,我会终止ssh主连接

我知道它是有效的,因为hostname命令可解析远程服务器的主机名,而不是容器或Docker主机的主机名。