jenkins2.0パイプラインで、ターゲットマシンにリモートSSHが必要です。私の古いアプローチは、「sshを使用してリモートホストでシェルスクリプトを実行する」というものでした。ユーザー名とパスワードの両方を指定したいのですが。
私はグルーヴィーなアプローチが次のようなものであるべきだと読んだ
sshagent(['RemoteCredentials']) {
sh 'ssh -o StrictHostKeyChecking=no -l remoteusername remotetarget uname -a'
}
RemoteCredentials:パスフレーズ付きの秘密鍵です
ユーザー名/パスワードのリモート認証情報でsshを作成する方法はありますか? sshagentはユーザー名/パスワード認証をサポートしていません
リカルド
だから残念ながら、あなたは正しい。
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;"'
}
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"
}
}
}
}
}
}