【问题标题】:SSH "Host key verification failed" in GitHub Actions - but key exists in known_hostsGitHub Actions 中的 SSH“主机密钥验证失败”-但已知主机中存在密钥
【发布时间】:2020-11-10 16:54:36
【问题描述】:

我在 GitHub Actions 中遇到了一个最奇怪的错误,我已经尝试解决了几个小时,但我完全没有想法。

我目前使用一个非常简单的 GitHub Action。最终目标是在其他工作流程中通过 ssh 运行特定的 bash 命令。

Dockerfile:

FROM ubuntu:latest

COPY entrypoint.sh /entrypoint.sh

RUN apt update && apt install openssh-client -y
RUN chmod +x entrypoint.sh
ENTRYPOINT ["/entrypoint.sh"]

entrypoint.sh:

#!/bin/sh

mkdir -p ~/.ssh/
echo "$1" > ~/.ssh/private.key
chmod 600 ~/.ssh/private.key
echo "$2" > ~/.ssh/known_hosts

echo "ssh-keygen"
ssh-keygen -y -e -f ~/.ssh/private.key
echo "ssh-keyscan"
ssh-keyscan <IP>

ssh -i ~/.ssh/private.key -tt <USER>@<IP> "echo test > testfile1"
echo "known hosts"
cat ~/.ssh/known_hosts
wc -m ~/.ssh/known_hosts

action.yml

name: "SSH Runner"
description: "Runs bash commands in remote server via SSH"
inputs:
  ssh_key:
    description: 'SSH Key'
  known_hosts:
    description: 'Known Hosts'
runs:
  using: 'docker'
  image: 'Dockerfile'
  args:
    - ${{ inputs.ssh_key }}
    - ${{ inputs.known_hosts }}

同一仓库中的当前工作流文件:

on: [push]

jobs:
  try-ssh-commands:
    runs-on: ubuntu-latest
    name: SSH MY_TEST
    steps:
      - name: Checkout
        uses: actions/checkout@v2
      - name: test_ssh
        uses: ./
        with:
          ssh_key: ${{secrets.SSH_PRIVATE_KEY}}
          known_hosts: ${{secrets.SSH_KNOWN_HOSTS}}

在 github 操作在线控制台中,我得到以下输出:

ssh-keygen
---- BEGIN SSH2 PUBLIC KEY ----
Comment: "2048-bit RSA, converted by root@844d5e361d21 from OpenSSH"
AAAAB3NzaC1yc2EAAAADAQABAAABAQDaj/9Guq4M9V/jEdMWFrnUOzArj2AhneV3I97R6y
<...>
9f/7rCMTJwae65z5fTvfecjIaUEzpE3aen7fR5Umk4MS925/1amm0GKKSa2OOEQnWg2Enp
Od9V75pph54v0+cYfJcbab
---- END SSH2 PUBLIC KEY ----
ssh-keyscan
# <IP>:22 SSH-2.0-OpenSSH_7.6p1 Ubuntu-4ubuntu0.3
# <IP>:22 SSH-2.0-OpenSSH_7.6p1 Ubuntu-4ubuntu0.3
# <IP>:22 SSH-2.0-OpenSSH_7.6p1 Ubuntu-4ubuntu0.3
# <IP>:22 SSH-2.0-OpenSSH_7.6p1 Ubuntu-4ubuntu0.3
# <IP>:22 SSH-2.0-OpenSSH_7.6p1 Ubuntu-4ubuntu0.3
<IP> ssh-ed25519 AAAAC3NzaC1lZD<...>9r5SNohBUitk
<IP> ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDRNWiDWO65SKQnYZafcnkVhWKyxxi5r+/uUS2zgYdXvuZ9UIREw5sumR95kbNY1V90<...>
qWXryZYaMqMiWlTi6ffIC5ZoPcgGHjwJRXVmz+jdOmdx8eg2llYatRQbH7vGDYr4zSztXGM77G4o4pJsaMA/
***
Host key verification failed.
known hosts
***
175 /github/home/.ssh/known_hosts

据我了解,*** 用于替换 GitHub 机密,在我的情况下,它是已知主机的密钥。得到*** 作为ssh-keyscan 的结果 cat known_host 应该意味着known_hosts 文件是正确的并且应该可以建立连接。因为在这两种情况下,控制台输出都被 GitHub 成功审查。由于该文件包含 175 个字符,我可以假设它包含实际的密钥。但是正如人们所看到的那样,脚本失败了Host key verification failed

当我在另一个工作流程中使用完全相同的输入数据手动执行相同的步骤时,我成功了。来自我的本地计算机的 ssh 也是如此,具有相同的 private_keyknown_host 文件。

例如,这适用于完全相同的秘密

- name: Create SSH key
        run: |
          mkdir -p ~/.ssh/
          echo "$SSH_PRIVATE_KEY" > ../private.key
          sudo chmod 600 ../private.key
          echo "$SSH_KNOWN_HOSTS_PROD" > ~/.ssh/known_hosts
        shell: bash
        env:
          SSH_PRIVATE_KEY: ${{secrets.SSH_PRIVATE_KEY}}
          SSH_KNOWN_HOSTS: ${{secrets.SSH_KNOWN_HOSTS}}
- name: SSH into DO and run
        run: >
          ssh -i ../private.key -tt ${SSH_USERNAME}@${SERVER_IP}
          "
            < commands >
          "

entrypoint.sh 中的ssh 命令上使用 -o "StrictHostKeyChecking no" 标志也有效。但出于安全原因,我想避免这种情况。

我已经尝试解决这个问题几个小时,但我似乎错过了一个关键细节。有没有人遇到过类似的问题或知道我做错了什么?

【问题讨论】:

  • 你是如何确定 ${{secrets.SSH_KNOWN_HOSTS}} 中的值的?
  • 你这是什么意思?通常 Github 会审查你的秘密。因此,如果您不知道您的秘密是什么(例如,如果您丢失了它),但您想检索该值,您可以尝试将其写入文件并从中创建一个 github 工件。然后您应该可以通过网络界面下载它。如果这不是您的意思,请详细说明您的问题。

标签: docker ssh continuous-integration continuous-deployment github-actions


【解决方案1】:

所以经过几个小时的搜索,我发现了问题所在。 当使用-o "StrictHostKeyChecking no" 选项强制接受所有主机密钥时,不会创建~/.ssh/known_hosts 文件。这意味着我安装在容器中的 openssh-client 似乎没有从该文件中读取。 所以告诉 ssh 命令在哪里寻找文件解决了这个问题:

ssh -i ~/.ssh/private.key -o UserKnownHostsFile=/github/home/.ssh/known_hosts -tt &lt;USER&gt;@&lt;IP&gt; "echo test &gt; testfile1"

显然,也可以永久更改ssh_configknown_hosts 文件的位置(参见here)。

希望这可以在某个时候帮助某人。

【讨论】:

    【解决方案2】:

    首先,在您的入口点中添加一个chmod 600 ~/.ssh/known_hosts

    为了测试,我会检查options around ssh-keyscan 是否有任何不同:

    ssh-keyscan -H <IP>
    # or
    ssh-keyscan -t rsa -H <IP>
    

    检查您的密钥是否是使用默认的 rsa 公钥密码系统生成的。
    HostKeyAlgorithms used might be set differently,在这种情况下:

    ssh-keyscan -H -t ecdsa-sha2-nistp256 <IP>
    

    【讨论】:

    • 我已经添加了chmod 600,但不幸的是这并没有改变任何东西。当我使用 ssh-keyscan 扫描 v-server 时,它有 3 个密钥。 ssh-rsassh-ed25519 和我正在使用的(ecdsa-sha2-nistp256)在 GitHub 输出中被审查。我已经尝试将这些中的每一个添加到known_hosts 文件中,并且我还尝试一次添加所有三个。所有 v-servers(数字海洋)都使用 ecdsa-sha2-nistp256,我总是在 known_hosts 文件中使用它们。就像我上面说的,我认为问题源于使用 bash 脚本。因为在 GitHub workflow.yml 中使用相同的密钥有效。
    • @j.unruh 好的。使用-H 没有改变任何八?
    • 不,遗憾的是没有,但我确实找到了问题所在。见下文。
    猜你喜欢
    • 2021-12-25
    • 2020-07-15
    • 1970-01-01
    • 2019-12-08
    • 1970-01-01
    • 2019-10-21
    • 2021-07-03
    • 2011-05-08
    • 2013-02-16
    相关资源
    最近更新 更多