web-dev-qa-db-ja.com

Jenkinsパイプライン:SSHAgentリモートSSH

jenkins2.0パイプラインで、ターゲットマシンにリモートSSHが必要です。私の古いアプローチは、「sshを使用してリモートホストでシェルスクリプトを実行する」というものでした。ユーザー名とパスワードの両方を指定したいのですが。

私はグルーヴィーなアプローチが次のようなものであるべきだと読んだ

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

RemoteCredentials:パスフレーズ付きの秘密鍵です

ユーザー名/パスワードのリモート認証情報でsshを作成する方法はありますか? sshagentはユーザー名/パスワード認証をサポートしていません

リカルド

8
Riccardo79

だから残念ながら、あなたは正しい。

Ssh-agent-pluginは、JenkinsのCredentials Management領域で追加された、保存されたユーザー、パスフレーズ、公開鍵認証情報のみをサポートしているようです。 この単体テストを参照 は、公開鍵に基づいてssh-agentが正しく機能していることを確認します。プラグインにテストされていない機能があり、user + password authをサポートすることはほとんどありません。

可能であれば、公開鍵ベースの認証に切り替えます。なんらかの理由で切り替えることができない場合...[〜#〜] [〜#〜]インストール sshpass をJenkinsボックスに、しかし、これは一般的に悪い習慣と考えられています。

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

Jenkinsエージェントでsshタスクを実行するゲームをステップアップすると、サーバーがより安全になります。 Jenkinsは、Ansibleのようなsshタスクを実行する場合の攻撃ベクトルであり、リリースを制御できることが望ましいです。

  • / etc/sshd_configを改善すると、ハッカーによる多くのプローブが停止します。

    PasswordAuthenticationいいえ

    PubkeyAuthenticationはい

    PermitRootLoginいいえ

  • DSAまたはRSAのキーペアから、プライベートキーファイルをブルートフォースで保護する、より安全なed25519楕円曲線暗号に移行します。

    ssh-keygen -t ed25519 -o -a 300 -Cジェンキンス

    秘密鍵は数百回のラウンドを必要とするため、使用するたびに数十秒かかります。これは、開発者が覗き見する可能性のあるビルドエージェントに最適です。

Jenkinsはプラグイン可能なコード実行エンジンであるため、秘密鍵を資格情報としてJenkinsに保存するのではなく、パスフレーズのみを秘密のテキスト資格情報(例ではmySecretTextという名前)として保存します。環境ごとに専用のエージェントがあり、それぞれに独自の〜/ .ssh/id_ed25519キーファイルがあり、爆風半径が制限されています。パスフレーズは、ssh-agentを開始するために使用されます。具体的には、セッションごとにキーをロードするために使用されます。

以下の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"
                    }
                }
            }
        }
    }
}
0
bbaassssiiee