透明ssh连接转发到docker集装箱
我想要一个服务器透明地将来自客户端的传入SSH连接转发到docker集装箱。 这应该包括scp,git transport等等。 这必须使用密钥,密码被停用。 用户不应该看到服务器。 更新:是的,这实际上意味着用户应该不知道有一台服务器。 configuration必须完全在服务器上进行!
client -----> server -----> container (actual connection) client -------------------> container (what the user should see)
那么,给出的是:
user@client$ ssh user@server user@server$ ssh -p 42 user@localhost user@container$
但是我想要的是这样的:
user@client$ ssh user@server user@container$
我尝试在authorized_keys
文件中使用command="ssh -p 42 user@localhost"
语法,这是有点用的,只是在第二个ssh连接中用户必须input密码,因为身份validation没有通过( server
没有' t有user
的私钥)。 此外,即使input密码,这种方法也不适用于scp
。
我也听说过tunnel=
命令,但是我不知道如何设置它(并且manpage不太有用)。
我在Arch上使用OpenSSH 7.5p1。
把它放在~/.ssh/config
文件中:
Host server-container ProxyCommand ssh server -W localhost:42
然后简单地做:
ssh server-container
只要你的用户名是一致的。 如果没有,你可以这样指定它们:
Host server-container ProxyCommand ssh server-user@server -W localhost:42
然后简单地做:
ssh container-user@server-container
作为奖励,您可以避免使用ssh使用docker exec
进入容器。 喜欢这个:
ssh -t server docker exec -it <container-id> bash
这是我现在提出的解决scheme。 我对第二个键感到有点不高兴,因为它的公共部分将在container
的~/.ssh/authorized_keys
可见,这很容易破坏透明性,但除此之外,其他所有的东西似乎都可以工作。
user@server$ cat .ssh/authorized_keys command="ssh -q -p 42 user@localhost -- \"$SSH_ORIGINAL_COMMAND\"",no-X11-forwarding ssh-rsa <KEYSTRING_1> user@server$ cat .ssh/id_rsa.pub <KEYSTRING_2> user@container$ cat .ssh/authorized_keys ssh-rsa <KEYSTRING_2>
client
使用其私钥对server
进行授权。 然后,服务器使用专用密钥跳到container
,该专用密钥仅用于该特定身份validation。 我有点担心你可以通过注入一些命令来突破命令,但是到目前为止,我还没有发现任何可以突破的排列方式。
由于传递$SSH_ORIGINAL_COMMAND
,你甚至可以做scp
和ssh-copy-id
等等。
注意:要禁止ssh-copy-id
(我想要其他原因),只需将authorized_keys
不可写入容器内的user
。