我希望有一个服务器来透明地将来自客户端的传入ssh连接转发到docker容器。这应该包括scp,git transport等等。这必须与密钥一起使用,密码已停用。用户不应该看到服务器。* 更新:是的,这确实意味着用户不知道有服务器。配置必须完全在服务器上进行!*
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连接中,用户必须输入密码,因为身份验证没有通过(server
没有user
的私钥)。此外,即使输入密码,这种方法也不能用于scp
。
我也听说过tunnel=
命令,但我不知道如何设置它(手册页也没什么帮助)。
我在Arch上使用OpenSSH 7.5p1。
3条答案
按热度按时间vfh0ocws1#
把它放到
~/.ssh/config
文件中:字符串
然后简单地做:
型
只要用户名一致。如果没有,您可以将它们指定为:
型
然后简单地做:
型
作为奖励,您可以避免使用ssh来使用
docker exec
进入容器。就像这样:型
mm9b1k5b2#
这是我现在想出的解决方案。我对第二个密钥有点不满意,因为它的公共部分将在
container
的~/.ssh/authorized_keys
中可见,这稍微打破了透明度,但除此之外,所有其他东西似乎都可以工作。字符串
client
使用其私钥对server
进行授权。然后,服务器跳转到container
,该container
具有仅用于该特定auth的专用密钥。我有点担心你可以通过注入一些命令来突破command=
,但到目前为止,我没有发现允许突破的排列。由于传递了
$SSH_ORIGINAL_COMMAND
,您甚至可以执行scp
和ssh-copy-id
等等。注意:要禁止
ssh-copy-id
(我出于其他原因想要这样做),只需在容器内为user
设置authorized_keys
不可写。ffvjumwh3#
这将是两个部分:
直接访问容器
您可以完全绕过到容器的SSH连接,但仍然像SSH正在连接到容器一样(使用用户名和容器中的
~/.ssh/authorized_keys
文件,并静默“重定向”到容器,而不直接访问服务器)。我将假设用户同时存在于服务器和容器中,并且用户名匹配。我们在这里调用用户ssh_username
。在服务器上,您将
docker exec
容器中的shell(而不是SSHing到容器中)。将服务器上ssh_username
的shell设置为如下所示:/usr/local/bin/docker-shell
:字符串
要创建此文件,您需要执行以下操作:
型
服务器鉴权
由于我们不使用密码,也不希望用户在服务器上有shell,我们可以像这样创建用户:
型
(使用
-M
防止在主目录中创建默认文件,使用-N
防止创建匹配组)现在,您需要将
ssh_username
授权到服务器,而不是容器,但我们不想在这两个地方都维护authorized_keys
文件。我们将使用SSH的AuthorizedKeysCommand
从Docker容器中获取它们。下面是如何在服务器上配置
AuthorizedKeysCommand
。编辑服务器的/etc/ssh/sshd_config
文件以添加:型
some_server_user_with_docker_access
将替换为server
上docker
组中的用户,因为该用户将需要能够在服务器上运行docker exec
。这也可以是ssh_username
,但您需要将该用户添加到docker
组,您可能不想这样做。