代码之家  ›  专栏  ›  技术社区  ›  Michael Lihs Paul Kenjora

在Jenkins管道日志输出中隐藏密码而不使用WithCredentials

  •  3
  • Michael Lihs Paul Kenjora  · 技术社区  · 6 年前

    我有一个基于 Jenkinsfile

    所以我的问题是:我能在 詹金斯档案 **********

    我知道 withCredentials 步骤,但我不能使用它,因为凭证不存储在Jenkins凭证存储库中(但在运行时作为参数提供)。

    https://stackoverflow.com/a/42372859/1549950 试着这样做:

    def secrets = [
        [password: firstPassword, var: 'SECRET'],
        [password: secondPassword, var: 'SECRET'],
        [password: thirdPassword, var: 'SECRET']
    ]
    
    node() {
        wrap([$class: 'MaskPasswordsBuildWrapper', varPasswordPairs: secrets]) {
            // my stages containing steps...
        }
    }
    

    firstPassword , secondPassword thirdPassword 是包含我的密码的变量。但我还是得到了 ... 在日志输出中显示纯文本。

    我有 Mask Password plugin

    基本上我在寻找这样的东西: https://issues.jenkins-ci.org/browse/JENKINS-27486 -已解析票证,但未给出最终实现的示例片段。

    3 回复  |  直到 6 年前
        1
  •  2
  •   Jesse Glick    6 年前

    我想你在找 JENKINS-36007 ?

        2
  •  3
  •   Michael Lihs Paul Kenjora    6 年前

    定义一个包含要隐藏的秘密的数组,如下所示:

    def splunkPassword = 'verySecretPa55w0rd'
    def basicAuthPassword = 'my8asicAuthPa55w0rd'
    
    def getSecrets() {
        [
                [password: splunkPassword, var: 'SECRET'],
                [password: basicAuthPassword, var: 'SECRET']
        ]
    }
    

    SECRET 值有一个重要的角色,从某个代码段复制并粘贴它,它可以按预期工作:)

    脚本化管道

    node {
        wrap([$class: 'MaskPasswordsBuildWrapper', varPasswordPairs: getSecrets()]) {
            stage 'First Stage' { ... }
            stage 'Second Stage' { ... }
        }
    }
    

    中提供的所有密码 getSecrets() 然后在生成输出中将数组屏蔽如下:

    SPLUNK_PASSWORD: ********
    BASIC_AUTH_ADMIN_PASSWORD: ********
    
        3
  •  2
  •   Jason Day    4 年前

    更新日期:2020年5月26日

    下面的解决方法最近不再适用于我。我猜在詹金斯最近的更新中有些变化。我试图避免安装另一个插件,但我最终放弃并安装了 Mask Passwords plugin .

    parameters {
        string(name: 'USERNAME', defaultValue: '', description: 'Username')
        password(name: 'PASSWORD', defaultValue: '', description: 'Password')
    }
    

    然后在构建阶段:

    steps {
        script {
            wrap([$class: 'MaskPasswordsBuildWrapper',
                  varPasswordPairs: [
                      [password: "${USERNAME}", var: 'USR'],
                      [password: "${PASSWORD}", var: 'PSW']
                  ]
            ]) {
                sh '''
                    echo "Username: ${USERNAME}"
                    echo "Password: ${PASSWORD}"
                '''
            }
        }
    }
    


    我发现了一个解决方法,这是一个有点黑客,但似乎工作得很好。诀窍是使用 withCredentials

    下面是一个使用 environment credentials() helper方法来填充一个环境变量,然后重写自动定义(并在日志中屏蔽)的另外两个环境变量。

    Username with password 资格证书。这个 Username Password 值不重要,我们只需要一个凭证作为占位符。输入一个ID,例如 dummy-credentials

    然后使用伪凭证定义环境变量,并使用参数覆盖自动定义的变量( MYUSERNAME MYPASSWORD 在本例中):

    environment {
        MY_CREDS = credentials('dummy-credentials')
        MY_CREDS_USR = "${params.MYUSERNAME}"
        MY_CREDS_PSW = "${params.MYPASSWORD}"
    }
    

    MY_CREDS_USR MY_CREDS_PSW 在任何需要引用秘密的地方使用环境变量。它们的内容将在控制台日志中屏蔽。

    sh '''
        echo "Username: ${MY_CREDS_USR}"
        echo "Password: ${MY_CREDS_PSW}"
    '''
    
        4
  •  1
  •   Pierre.Vriens Krzysztof J    6 年前

    https://github.com/jenkinsci/log-file-filter-plugin

    这个插件允许通过正则表达式过滤Jenkins的控制台输出。如果某个模式匹配,则匹配的字符串将替换为可以为配置中的每个模式指定的字符串。

    目前该插件不支持从Jenkins文件添加过滤模式,只支持从Jenkins全局设置添加过滤模式。

        5
  •  0
  •   cherusk    5 年前

    非常野蛮的解决方法。

    编写一个简单的脚本,例如bash,并将参数凭证回送到任意格式的文件中,具体到回送方法。

    $ cat executor/obfuscate.sh 
    #!/bin/bash
    
    echo "PASSWORD: ${AWX_PW}" > ./executor/credential.yml
    

    在你的管道中:

    stages {
        stage('Placing') {
            steps {
                **sh './executor/obfuscate.sh'** }
                [...]
                < something reading credential.yml>
        }
    }
    

    结果,控制台中未显示任何内容:

    enter image description here