首页 > 解决方案 > 通过 Jenkins Pipeline 使用 ssh 密钥从 Vault 到 ssh

问题描述

我正在尝试使用存储在 Hashicorp Vault 中的 ssh 私钥对 Jenkins Pipeline 中的某些服务器进行 ssh。我有以下代码

stage('Syncing Scripts') {
        steps {
            script {
                withVault([configuration: vaultConfiguration, vaultSecrets: vaultSecrets]) {
                    remoteCommands.copyLocalDirToServer(credentials, "server_files/*", "${username}@${host}", "~/server_path")
                }
            }
        }
    }

库代码remoteCommands

void copyLocalDirToServer(String credentials, String localDir, String server, String remoteDir, int timeoutSec=10) {
    sshagent(credentials : [credentials]) {
        checkConnectivity(credentials, server, timeoutSec)
        sh "scp -r ${localDir} ${server}:${remoteDir} "
    }
}

username,host是通过 Vault 绑定的两个环境变量。credentials当前是指存储在 Jenkins 凭据中的 ssh 密钥。管道正在工作。

Vault 应该是唯一的事实来源。ssh 密钥存储在 Vault 中,我可以获取它们。但问题是我在环境变量中从 Vault 获取了一个字符串。我不确定如何将其传递给 ssh 命令。创建要传递给 ssh 命令的文件会将 ssh 密钥以纯文本形式放在 Jenkins 上,这是不推荐的。

为了避免这种情况,我不得不在 Jenkins 凭据中复制 ssh 密钥。我想避免这种重复。

什么是可能的解决方案,可以将从秘密提供者(如 Vault)获取的秘密 ssh 密钥传递给在 Jenkins Pipeline 中运行且不会损害安全最佳实践的 ssh 命令?

标签: securityjenkinssshjenkins-pipelinehashicorp-vault

解决方案


推荐阅读