一.简介
众所周知,在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密码的变量名