Jenkins管道:SSHAgent远程ssh

时间:2016-06-14 07:42:53

标签: jenkins ssh jenkins-pipeline

在Jenkins2.0管道中我需要远程ssh来定位机器。 我的旧方法是使用"使用ssh"在远程主机上执行shell脚本。我想指定用户名和密码。

我已经读过,groovy方法应该像

 [h,binLocations] = imhist(I)

RemoteCredentials:它是带密码的私钥

有没有办法用用户名/密码远程凭证制作ssh? sshagent不支持用户名/密码验证

的Riccardo

3 个答案:

答案 0 :(得分:5)

很遗憾,你是对的。

看起来ssh-agent-plugin仅支持通过Jenkins的Credentials Management区域添加的存储用户,密码,公钥证书。 See this unit test验证ssh-agent是否基于公钥正常工作。插件中不存在未经测试的功能以支持用户+密码身份验证。

如果可以,请切换到基于公钥的身份验证。如果由于某种原因你无法切换...你 COULD 在你的Jenkins盒子上安装sshpass,但这通常被认为是不好的做法。

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

答案 1 :(得分:0)

在Jenkins代理上增强运行ssh任务的游戏,将使您的服务器更安全。当您运行诸如Ansible之类的ssh任务时,Jenkins是一个攻击媒介,因此最好控制发布。

  • 改进/ etc / sshd_config将阻止黑客的大量探查。

    PasswordAuthentication否

    PubkeyAuthentication是

    PermitRootLogin no

  • 从DSA或RSA密钥对移至更安全的ed25519椭圆曲线 密码,对私钥文件具有蛮力保护。

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

    由于私钥需要几百回合,每次使用将花费数十秒, 对于构建代理来说,这是完美的,开发人员可能会四处窥探。

我宁愿不将私钥作为凭证存储在Jenkins中,因为Jenkins是可插拔的代码执行引擎,而是仅将密码短语存储为秘密文本凭证(在示例中名为mySecretText)。我有专门的环境代理,每个代理都有〜/ .ssh / id_ed25519密钥文件,爆炸半径有限。密码短语用于启动ssh代理,更具体地说,是在每个会话中加载密钥。

下面的Jenkinsfile允许使用密钥对将标签推入git,但是磁盘上没有明文。选择此实现是因为ssh-agent插件不允许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"
                    }
                }
            }
        }
    }
}

答案 2 :(得分:0)

解决方案:您想通过 ssh 连接管道中的某些机器。我想提供一种不同的方法,它更安全(我希望能够在机器本身上管理我的 ssh 凭据)。确保您的 ssh 密钥是在 ~/.ssh/id_rsa 下的基础设施中预先构建的(可以通过 ansible/chef/puppet 进行预配置,或者只是在您的 aws/gcp/azure 云环境中使用一些图像快照)。您的管道应在机器中加载 ssh 私钥凭据并连接到节点(其中包含公钥)。

_node(with private key) ---> testing/staging/production_node(with public key)

什么时候使用它?例如用例 - 您想在另一个节点中运行/停止某个进程,或者在管道中的实例 x 和 y 上部署应用程序

简单示例 - 点对点 ( node -> destination_node ) 将是:

def ip-address=<some-ip-address> 

sh """#!/bin/bash
        eval "\$(ssh-agent -s)"
        ssh-add ~/.ssh/id_rsa
        ssh -o StrictHostKeyChecking=no ${ip-address} << 'EOF'
        echo 'im in ...'
 """

复杂示例 - 堡垒使用堡垒云架构 (node -> vpc-endpoint -> destination-node) 将是:

def vpc-endpoint-gw-ip=<some-ip-address>
def subnet-ip=<some-subnet-address>

sh """#!/bin/bash 
        eval "\$(ssh-agent -s)"
        ssh-add ~/.ssh/id_rsa
        ssh -At -o StrictHostKeyChecking=no ${vpc-endpoint-gw-ip} << 'EOF'
        ssh -o StrictHostKeyChecking=no ${subnet-ip} << 'EOF2'
        echo 'im in ...'
  """