web-dev-qa-db-fra.com

Pipeline Jenkins: SSHAgent ssh distant

dans un pipeline Jenkins2.0 j'ai besoin d'un ssh distant pour cibler la machine. Mon ancienne approche consistait à utiliser "Exécuter des scripts Shell sur un hôte distant en utilisant ssh". Je voudrais spécifier le nom d'utilisateur et le mot de passe.

J'ai lu que l'approche groovy devait être quelque chose comme

sshagent(['RemoteCredentials']) {
    sh 'ssh -o StrictHostKeyChecking=no -l remoteusername remotetarget uname -a'
  }

RemoteCredentials: c'est la clé privée avec mot de passe

Existe-t-il un moyen de créer ssh avec les informations d'identification à distance du nom d'utilisateur/mot de passe? Le sshagent ne prend pas en charge l'authentification par nom d'utilisateur/mot de passe

Riccardo

8
Riccardo79

Alors malheureusement, vous avez raison.

Il semble que le plugin ssh-agent ne prenne en charge que les informations d'identification utilisateur, la phrase secrète et la clé publique stockées ajoutées via la zone de gestion des informations d'identification dans Jenkins. Voir ce test unitaire qui vérifie que ssh-agent fonctionne correctement en fonction d'une clé publique. Il est peu probable qu'il existe une fonctionnalité non testée dans le plugin pour prendre en charge l'authentification utilisateur + mot de passe.

Si vous le pouvez, passez à l'authentification basée sur la clé publique. Si pour une raison quelconque vous ne pouvez pas changer ... vous [~ # ~] pourriez [~ # ~] installer sshpass sur votre boîte Jenkins, mais c'est généralement considéré comme une mauvaise pratique.

node {
    stage 'Does sshpass work?'
    sh 'sshpass -p \'password\' ssh user@Host "ls; hostname; whois google.com;"'
}
6
Stefan Crain

Intensifier votre jeu en exécutant des tâches ssh sur les agents Jenkins rendra vos serveurs plus sécurisés. Jenkins est un vecteur d'attaque lorsque vous exécutez des tâches ssh comme Ansible, et il est souhaitable de contrôler les versions.

  • Améliorer/etc/sshd_config arrêtera beaucoup de sondes par des pirates.

    PasswordAuthentication no

    PubkeyAuthentication oui

    PermitRootLogin non

  • Passez des paires de clés DSA ou RSA à la cryptographie à courbe elliptique ed25519 plus sécurisée avec protection par force brute sur le fichier de clés privé.

    ssh-keygen -t ed25519 -o -a 300 -C Jenkins

    Parce que la clé privée a besoin de centaines de tours, chaque utilisation prendra des dizaines de secondes, ce qui est parfait pour un agent de build où les développeurs pourraient fouiner.

Je préfère ne pas stocker la clé privée en tant qu'identifiant dans Jenkins, car Jenkins est un moteur d'exécution de code enfichable, au lieu de cela, je stocke uniquement la phrase secrète en tant qu'identifiant de texte secret (nommé mySecretText dans l'exemple). J'ai des agents dédiés aux environnements, chacun possédant son propre fichier de clés ~/.ssh/id_ed25519 avec un rayon de souffle limité. La phrase secrète est utilisée pour démarrer un agent ssh, plus spécifiquement pour charger la clé par session.

Le fichier Jenkins ci-dessous permet d'utiliser la paire de clés pour pousser une balise vers git, mais il n'y a pas de texte en clair sur le disque. Cette implémentation a été choisie car le plugin ssh-agent ne permettait pas ssh-add.

node {
    println("Checkout repository...")
    checkout scm
}

pipeline {
    agent {
        label "linux"
    }

    options {
        disableConcurrentBuilds()
    }

    stages {
        stage('PushTheTag') {
            steps {
                script {
                    withCredentials([string(credentialsId: 'mySecretText', variable: 'SSH_PASSPHRASE')]) {
                        sh "echo 'echo \$SSH_PASSPHRASE' > ~/.ssh/tmp && chmod 700 ~/.ssh/tmp"
                        sh "eval `ssh-agent -s` && cat ~/.ssh/id_ed25519|DISPLAY=None SSH_ASKPASS=~/.ssh/tmp ssh-add - && git tag ${env.BUILD_NUMBER} && git Push --tags; kill -9 \$SSH_AGENT_PID"
                    }
                }
            }
        }
    }
}
0
bbaassssiiee