建立从Jenkins容器到SSH服务器容器的SSH连接,我可以使用密码登录建立但无法使用私钥建立

Lee*_*fin 4 ssh centos jenkins docker dockerfile

故事:

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

问题:

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

我的目录和文件的概述:

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

  • a docker-compose.yml(详情见下文)
  • 名为 的目录centos/
  • 里面centos/有一个Dockerfile用于构建 SSH 服务器映像的文件。

我尝试的步骤及其结果:

第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:
Run Code Online (Sandbox Code Playgroud)

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

第 2 步,这是我的Dockerfile下图centos/

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
Run Code Online (Sandbox Code Playgroud)

步骤 3.正如您在上面的 Dockerfile 中看到的,我将COPY公钥remote-key.pub从本地主机发送到容器并将其命名为authorized_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: 
Run Code Online (Sandbox Code Playgroud)

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

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

docker cp remote-key jenkins:/tmp/
Run Code Online (Sandbox Code Playgroud)

所以,现在 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: 
Run Code Online (Sandbox Code Playgroud)

正如您在上面看到的,在 jenkins 容器内,bash 提示符告诉我key "/tmp/remote-key": Permission denied.然后它要求我输入密码,然后我输入密码 1234,SSH 连接就建立了。

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

====更新=====

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

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
Run Code Online (Sandbox Code Playgroud)

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

jenkins@7551f2fa441d:/$ chown jenkins:jenkins /tmp/remote-key 
chown: changing ownership of '/tmp/remote-key': Operation not permitted 
Run Code Online (Sandbox Code Playgroud)

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

Pie*_* B. 7

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

然而 chown 命令告诉我不允许操作。:( 我现在应该怎么做?

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

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

docker exec -it -u root jenkins bash
$ chown jenkins:jenkins /tmp/remote-key 
$ exit
Run Code Online (Sandbox Code Playgroud)

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

docker exec -it jenkins bash
$ ssh -i /tmp/remote-key remote_user@remote_host
Run Code Online (Sandbox Code Playgroud)

注:也可以直接运行sshroot无需更改权限

docker exec -it -u root jenkins bash
$ ssh -i /tmp/remote-key remote_user@remote_host
Run Code Online (Sandbox Code Playgroud)