GitLab CI: SSH falla, no se puede autenticar la clave privada

Aug 18 2020

Seguí este enlace para intentar SSH a mi servidor en Gitlab-CI. Para las claves SSH, entré al servidor y genere las claves públicas y privadas. La clave privada se extrae en las variables env de GitLab CI / CD.

La plantilla YAML es la siguiente, copiada principalmente del enlace.

    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

Sin embargo, encontré un error al intentar acceder a la clave privada.

    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.

Estoy usando corredores compartidos de gitlab, si eso ayuda.

[Actualizar]

Olvidé agregar que en el servidor que quiero conectar, agregué las claves públicas que generé id_rsa.puben los authorized_keysarchivos.

[Editar 1]

Como se sugirió, agregué los hosts conocidos usando ssh-keyscan para copiar la salida como una variable $ SSH_KNOWN_HOSTS. Debajo del archivo yaml actualizado. Sin embargo, encontré el mismo error.

    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

Respuestas

2 DV82XL Aug 18 2020 at 12:45

No estoy seguro sshpass, ya que suelo utilizar claves públicas / privadas. Aquí hay un ejemplo de un trabajo que configuraría para ejecutar SCP/ SSHcomandos en servidores remotos:

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"

Antes de ejecutar la canalización, debe hacer lo siguiente:

  1. Genere pares de claves ssh usando ssh-keygen. No use una frase de contraseña. La clave pública termina en .pub, la clave privada no tiene extensión.
  2. SSH en el servidor remoto, copie el contenido de la clave pública en~/.ssh/authorized_keys
  3. Copie el contenido de su clave privada en variables de entorno de archivo de GitLab llamadasSSH_PRIVATE_KEY
  4. Si usa una $HOSTNAMEvariable de entorno, defina la variable en su canalización y agregue la IP / nombre de host al /etc/hostsarchivo en su contenedor de canalización. De lo contrario, simplemente use una dirección IP.