GitLab CI: SSH gagal, tidak dapat mengautentikasi kunci pribadi

Aug 18 2020

Saya mengikuti tautan ini untuk mencoba SSH ke server saya di Gitlab-CI. Untuk kunci SSH, saya masuk ke server, dan menghasilkan kunci publik & pribadi. Kunci pribadi diekstrak ke dalam variabel env CI / CD GitLab.

Template YAML adalah seperti di bawah ini, sebagian besar disalin dari link.

    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

Namun, saya mengalami kesalahan saat mencoba mengakses kunci pribadi.

    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.

Saya menggunakan pelari bersama gitlab, jika itu membantu.

[Memperbarui]

Lupa menambahkannya di server yang ingin saya hubungkan, saya menambahkan kunci publik yang saya buat id_rsa.pubke dalam authorized_keysfile.

[Sunting 1]

Seperti yang disarankan, saya telah menambahkan host yang dikenal menggunakan ssh-keyscan untuk menyalin output sebagai variabel $ SSH_KNOWN_HOSTS. Di bawah file yaml yang diperbarui. Namun saya mengalami kesalahan yang sama.

    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

Jawaban

2 DV82XL Aug 18 2020 at 12:45

Saya tidak yakin sshpass, karena saya biasanya menggunakan kunci publik / pribadi. Berikut adalah contoh pekerjaan yang akan saya siapkan untuk menjalankan SCP/ SSHperintah di server jarak jauh:

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"

Sebelum menjalankan pipeline, Anda perlu melakukan hal berikut:

  1. Hasilkan pasangan kunci ssh menggunakan ssh-keygen. Jangan gunakan frasa sandi. Kunci publik diakhiri .pub, kunci pribadi tidak memiliki ekstensi.
  2. SSH ke server jarak jauh, salin konten kunci publik ke~/.ssh/authorized_keys
  3. Salin konten kunci pribadi Anda ke dalam Variabel Lingkungan File GitLab yang dipanggilSSH_PRIVATE_KEY
  4. Jika Anda menggunakan $HOSTNAMEvariabel lingkungan, tentukan variabel di pipeline Anda dan tambahkan IP / hostname ke /etc/hostsfile di container pipeline Anda. Jika tidak, cukup gunakan alamat IP saja.