sshd将git用户的login信息转发到(GitLab)Docker容器

我想在我的主机上configurationsshd,将某个用户的公钥login转发到一个运行自己的sshd服务的Docker容器。

为了给出一些上下文,我让GitLab在一个Docker容器中运行,并且我不喜欢在主机上打开另一个用于SSH GitLab通信的端口,而是在主机上使用sshdredirect用户,直接键入GitLab在本地公开的端口机。

我的想法是做这样的事情:

Match User git ForceCommand ssh -p <GitLab port> <some arguments that forward to> git@localhost ... 

非常感谢帮助!

我find了一个简单的解决方法。 只需在主机上创build一个Git用户,并提供一个代理脚本,它使用主机的SSH守护进程和容器卷中的.ssh/authorized_keys在GitLab容器中执行给定的Git命令。

  1. 在主机上,使用与GitLab docker容器(998)中相同的UID&GID添加用户git ,并将GitLab data目录设置为用户的home:

     useradd -u 998 -s /bin/bash -d /your/gitlab/path/data git 
  2. git用户添加到docker组

     usermod -G docker git 
  3. 在主机上添加一个代理脚本/opt/gitlab/embedded/service/gitlab-shell/bin/gitlab-shell ,内容如下:

     #!/bin/bash docker exec -i -u git <your_gitlab_container_id> sh -c "SSH_CONNECTION='$SSH_CONNECTION' SSH_ORIGINAL_COMMAND='$SSH_ORIGINAL_COMMAND' $0 $1" 

你提出的build议会使用户需要两次validation。 一次与你的服务器,第二次在docker,这基本上是你不想要的gitlab。

当你提到公钥authentication时,它需要以某种方式与你的主机共享你的gitlab的授权密钥文件或命令。

我相信这是可能的,但更容易打开那个港口。

从客户端,你可以像ProxyCommand这样做:

 Hostname your-gitlab ProxyCommand ssh -W localhost:<GitLab port> git@your-git-host 

另一个(未经testing的)可能性可能是您将连接从主机转发到容器,方法是将其添加到git用户的authorized_keys文件中,如下所示:

 command="nc -q0 gitlab 22" ssh-rsa AAAAB....[REST OF YOUR PUBKEY] 

git用户应该在主机上创build。 现在当你连接“ssh git @ host”时,这个连接应该用“nc”转发给gitlab容器。

很明显,还需要将所有使用命令前缀复制的gitlab ssh密钥复制到主机

然而,这只有在gitlab容器不在隔离networking中并且主容器实际上具有连接到gitlab端口22的可能性时才起作用。

在我的设置中,这是因为gitlab是在一个孤立的networking,所以我结束了在另一个端口上运行gitlab ssh:

  • -p 20022:22启动容器
  • 添加gitlab_rails['gitlab_shell_ssh_port'] = 20022到你的gitlab.rbconfiguration