在不使用WithCredentials的情况下在Jenkins Pipeline日志输出中隐藏密码

时间:2018-09-28 08:23:09

标签: jenkins jenkins-pipeline credentials

我有一个基于Jenkinsfile的参数化Jenkins管道。一些参数包含敏感的密码,我不想出现在作业的构建日志中。

所以我的问题是:我可以在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...
    }
}

其中firstPasswordsecondPasswordthirdPassword是包含我的密码的变量。但是我仍然得到firstPassword ...的内容...在日志输出中显示为纯文本。

我在Jenkins上安装了Mask Password plugin,版本为2.12.0。

基本上,我正在搜索以下内容:https://issues.jenkins-ci.org/browse/JENKINS-27486-票证已解决,但未提供最终实现的示例摘录。

5 个答案:

答案 0 :(得分:1)

我认为您正在寻找JENKINS-36007

答案 1 :(得分:1)

您可以看看https://github.com/jenkinsci/log-file-filter-plugin

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

当前,该插件不支持从jenkins文件添加过滤器模式,而仅支持从Jenkins全局设置添加过滤器模式。

答案 2 :(得分:1)

实际上我不知道为什么这首先没有奏效,但这是解决问题的方法。

使用要隐藏的秘密定义数组,如下所示:

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 :(得分:0)

高度残酷的解决方法。

编写一个简单的脚本,例如bash,然后将参数凭据回显到任意格式的文件中,直到您的回显方法为止。

例如基本的shell脚本:

$ 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

答案 4 :(得分:0)

我发现了一种变通办法,虽然有点破解,但似乎效果很好。诀窍是使用withCredentials,但使用参数覆盖变量。

下面是一个示例,该示例使用environment指令的credentials()帮助方法填充环境变量,然后覆盖自动定义(并在日志中屏蔽)的两个其他环境变量。

首先,创建一个虚拟Username with password凭据。 UsernamePassword的值无关紧要,我们只需要一个凭据即可用作占位符。输入ID,例如dummy-credentials

dummy credentials

然后使用虚拟凭据定义一个环境变量,并使用参数(在此示例中为MYUSERNAMEMYPASSWORD)覆盖自动定义的变量:

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

在需要引用机密信息的地方使用MY_CREDS_USRMY_CREDS_PSW环境变量。它们的内容将在控制台日志中被屏蔽。

sh '''
    echo "Username: ${MY_CREDS_USR}"
    echo "Password: ${MY_CREDS_PSW}"
'''

jenkins log