Docker,如何处理ssh密钥,known_hosts和authorized_keys

问题描述 投票:0回答:7

在 docker 中,当容器必须与外部系统通信时,如何根据配置

known_hosts
authorized_keys
和 ssh 连接的要求确定范围?

例如,我正在运行 Jenkins 容器并尝试在作业中从 GitHub 签出该项目,但连接失败并出现错误:

主机密钥验证失败

这可以通过登录容器、手动连接到 GitHub 并在出现提示时信任主机密钥来解决。然而,这不是正确的解决方案,因为一切都需要 100% 自动化(我正在使用 Ansible 和 Docker 构建 CI 管道)。另一个(笨重的)解决方案是使用 Ansible 配置正在运行的容器,但这会使事情变得混乱且难以维护。 Jenkins 容器甚至没有 ssh 守护进程,我不知道如何从其他主机 ssh 进入容器。第三种选择是使用我自己的

Dockerfile
扩展 Jenkins 映像,其中配置了 ssh,但这将是硬编码并将容器锁定到此特定环境。

那么使用 docker 管理(和自动化)与外部系统的连接的正确方法是什么?

jenkins docker ssh configuration ansible
7个回答
23
投票

要信任

github.com
主机,您可以在启动或构建容器时发出此命令:

 ssh-keyscan -t rsa github.com >> ~/.ssh/known_hosts

这会将 github 公钥添加到您已知的主机文件中。


9
投票

如果一切都在 Dockerfile 中完成,那就很容易了。 在我的 Dockerfile 中:

ARG PRIVATE_SSH_KEY

# Authorize SSH Host
RUN mkdir -p /root/.ssh && \
    chmod 0700 /root/.ssh && \
    ssh-keyscan example.com > /root/.ssh/known_hosts && \
    # Add the keys and set permissions
    echo "$PRIVATE_SSH_KEY" > /root/.ssh/id_rsa && \
    chmod 600 /root/.ssh/id_rsa

...do stuff with private key

# Remove SSH keys
RUN rm -rf /root/.ssh/

您显然需要将私钥作为参数传递给建筑物(docker-compose build 或 docker build)。


5
投票

一种解决方案是使用以下选项将主机的 ssh 密钥挂载到 docker 中:

docker run -v /home/<host user>/.ssh:/home/<docker user>/.ssh <image>

这对于 git 来说非常有效。


4
投票

有一个小技巧,但是 git 版本应该> 2.3

export GIT_SSH_COMMAND="ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no"
git clone [email protected]:some/another/repo.git

或者简单地

GIT_SSH_COMMAND="ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no" git clone git@...

您甚至可以像这样指向私钥文件路径:

GIT_SSH_COMMAND="ssh -i /path/to/private_key_file -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no" git clone git@...

3
投票

我就是这样做的,但不确定你是否会喜欢这个解决方案。我有一个私有 git 存储库,其中包含authorized_keys 和公钥集合。然后,我使用ansible克隆这个存储库并替换authorized_keys:

- git: repo=my_repo dest=my_local_folder force=yes accept_hostkey=yes

- shell: "cp my_local_folder/authorized_keys ~/.ssh/"

使用 accept_hostkey 实际上允许我自动化该过程(当然,我相信来源)。


0
投票

试试这个: 登录主机,然后:

sudo mkdir /var/jenkins_home/.ssh/
sudo ssh-keyscan -t rsa github.com >> /var/jenkins_home/.ssh/known_hosts

Jenkins 容器将主位置设置为持久映射,因此,在主机系统中运行它将生成所需的结果。


0
投票

如果您要使用 Dockerfile,请参阅@Konstantin Suvorov 提供的详细答案。

在我的 Dockerfile 中我刚刚添加了:

COPY my_rsa /root/.ssh/my_rsa                       # copy rsa key
RUN chmod 600 /root/.ssh/my_rsa                     # make it accessible
RUN apt-get -y install openssh-server               # install openssh
RUN ssh-keyscan my_hostname >> ~/.ssh/known_hosts   # add hostname to known_hosts

请注意,“my_hostname”和“my_rsa”是您的主机名和 rsa 密钥

这使得 ssh 在 docker 中工作没有任何问题,所以我可以连接到数据库

© www.soinside.com 2019 - 2024. All rights reserved.