Jenkins凭证管理(上)

2021-06-03 18:03:56 浏览数 (1)

一.简介

众所周知,在Jenkinsfile或部署脚本中使用明文密码会造成安全隐患。但是为什么还频繁出现明文密码被上传到GitHub上的情况呢?笔者认为有两个主要原因(当然,现实的原因可能更多)∶ 1.程序员或运维人员不知道如何保护密码。 2.管理者没有足够重视,否则会给更多的时间让程序员或运维人员想办法隐藏明文密码。

凭证( cridential )是Jenkins进行受限操作时的凭据。比如使用SSH登录远程机器时,用户名和密码或SSH key就是凭证。而这些凭证不可能以明文写在Jenkinsfile中。Jenkins凭证管理指的就是对这些凭证进行管理。

为了最大限度地提高安全性,在Jenkins master节点上对凭证进行加密存储(通过Jenkins实例ID加密),只有通过它们的凭证ID才能在pipeline中使用,并且限制了将证书从一个Jenkins实例复制到另一个Jenkins实例的能力。

也因为所有的凭证都被存储在Jenkins master上,所以在Jenkins master上最好不要执行任务,以免被pipeline非法读取出来,应该分配到Jenkis agent上执行

二.管理凭证

创建凭证,要先确保当前账号有这个权限,Jenkins首页-》凭据-》系统-》全局凭据-》添加凭据

选项:

  • Kind:选择凭证类型
  • Scope 凭证的作用域
  • Global,全局作用域。凭证用于pipeline,则使用此种作用域
  • System,如果凭证用于Jenkins本身的系统管理,例如电子邮件身份验证、代理连接等等,则使用此种作用域
  • ID 在pipeline使用凭证的唯一标识

Jenkins默认支持以下凭证类型:Secret text、Username with password、Secret file、SSH Username with private key、Certificate:PKCS#12、Docker Host Certificate Authentication credentials。

添加凭证后,安装Credentials Binding Plugin插件。通过其提供的withCredentials步骤就可以在pipeline中使用凭证了。

三.常用凭证

保密文本

是一串需要保密的文本,比如GitLab的API token。添加方法:

代码语言:javascript复制
withCredentials([[string(credentialsId:'secretText', variable:'varName')]) {    echo "${varName}"}

账号密码

Username with password指用户和密码凭证。

代码语言:javascript复制
withCredentials([usernamePassword(credentialsId:'gitlab-user', usernameVariable:'username', passwordVariable:'passwd')]) {    echo "${username}, ${password}"}

保密文件

Secret file指需要保密的文本文件。使用Secret file时,Jenkins会将文件复制到一个临时目录中,再将文件路径设置到一个变量中。构建结束后,所复制的secret file会被删除

代码语言:javascript复制
withCredentials([file(credentialsId:'ansible-pass', variable:'vault')]){    sh "ansible -i hosts playbook.yml --vault-password-file=${vault}"}

账号秘钥

ssh Usermame with private key指一对ssh用户名和秘钥

在使用此类凭证时,Jenkins会将ssh key复制到一个临时目录中,再将文件路径设置到一个变量中

代码语言:javascript复制
withCredentials([sshUserPrivatekey(KeyFileVariable:"key",credentialsId:"private-key")]){    echo "${key}"}

sshUserPrivateKey函数还支持以下参数

  • usernameVariable:ssh用户名的变量名
  • passphraseVariable ssh key密码的变量名

0 人点赞