You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 21:18:17