【问题标题】:Is pasting a private key into the Jenkins web portal secure?将私钥粘贴到 Jenkins 门户网站是否安全?
【发布时间】:2020-06-29 01:24:04
【问题描述】:

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

大家推荐这个方法:在浏览器中打开Jenkins服务器门户,进入Credentials,在Add Credentials下,选择SSH Username with private key,将私钥粘贴到网页中,点击@ 987654325@。

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

问题:对问题“How to securely send private keys?”的最高投票回答指出,私有 ssh 密钥只能通过根本不传输它来保护。

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

【问题讨论】:

  • 您是否正在尝试将 Jenkins 与 GitHub 连接起来?还是其他服务?

标签: security jenkins encryption ssh ssh-keys


【解决方案1】:

原位

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

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

  • SSH 进入 Jenkins 服务器,并生成密钥
  • 在脚本控制台中运行一些 groovy 以创建 Jenkins 凭据
  • 泄露公钥
  • 删除服务器上生成的密钥

在本例中,在 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"

在清理之前测试凭据。


清理

带上公钥并确保在出门时删除私钥

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

Relevant Javadoc

【讨论】:

    【解决方案2】:

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

    话虽如此,将密钥复制/粘贴到 Jenkins Web GUI 并在您的客户端和 Jenkins 服务器之间进行加密传输被认为是足够安全的,尤其是在企业 LAN(局域网)环境中,您自己的 Jenkins 服务器.

    如果您通过互联网谈论 WAN,那么...这不是 完全 防弹安全的。但对于一些 Jenkins 工作(除非这些工作会泄露敏感数据),它应该已经足够好了。

    【讨论】:

      【解决方案3】:

      简短的回答是“不”。如果您想在 Jenkins 服务器中使用 SSH 身份,请在此处生成不同的公钥/私钥并将其专门用于该目的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-11
        • 1970-01-01
        • 2022-10-15
        • 1970-01-01
        • 1970-01-01
        • 2023-01-10
        相关资源
        最近更新 更多