为 Docker 重定向 SSH 用户:Gitlab 和 Docker:Bitbucket

Bas*_*erg 5 ssh proxy redirect docker

正如您在标题中已经读到的,我目前正在运行多个用作 git 服务器的 docker 容器,通常应该在端口 22 下运行。这显然不起作用,但我的请求如下。

在端口 22 上提供以下内容:

  • git@HOST - 重定向到 gitlab docker 容器
  • bitbucket@HOST - 重定向到 bitbucket 容器
  • root@HOST -(我根本不是以 root 身份工作,但出于理解原因)对 Docker Mainhost 的正常 SSH 访问。

我知道我必须跨容器和帐户同步 ssh 密钥,但这不会是一个大问题,但我不知道是否可以构建重定向系统。

我的一种方法是使用ForceCommand,但我无法重定向使用的 SSH 密钥...

另一个想法是在端口 22 上运行一个小工具,它只是在所有 SSH 守护进程之间路由完整的请求,但我还没有(还?)找到这样的工具,不知道是否可以构建这样的工具出于安全原因。

Jir*_*i B 2

我不认为你真的需要“重定向使用的 ssh 密钥”,你可以为每个将密钥作为authorized_keys 的用户创建一个密钥/证书,然后你可以ssh -i $key $final_destination通过 ForceCommand 使用。

如果您想使用AuthorizedKeysCommand您可以查询公钥的中央存储库,这可能会返回 2 行 - 一行用于真实用户公共 ssh 密钥,第二行用于“内部公共 ssh 密钥”,您可以通过注释和查询来区分这两行该存储库的密钥基于您执行查询的主机的信息。例如。在跳转主机上,您可以过滤具有例如此注释“foouser@”的公钥,在最终目的地上,您可以相反地使用注释“@internal”查询foouser的公钥。使用最近的 OpenSSH,您可以在跳转主机上使用ExposeAuthInfosshd 选项来了解使用哪个公共 ssh 密钥来登录跳转主机,然后您可以重新查询密钥的中央存储库并 grep 与 $SSH_USER_AUTH 中的密钥匹配的密钥。这种方式将根据返回的带有公共 ssh 密钥的行知道,并注释使用哪个私钥来 ssh 到最终目的地。

用户并不真正关心她如何登录最终主机,特别是如果它不是交互式 shell。

跳转主机和最终目的地上的 AuthorizedKeysCommand:

#!/bin/sh                                                                                                             
user=$1 # git !
filter=$2 # @$

cat /home/git/.ssh/authorized_keys 2>/dev/null | grep "${filter:-@$}"
exit 0
Run Code Online (Sandbox Code Playgroud)

跳转主机上的 sshd_config:

ExposeAuthInfo yes
Match User git
    AuthorizedKeysCommand /path/to/authorizedkeyscommand git # @$ as default
    ForceCommand /path/to/forcecommand git
Run Code Online (Sandbox Code Playgroud)

AuthorizedKeysCommand 可以返回:

ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAILleQxrxxxxxxxxxxxxxxxxxxx foouser@

跳转主机上的 ForceCommand:

#!/bin/ksh
set -x

user=$1 # git

if [[ -r ${SSH_USER_AUTH} ]]; then
    pubkey="$(cat ${SSH_USER_AUTH} | cut -d' ' -f2-)"
    realuser=$(/path/to/authorizedkeyscommand git | grep "${pubkey}" | sed 's/^.* \([^@]*\)@$/\1/' )
    [[ -n ${realuser} ]] && exec ssh -i $HOME/${realuser}_key <final_destination> "${SSH_ORIGINAL_COMMAND:-}"
else
    exit 1
fi
Run Code Online (Sandbox Code Playgroud)

像这样的东西...