网站首页 > 技术文章 正文
Jenkins的凭证管理
什么是凭证?
凭证(cridential)是Jenkins进行受限操作时的凭据。比如使用SSH登录远程机器时,用户名和密码或SSH key就是凭证。而这些凭证不可能以明文写在Jenkinsfile中。Jenkins凭证管理指的就是对这些凭证进行管理。
为了最大限度地提高安全性,在Jenkins master节点上对凭证进行加密存储(通过Jenkins实例ID加密),只有通过它们的凭证ID才能在pipeline中使用,并且限制了将证书从一个Jenkins实例复制到另一个Jenkins实例的能力。
也因为所有的凭证都被存储在Jenkins master上,所以在Jenkins master上最好不要执行任务,以免被pipeline非法读取出来。那么在哪里执行pipeline呢?应该分配到Jenkins agent上执行。
创建凭证
首先确保当前用户有添加凭证的权限。我们使用超级管理员的身份登录。单击Jenkins首页左侧的Credentials→System
然后单击“Global credentials (unrestricted)”链接,再单击“Add Credentials”
凭证的类型
Jenkins默认支持以下凭证类型:Secret text、Username with password、Secret file、SSHUsername with private key、Certificate:PKCS#12、Docker Host CertificateAuthentication credentials。
? Secret text是一串需要保密的文本,比如GitLab的API token。
? Username with password指用户和密码凭证。
? Secret file指需要保密的文本文件。使用Secret file时,Jenkins会将文件复制到一个临时目录中,再将文件路径设置到一个变量中。构建结束后,所复制的Secret file会被删除。
? SSH Username with private key指一对SSH用户名和密钥。
添加凭证后,安装Credentials Binding Plugin插件,通过其提供的withCredentials步骤就可以在pipeline中使用凭证了。
? Secret text
? Username with password
? Secret file
? SSH Username with private key
? sshUserPrivateKey函数还支持以下参数。
? ? usernameVariable:SSH用户名的变量名。
? ? passphraseVariable:SSH key密码的变量名。
credentials helper方法使用凭证
? Secret text:
? AWS-SECRET-KEY-ID和AWS-SECRET-ACCESS-KEY是我们预先定义的凭证ID。creden-tials方法将凭证的值赋给变量后,我们就可以像使用普通环境变量一样使用它们了,如:echo"${AWS ACCESS KEY ID}"。
Username with password:
? 与 Secret text 不同的是,我们需要通过 BITBUCKET CREDS USR 拿到用户名的值,通过BITBUCKET CREDS PSW拿到密码的值。而变量BITBUCKET CREDS的值则是一个字符串,格式为:<用户名>:<密码>。
Secret file:
credentials helper方法只支持Secret text、Username with password、Secretfile三种凭证。
使用HashiCorp Vault
(1)安装HashiCorp Vault插件
(2)添加Vault Token凭证
(3)配置Vault插件
(4) 在pipeline中读取
我们可以在environment和steps中使用vault步骤。推荐在environment中使用。
vault步骤的参数如下:
? path,存储键值对的路径。
? key,存储内容的键。
? vaultUrl(可选),vault服务地址。
? credentialsId(可选),vault服务认证的凭证。
如果不填vaultUrl与credentialsId参数,则使用系统级别的配置。
在Jenkins日志中隐藏敏感信息
? 如果使用的是credentials helper方法或者withCredentials步骤为变量赋值的,那么这个变量的值是不会被明文打印到Jenkins日志中的。除非使用以下方法:
在没有使用credential的场景下,我们又该如何在日志中隐藏变量呢?可以使用Masked Pass-word插件。通过该插件提供的包装器,可以隐藏我们指定的敏感信息。
初次使用 Masked Password 插件很容易以为是使用 s1 和 s2 作为变量的,如 echo"被隐藏的密文:${s1} 和 ${s2}"。实际上,var参数只是用于方便在自由风格的Jenkins项目中区分不同的需要隐藏的密文。在pipeline中使用,它就没有存在的意义了。但是即使这样也不能省略它,必须传一个值。password参数传的是真正要隐藏的密文。
那么,为什么echo "secret1"这条语句中并没有使用预定义的变量,secret1也会被隐藏呢?这是由Masked Password插件的实现方式决定的。
Jenkins 提供了 ConsoleLogFilter 接口,可以在日志打印阶段实现我们自己的业务逻辑。Masked Password 插件实现了 ConsoleLogFilter 接口,然后利用正则表达式将匹配到的文本replaceAll成****。
MaskPasswordsBuildWrapper包装器除了支持varPasswordPairs参数,还支持varMaskRegexes参数,使用自定义的正则表达式匹配需要隐藏的文本。写法如下:
通过Masked Password插件还可以设置全局级别的密文隐藏,在Manage Jenkins→ConfigureSystem页中可以找到,具体配置如图
猜你喜欢
- 2024-11-21 Docker搭建Jenkins持续集成环境构建springcloud项目
- 2024-11-21 使用Jenkins完成项目持续集成和部署
- 2024-11-21 Jenkins的一些技巧
- 2024-11-21 Jenkins 学习笔记
- 2024-11-21 重启了下 Jenkins,踩到了一个深埋多年的坑
- 2024-11-21 详解Jenkins 实现Gitlab事件自动触发Jenkins构建及钉钉消息推送
- 2024-11-21 Jenkins 安装部署教程
- 2024-11-21 Docker+Jenkins+Nginx+Spring Boot 自动化部署项目
- 2024-11-21 从零搭建一个基于 ELK 的日志、指标收集与监控系统
- 2024-11-21 手把手教你用 Jenkins 自动部署 SpringBoot
- 最近发表
- 标签列表
-
- cmd/c (57)
- c++中::是什么意思 (57)
- sqlset (59)
- ps可以打开pdf格式吗 (58)
- phprequire_once (61)
- localstorage.removeitem (74)
- routermode (59)
- vector线程安全吗 (70)
- & (66)
- java (73)
- org.redisson (64)
- log.warn (60)
- cannotinstantiatethetype (62)
- js数组插入 (83)
- resttemplateokhttp (59)
- gormwherein (64)
- linux删除一个文件夹 (65)
- mac安装java (72)
- reader.onload (61)
- outofmemoryerror是什么意思 (64)
- flask文件上传 (63)
- eacces (67)
- 查看mysql是否启动 (70)
- java是值传递还是引用传递 (58)
- 无效的列索引 (74)