首页 > 解决方案 > 建立从 Jenkins 容器到 SSH 服务器容器的 SSH 连接,我可以用密码登录建立但不能用私钥建立

问题描述

故事:

我正在学习 Udemy 课程,以使用 docker 学习 Jenkins。实验室是我设置了一个SSH 服务器容器和一个Jenkins 容器,将它们放在同一个 docker 网络中。然后,我进入 jenkins 容器与 SSH 服务器容器建立 ssh 连接。

问题:

我可以使用密码登录建立从 jenkins 容器到 SSH 服务器容器的 SSH 连接,但是,它无法SSH -i使用我生成的密钥对建立连接。

我的目录和文件的概述:

在我本地机器的工作空间下,我有:

我尝试的步骤及其结果:

第 1 步,我首先docker-compose.yml为这两个容器创建了

version: '3'
services:
  jenkins:
    container_name: jenkins
    image: jenkins/jenkins
    ports:
      - "8080:8080"
    volumes:
      - $PWD/jenkins_home:/var/jenkins_home
    networks:
      - net
  remote_host:
    container_name: remote_host
    image: remote-host
    build: 
      context: centos7
    networks:
      - net
networks:
  net:

正如您在上面看到的,该remote_host服务指的是从Dockerfilecentos/目录构建的 SSH 服务器映像。

第2步,所以这是我的Dockerfilecentos/

FROM centos

RUN yum -y install openssh-server

RUN useradd remote_user && \
    echo remote_user:1234 | chpasswd && \
    mkdir /home/remote_user/.ssh && \
    chmod 700 /home/remote_user/.ssh

COPY remote-key.pub /home/remote_user/.ssh/authorized_keys

RUN chown remote_user:remote_user -R /home/remote_user/.ssh/ && \
    chmod 600 /home/remote_user/.ssh/authorized_keys

RUN ssh-keygen -A
RUN rm -rf /run/nologin
CMD /usr/sbin/sshd -D

第 3 步。正如您在上面的 Dockerfile 中看到的,我从本地主机到容器COPY的公钥并将其命名为。我通过命令在本地主机的文件夹下生成了密钥对:remote-key.pubauthorized_keyscentos/

ssh-keygen -t rsa -m PEM -f remote-key

第 4 步。完成以上所有操作后。我运行命令docker-compose build来构建图像。

第 5 步。最后我运行docker-compose up以调出容器。

jenkins 和 remote_host(ssh 服务器)容器都已启动并成功运行。

第 6 步。然后我通过 进入 jenkins 容器docker exec -it jenkins bash,在容器的 bash 终端中,我进行 ssh 连接:

jenkins@7551f2fa441d:/$ ssh remote_user@remote_host
remote_user@remote_host's password: 

输入密码 1234(定义在 中Dockerfile)后,我成功建立了 jenkins 容器到 SSH 服务器容器的 SSH 连接。但我想通过密钥对而不是密码登录建立连接。

第7步,由于SSH服务器容器已经复制了公钥,所以我通过命令将私钥从本地主机复制到jenkins容器:

docker cp remote-key jenkins:/tmp/

因此,现在 jenkins 容器的 /tmp/ 目录包含私钥。

第 8 步,现在我尝试使用私钥建立与 ssh 服务器容器的 SSH 连接。我通过 进入詹金斯docker exec -it jenkins bash,然后,我运行命令:

jenkins@7551f2fa441d:/$ ssh -i /tmp/remote-key remote_user@remote_host
Load key "/tmp/remote-key": Permission denied
remote_user@remote_host's password: 

如上所示,在 jenkins 容器中,bash 提示符告诉我key "/tmp/remote-key": Permission denied.Right 之后它要求我输入密码,然后我输入密码 1234,SSH 连接建立。

那么,为什么我不能使用私钥建立从 jenkins 容器到 ssh 服务器容器的 SSH 连接,而只能使用密码登录呢?

==== 更新 =====

受到@agentsmith 在他回答下的评论的启发,我检查了/tmp/remote-key我的詹金斯容器内部的所有权:

drwxr-xr-x 2 jenkins   jenkins       4096 Sep 20 13:01 hsperfdata_jenkins
drwxr-xr-x 2 root      root          4096 Feb  2  2020 hsperfdata_root
drwxr-xr-x 2 jenkins   jenkins       4096 Sep 20 13:01 jetty-0_0_0_0-8080-war-_-any-190970179478026794.dir
drwxr-xr-x 2 jenkins   jenkins       4096 Sep 18 20:55 jetty-0_0_0_0-8080-war-_-any-878046537266404011.dir
-rw------- 1 245867976 1349604816    1679 Sep 18 20:53 remote-key
-rw-r--r-- 1 jenkins   jenkins    3167976 Sep 18 20:55 winstone3001500689590881345.jar
-rw-r--r-- 1 jenkins   jenkins    3167976 Sep 20 13:01 winstone8218655308653013358.jar

正如您在上面看到的,除了远程密钥jenkins文件之外,所有其他文件都拥有(一个文件)的用户和组所有权。因此,我尝试通过以下方式更改所有权:root

jenkins@7551f2fa441d:/$ chown jenkins:jenkins /tmp/remote-key 
chown: changing ownership of '/tmp/remote-key': Operation not permitted 

但是该chown命令告诉我不允许操作。:( 我现在该怎么办?

标签: dockerjenkinssshcentosdockerfile

解决方案


-rw------- 1 245867976 1349604816    1679 Sep 18 20:53 remote-key
jenkins@7551f2fa441d:/$ chown jenkins:jenkins /tmp/remote-key
chown: changing ownership of '/tmp/remote-key': Operation not permitted 

但是 chown 命令告诉我不允许操作。:( 我现在该怎么办?

看起来您的 SSH 密钥的权限确实设置不正确。您无法更改文件权限,因为它归用户所有,245867976但您的 bash 会话由jenkins用户运行。

您应该使用以下方法更改文件所有权密钥root

docker exec -it -u root jenkins bash
$ chown jenkins:jenkins /tmp/remote-key 
$ exit

-uflag 将以用户身份bashjenkins容器中运行root,您应该可以使用该用户更改文件权限。然后再试一次:

docker exec -it jenkins bash
$ ssh -i /tmp/remote-key remote_user@remote_host

注意:您也可以直接运行sshwithroot而无需更改权限

docker exec -it -u root jenkins bash
$ ssh -i /tmp/remote-key remote_user@remote_host

推荐阅读