Jenkins中是通过加载credentials-plugin插件对凭据做管理的,如果有⼆次开发需求,可以关注https://github.com/jenkinsci/credentials-plugin我们通过 凭据--系统--全局凭证--添加凭据。我常⽤的两种凭据类型是Username with password和Secret text,如下图所示。
图1
我这⾥使用演示环境进行说明,设置有些随意,如果是⽣产环境,强烈建议建⽴域做隔离,按项⽬规范设置凭据ID。配置后我们来看看如何引⽤凭证,jenkins pipeline中我们通过credentials⽅法来引⼊凭据,如下pipeline中我们尝试打印⼀下敏感信息,看到构建⽇志jenkins⽤*** 替换了密码,符合我们的预期。
如图2所示
图2
Tips:
1. 直接在steps⾥echo 或者if逻辑⾥引⽤带密码⽤户名的凭据变量是不需要$符号的。
2. 在Jenkinsfile中处理不同凭证类型有少许不同,⽐如处理Secret ⽂本,在pipeline上下⽂中直接加$引⽤。处理带密码的⽤户名,⽤户名和密码既可以作为整体引⽤,也可以加_USR 和 _PSW单独引⽤⽤户名或者密码,以harbor 为例
需要引⽤时,带上$,⽐如
还有很多其他的类型可以参考:Jenkinsfile中如何处理凭据
Gitlab CI variables
在具体项⽬的 设置--CI/CD--变量 配置⼀个mykey的变量,value为12345678,打开保护和隐藏按钮。如图3所示。
图3
我们通过.gitlab-ci.yml 构建,打印⼀下这个变量,发现作业⽇志中敏感信息显示为maskedcat .gitlab-ci.yml
但 在Gitlab CI variables 如果想让敏感信息被屏蔽,在作业⽇志中隐藏它们,必须符合⼀定的正则表达式要求才能⽣效。我在gitlab官⽅⽹站找到了这些要求供⼤家参考。
参考地址 https://gitlab.com/gitlab-org/gitlab-foss/-/issues/13784
Github Actions secret
在某个仓库⾥点击Settings--Options--Secrets 来设置需要脱敏的信息,由于Actions只给Github⾃家产品⽤,git仓库的⽤户名密码这步就省去了,直接拉取代码,只提供了类似于Jenkins 凭据管理⾥secrettext 的⽅式。以配置DingTalk access_token和签名为例,⽤secrets⽅法配合模板语法来引⽤,例如${{secrets.DINGTALK_ACCESS_TOKEN }}如图4所示。
图4
完整的⼀个Actions workflows 的demo yml 配置⽂件如下
我们依然发现构建⽇志中配置在secrets⾥的信息显示为"***",如图5所示。
图5
⼀些有益的补充
GoCD Variables
GoCD中通过ADMIN--Environments--Environment Variables--Secure Environment Variables来设置保护凭证。
Argo secret
Argo 可以参考⽂档secret-management⼀节https://argoproj.github.io/argo-cd/operator-manual/secret-management/
Drone secret
Argo 可以参考⽂档encrypted⼀节https://docs.drone.io/secret/encrypted/
腾讯蓝鲸CI 凭证管理Ticket
有类似Jenkins的凭证管理,可以参考https://github.com/Tencent/bk-ci
kubesphere 凭证
有类似Jenkins的凭证管理,⼯程⾥在凭证下点击创建, 创建⼀个类型为秘密⽂本的凭证,可以参考https://kubesphere.com.cn/docs/zh-CN/quick-start/harbor-gitlab-devops-offline/
Travis CI Variables
项⽬⾥点击More Options--Settings--Environment Variables来把敏感信息放到变量⾥,使⽤时引⽤。默认选项"DISPLAY VALUE IN BUILD LOG"是关闭的,即构建⽇志⾥不显示敏感信息。如图6所示。
图6
可以参考https://docs.travis-ci.com/user/best-practices-security#recommendations-on-how-to-avoid-leaking-secrets-to-build-logs
⼩结
通过对Jenkins,Gitlab CI,Github Actions 的演示,对pipeline 数据脱敏,我们可⻅⼀斑。其他的CICD ⼯具⼤抵如此,基本都是通过凭据和配置分离,对凭证单独加密,使⽤时再解密,对作业⽇志敏感信息替换来使pipeline流程更安全。
由于平时⼯作忙和个⼈能⼒有限,本⽂写的⽐较粗浅,只希望给⼤家带来⼀丝启发。正所谓他⼭之⽯,可以攻⽟。⽆论⾃研CICD系统也好,还是践⾏DevOps的DevOps教练也好,了解⼀些开源CICDpipeline⾥数据脱敏的⽅法都是有相当帮助的。