如何在Jenkins中完全屏蔽密码变量及其衍生加密值?
问题场景
流水线代码如下:
maskPasswords(varPasswordPairs: [[password: 'wqer', var: 'TEST_SECRET']]) { println(TEST_SECRET) def secretBase64 = sh( script: "echo -n ${TEST_SECRET} | base64", returnStdout: true ).trim() def secretBase642 = sh( script: "echo -n ${secretBase64} | base64", returnStdout: true ).trim() echo "${secretBase642}" }
使用MaskPasswords插件时,密码原始值及首次Base64转换结果能被日志屏蔽,但二次Base64转换后的衍生值会明文暴露,需解决该问题。
解决方法
嵌套使用maskPasswords扩展屏蔽范围
MaskPasswords支持通过passwords参数直接指定需要屏蔽的字符串,在生成中间衍生值后,嵌套调用插件将该值加入屏蔽列表,确保后续基于它生成的二次转换结果也被覆盖:maskPasswords(varPasswordPairs: [[password: 'wqer', var: 'TEST_SECRET']]) { println(TEST_SECRET) def secretBase64 = sh( script: "echo -n ${TEST_SECRET} | base64", returnStdout: true ).trim() // 将首次Base64结果加入屏蔽规则 maskPasswords(passwords: [secretBase64]) { def secretBase642 = sh( script: "echo -n ${secretBase64} | base64", returnStdout: true ).trim() // 将二次Base64结果也加入屏蔽规则 maskPasswords(passwords: [secretBase642]) { echo "${secretBase642}" } } }标记衍生值为敏感环境变量
利用Jenkins环境变量的敏感标记功能,将每一步生成的衍生值标记为敏感,Jenkins会自动在日志中屏蔽这些值:maskPasswords(varPasswordPairs: [[password: 'wqer', var: 'TEST_SECRET']]) { println(TEST_SECRET) def secretBase64 = sh( script: "echo -n ${TEST_SECRET} | base64", returnStdout: true ).trim() // 标记首次Base64结果为敏感环境变量 env.SECRET_BASE64 = secretBase64 env.put('SECRET_BASE64', secretBase64, true) def secretBase642 = sh( script: "echo -n ${SECRET_BASE64} | base64", returnStdout: true ).trim() // 标记二次Base64结果为敏感环境变量 env.SECRET_BASE642 = secretBase642 env.put('SECRET_BASE642', secretBase642, true) echo "${SECRET_BASE642}" }提前计算所有需屏蔽的衍生值
如果密码是固定值(如示例中的wqer),可以提前手动计算出两次Base64转换的结果,直接加入varPasswordPairs或passwords参数中:// 提前计算:wqer的Base64是d3Flcg==,二次Base64是ZDNGbGNnPT0= maskPasswords( varPasswordPairs: [[password: 'wqer', var: 'TEST_SECRET']], passwords: ['d3Flcg==', 'ZDNGbGNnPT0='] ) { println(TEST_SECRET) def secretBase64 = sh( script: "echo -n ${TEST_SECRET} | base64", returnStdout: true ).trim() def secretBase642 = sh( script: "echo -n ${secretBase64} | base64", returnStdout: true ).trim() echo "${secretBase642}" }这种方式适合密码固定的场景,若密码是动态获取的(如从Vault或凭据库),则不适用。
内容的提问来源于stack exchange,提问作者Bakkort
相关产品推荐
相关产品推荐

