在 Jenkins 中,我只见过一种存储私有(private) ssh key 凭证的方法。
这个方法大家都推荐:在浏览器中打开Jenkins服务器门户网站,进入Credentials
, 及以下 Add Credentials
, 选择 SSH Username with private key
,将私钥粘贴到网页中,然后点击ok
.
我假设这使用 HTML 表单通过 HTTPS 将 POST 请求中的私钥发送到 Jenkins 服务器,然后将私钥本地保存在服务器的磁盘上。
问题 :对问题“How to securely send private keys?”的最高投票回答指出,私有(private) ssh key 只能由 保护。根本不传输 .
我的问题 :将私钥粘贴到 Jenkins 门户网站并通过 HTTPS 传输它们真的安全吗?如果没有,将私钥放入 Jenkins 凭据的最佳方法是什么?
最佳答案
现场
对于几乎所有用例来说,为此使用 Web UI 可能已经足够安全,并且在便利性方面很难被击败。
尽管如此,在需要的地方生成私钥肯定是个好建议,并且绝对可以使用 Jenkins。一种方法:
在本例中,在 Jenkins 服务器上,
$HOME
和 $JENKINS_HOME
指向/var/jenkins_home
, 并且 key 在 ~/temp
中生成.在 Jenkins 服务器上生成 key
ssh jenkins@my.jenkins.server
mkdir ~/temp
cd ~/temp
ssh-keygen -t rsa -b 4096 -C "some-meaningful-label" -f "./my-in-situ-key"
这将创建
my-in-situ-key
和 my-in-situ-key.pub
在 /var/jenkins_home/temp
.创建 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
关于security - 将私钥粘贴到 Jenkins 门户网站是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60731262/