将私钥粘贴到 Jenkins 门户网站安全吗?

Is pasting a private key into the Jenkins web portal secure?

在 Jenkins 中,我只见过一种存储私有 ssh 密钥凭据的方法。

大家推荐这个方法:在网络浏览器中打开Jenkins服务器门户网站,进入Credentials,在Add Credentials、select SSH Username with private key下,将私钥粘贴到网页中,然后点击 ok

我假设,这使用 HTML 形式通过 HTTPS 将 POST 请求中的私钥发送到 Jenkins 服务器,然后 Jenkins 服务器将私钥本地保存在服务器的磁盘上。

问题:问题“How to securely send private keys?”得票最高的答案表明 ssh 私钥只能通过 不传输来保护完全没有.

我的问题:将私钥粘贴到 Jenkins 门户网站并通过 HTTPS 传输它们真的安全吗?如果没有,将私钥放入 Jenkins 凭据的最佳方法是什么?

保护私钥的第二种方法是只使用一个特定用途:然后您可以随时轻松撤销该密钥,重新生成一个专用于该访问的密钥,并注册新密钥。

也就是说,copy/pastingJenkins Web GUI 的密钥在您的客户端和 Jenkins 服务器之间进行加密传输被认为足够安全,尤其是在企业 LAN(局域网)环境中,以你自己的 Jenkins 服务器。

如果您是通过互联网在 WAN 上通话,那么……这不是完全 防弹保险箱。但对于某些 Jenkins 作业(除非这些作业泄露敏感数据),它应该足够好。

原位

为此使用网络 UI 对于几乎所有用例来说可能是安全的足够,并且在便利性方面很难被超越。

尽管如此,在需要的地方生成私钥当然是个好建议,而且使用 Jenkins 绝对是可能的。一种方法:

  • 通过 SSH 连接到 Jenkins 服务器,并生成密钥
  • 运行 一些 groovy 在脚本控制台中创建 Jenkins 凭据
  • 泄露 public 密钥
  • 删除服务器上生成的密钥

在这个例子中,在Jenkins服务器上$HOME$JENKINS_HOME都指向/var/jenkins_home,密钥在~/temp中生成。


在 Jenkins 服务器上生成密钥

ssh jenkins@my.jenkins.server
mkdir ~/temp
cd ~/temp
ssh-keygen -t rsa -b 4096 -C "some-meaningful-label" -f "./my-in-situ-key"

这会在 /var/jenkins_home/temp 中创建 my-in-situ-keymy-in-situ-key.pub


创建 Jenkins 凭证

在 Jenkins 脚本控制台中:

import com.cloudbees.jenkins.plugins.sshcredentials.impl.BasicSSHUserPrivateKey
import com.cloudbees.plugins.credentials.CredentialsScope
import com.cloudbees.plugins.credentials.domains.Domain

def domain = Domain.global()

def store = Jenkins.instance.getExtensionList('com.cloudbees.plugins.credentials.SystemCredentialsProvider')[0].getStore()

def privateKeyString = new File('/var/jenkins_home/temp/my-in-situ-key').text
def keySource = new BasicSSHUserPrivateKey.DirectEntryPrivateKeySource(privateKeyString)

def privateKeyCredential = new BasicSSHUserPrivateKey(
    CredentialsScope.GLOBAL,
    "temp-stack-overflow-key",      // id
    "jenkins",                      // username
    keySource,                      // private key
    "",                             // passphrase
    "Temporary Demo Key"            // description
)

store.addCredentials(domain, privateKeyCredential)
"Credential Added"

清理前测试凭据。


清理

拿到public钥匙,出门时一定要删除私钥

cat ~/temp/my-in-situ-key.pub
rm -rf ~/temp

Relevant Javadoc

简短的回答是"No"。如果您想在 Jenkins 服务器中使用 SSH 身份,请在那里生成一个不同的 public/private 密钥并将其专门用于该目的。