如何将ssh密钥添加到Docker并在使用后删除?

5
问题听起来很基础,但我找不到一个既安全又简单的解决方案。
问题如下,我有一个项目,并且想从私人git仓库拉取依赖项以构建运行时环境,然后删除SSH密钥和SSH密码短语。我不能跳过密码短语,因为它是由git远程仓库强制执行的。
我的困难在于:
1.我无法推送SSH密码短语,以便SSH不会要求密码短语
2.我不知道如何以安全的方式实现这一目标
如何能够以安全的方式做到这一点呢?
我正在Docker中操作,可能可以在其中安装任何开源软件。

通常我所做的是删除口令短语,克隆repo,然后再将口令短语放回原处。我想你已经明确表示你的远程强制要求使用口令短语,所以你不能删除它并进行克隆?我的理解正确吗? - Rakmo
是的,这确实是个问题。它是强制性的,所以我必须克服它。我也不能控制组织的政策。 - Dmytro Chasovskyi
我倾向于在 Docker 空间之外运行所有的 git 操作。这样可以避免将密钥放入镜像中并可能泄露它的问题;它让我能够构建任意分支或工作代码;并且它避免了 Docker 不会重复运行 RUN git clone 行而认为它是幂等的麻烦。 - David Maze
@DavidMaze 在我的情况下这不起作用,因为SSH连接是为了构建在Git中的项目依赖项。这意味着我需要在本地机器、云和CI/CD管道之外构建具有所有依赖项的项目,但本地机器、云和CI/CD管道可能不同,所以在这种情况下我将无法使用Docker的强大功能。这使得Docker的使用受到质疑,而Docker并不是我可以在这个项目中放弃的东西。 - Dmytro Chasovskyi
Dockerfile和其他构件放在代码仓库中。使用git clone ... && docker build命令,您仍然可以从一致的源代码树中获得一致的结果。 - David Maze
启用 buildkit 后,您可以在构建过程中将连接转发到 ssh-agent。克隆仓库,例如:RUN --mount=type=ssh git clone git@github.com:myorg/myproject.git myproject - masseyb
1个回答

6

启用 buildkit 后:

docker build 命令提供了一个 --ssh 选项,允许 Docker 引擎转发 SSH 代理连接。

您可以将私钥添加到 ssh-agent 中,使用命令 ssh-add

来自 ssh-addman 页面:

如果任何文件需要密码短语,ssh-add 将要求用户输入密码短语。

来自 ssh-agentman 页面:

该代理程序在用户的本地 PC、笔记本电脑或终端上运行。认证数据不需要存储在任何其他计算机上,认证密码短语永远不会通过网络传输。但是,代理程序的连接会在 SSH 远程登录时进行转发,因此用户可以在网络中的任何位置以安全的方式使用身份验证。

ssh-agent 永远不会通过其请求通道发送私钥...

文档中的示例 Dockerfile

# syntax=docker/dockerfile:experimental
FROM alpine

# Install ssh client and git
RUN apk add --no-cache openssh-client git

# Download public key for github.com
RUN mkdir -p -m 0600 ~/.ssh && ssh-keyscan github.com >> ~/.ssh/known_hosts

# Clone private repository
RUN --mount=type=ssh git clone git@github.com:myorg/myproject.git myproject

构建镜像:docker build --ssh default


3
有一个需要注意的地方是,在Windows中default不起作用,因此您需要指定完整路径default=C:/.ssh/id_rsa(或者您的id_rsa文件位置)。 - Dmytro Chasovskyi
虽然有点离题,但我想分享这份文档:https://docs.docker.com/desktop/networking/#ssh-agent-forwarding我在寻找为docker run命令挂载主机SSH功能的解决方案时偶然发现了这个问题。这份文档对我很有帮助! - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接