GitLab CI:SSHが失敗し、秘密鍵を認証できません

Aug 18 2020

このリンクをたどって、Gitlab-CIのサーバーにSSHで接続しようとしました。SSHキーについては、サーバーにアクセスして、公開キーと秘密キーを生成しました。秘密鍵はGitLabCI / CDenv変数に抽出されます。

YAMLテンプレートは以下のとおりで、ほとんどがリンクからコピーされています。

    image: docker:19.03.8
      services:
        - docker:19.03.8-dind

    deployment:
      variables:
        ip: <ip-address>
      script:
        - apk add --update openssh-client sshpass
        - eval $(ssh-agent -s) - echo "$SSH_PRIVATE_KEY" | ssh-add - > /dev/null
        - mkdir -p ~/.ssh
        - chmod 700 ~/.ssh
        - export SSHPASS=$AWS_PASSWORD - sshpass -e ssh -o StrictHostKeyChecking=no -vvv ubuntu@$ip echo testing

ただし、秘密鍵にアクセスしようとしたときにエラーが発生しました。

    debug1: Authentications that can continue: publickey,password
    debug1: Trying private key: /root/.ssh/id_rsa
    debug3: no such identity: /root/.ssh/id_rsa: No such file or directory
    debug1: Trying private key: /root/.ssh/id_dsa
    debug3: no such identity: /root/.ssh/id_dsa: No such file or directory
    debug1: Trying private key: /root/.ssh/id_ecdsa
    debug3: no such identity: /root/.ssh/id_ecdsa: No such file or directory
    debug1: Trying private key: /root/.ssh/id_ed25519
    debug3: no such identity: /root/.ssh/id_ed25519: No such file or directory
    debug1: Trying private key: /root/.ssh/id_xmss
    debug3: no such identity: /root/.ssh/id_xmss: No such file or directory
    debug2: we did not send a packet, disable method
    debug3: authmethod_lookup password
    debug3: remaining preferred: ,password
    debug3: authmethod_is_enabled password
    debug1: Next authentication method: password
    debug3: send packet: type 50
    debug2: we sent a password packet, wait for reply
    debug3: receive packet: type 51
    debug1: Authentications that can continue: publickey,password
    Permission denied, please try again.

それが助けになるなら、私はgitlab共有ランナーを使用しています。

[更新]

接続したいサーバーに追加するのを忘れたので、生成id_rsa.pubした公開鍵をauthorized_keysファイルに追加しました。

[編集1]

提案されているように、ssh-keyscanを使用して既知のホストを追加し、出力を変数$ SSH_KNOWN_HOSTSとしてコピーしました。更新されたyamlファイルの下。ただし、同じエラーが発生しました。

    deployment:
      variables:
        ip: <ip-address>
      script:
        - apk add --update openssh-client sshpass
        - eval $(ssh-agent -s)
        - echo "$SSH_PRIVATE_KEY" | ssh-add - > /dev/null - mkdir -p ~/.ssh - chmod 700 ~/.ssh - touch ~/.ssh/known_hosts - echo "$SSH_KNOWN_HOSTS" >> ~/.ssh/known_hosts
        - chmod 644 ~/.ssh/known_hosts
        - export SSHPASS=$AWS_PASSWORD - sshpass -e ssh -o StrictHostKeyChecking=no -vvv ubuntu@$ip echo testing

回答

2 DV82XL Aug 18 2020 at 12:45

私はsshpass通常公開鍵/秘密鍵を使用しているので、よくわかりません。リモートサーバーでSCP/SSHコマンドを実行するように設定するジョブの例を次に示します。

deploy:
  stage: deploy
variables:
  hostname: app-dev
before_script:
  # optional step if you decide to use a hostname instead of IP address
  - cp -f ./network/etc/hosts /etc/hosts
  # Setup SSH
  - which ssh-agent || ( apt-get update -y && apt-get install openssh-client -y )
  - eval $(ssh-agent -s) - ssh-add <(cat $SSH_PRIVATE_KEY)
  - mkdir -p ~/.ssh
  - chmod 700 ~/.ssh
  - ssh-keyscan $HOSTNAME >> ~/.ssh/known_hosts - chmod 644 ~/.ssh/known_hosts script: # Copy files and execute commands - scp ./scripts/install_package.sh root@$HOSTNAME:/tmp/deploy
  - ssh root@$HOSTNAME "/tmp/deploy/install_package.sh && exit"

パイプラインを実行する前に、次のことを行う必要があります。

  1. を使用してsshキーペアを生成しますssh-keygen。パスフレーズは使用しないでください。公開鍵はで終わり.pub、秘密鍵には拡張子がありません。
  2. リモートサーバーにSSHで接続し、公開鍵の内容をにコピーします~/.ssh/authorized_keys
  3. GitLabのにあなたの秘密鍵の内容をコピーし、ファイルの環境変数と呼ばれますSSH_PRIVATE_KEY
  4. $HOSTNAME環境変数を使用する場合は、パイプラインで変数を定義/etc/hostsし、パイプラインコンテナ内のファイルにIP /ホスト名を追加します。それ以外の場合は、代わりにIPアドレスを使用してください。