GitLab CI: échec SSH, impossible d'authentifier la clé privée

Aug 18 2020

J'ai suivi ce lien pour essayer de SSH sur mon serveur dans Gitlab-CI. Pour les clés SSH, je suis entré dans le serveur et j'ai généré les clés publiques et privées. La clé privée est extraite dans les variables d'environnement GitLab CI / CD.

Le modèle YAML est comme ci-dessous, copié principalement à partir du lien.

    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

Cependant, j'ai rencontré une erreur en essayant d'accéder à la clé privée.

    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.

J'utilise des coureurs partagés gitlab, si cela aide.

[Mettre à jour]

Oublié d'ajouter que dans le serveur que je souhaite connecter, j'ai ajouté les clés publiques que j'ai générées id_rsa.pubdans les authorized_keysfichiers.

[Modifier 1]

Comme suggéré, j'ai ajouté les hôtes connus en utilisant ssh-keyscan pour copier la sortie en tant que variable $ SSH_KNOWN_HOSTS. Ci-dessous le fichier yaml mis à jour. Cependant, j'ai rencontré la même erreur.

    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

Réponses

2 DV82XL Aug 18 2020 at 12:45

Je ne suis pas sûr sshpass, car j'utilise généralement des clés publiques / privées. Voici un exemple de travail que je configurerais pour exécuter SCP/ SSHcommandes sur des serveurs distants:

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"

Avant d' exécuter le pipeline, vous devez effectuer les opérations suivantes:

  1. Générez des paires de clés ssh à l'aide de ssh-keygen. N'utilisez pas de phrase secrète. La clé publique se termine par .pub, la clé privée n'a pas d'extension.
  2. SSH sur le serveur distant, copiez le contenu de la clé publique dans~/.ssh/authorized_keys
  3. Copiez le contenu de votre clé privée dans une variable d'environnement de fichier GitLab appeléeSSH_PRIVATE_KEY
  4. Si vous utilisez une $HOSTNAMEvariable d'environnement, définissez la variable dans votre pipeline et ajoutez l'adresse IP / le nom d'hôte au /etc/hostsfichier dans votre conteneur de pipeline. Sinon, utilisez simplement une adresse IP à la place.