GitLab CI: échec SSH, impossible d'authentifier la clé privée
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.pub
dans les authorized_keys
fichiers.
[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
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
/ SSH
commandes 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:
- 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. - SSH sur le serveur distant, copiez le contenu de la clé publique dans
~/.ssh/authorized_keys
- Copiez le contenu de votre clé privée dans une variable d'environnement de fichier GitLab appelée
SSH_PRIVATE_KEY
- Si vous utilisez une
$HOSTNAME
variable d'environnement, définissez la variable dans votre pipeline et ajoutez l'adresse IP / le nom d'hôte au/etc/hosts
fichier dans votre conteneur de pipeline. Sinon, utilisez simplement une adresse IP à la place.