【问题标题】:Hiding passwords in Jenkins Pipeline log output without using WithCredentials在不使用 WithCredentials 的情况下在 Jenkins Pipeline 日志输出中隐藏密码
【发布时间】:2018-09-28 08:23:09
【问题描述】:

我有一个基于 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...的内容在日志输出中显示纯文本。

我在 2.12.0 版本的 Jenkins 上安装了 Mask Password plugin

基本上我正在寻找类似这样的东西:https://issues.jenkins-ci.org/browse/JENKINS-27486 - 票证已解决,但没有给出最终实现的示例 sn-p。

【问题讨论】:

    标签: jenkins jenkins-pipeline credentials


    【解决方案1】:

    实际上我不知道为什么这首先不起作用,但这是解决问题的方法。

    用你想隐藏的秘密定义一个数组,如下所示:

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

    免责声明:我不知道SECRET值是否有重要作用,从一些sn-p复制并粘贴它,它可以按预期工作:)

    之后,您可以像这样在 脚本化管道 中封装任何调用:

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

    getSecrets() 数组中提供的所有密码将在您的构建输出中像这样被屏蔽:

    SPLUNK_PASSWORD: ********
    BASIC_AUTH_ADMIN_PASSWORD: ********
    

    【讨论】:

      【解决方案2】:

      我想你在找JENKINS-36007

      【讨论】:

      • 感谢您的链接!所以基本上意味着:我正在寻找的东西尚未(尚未)实施?
      【解决方案3】:

      2020 年 5 月 26 日更新

      以下解决方法最近对我不起作用。我的猜测是在最近的 Jenkins 更新中发生了一些变化。我试图避免安装另一个插件,但我最终放弃并安装了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() 辅助方法填充环境变量,然后覆盖自动定义的两个附加环境变量(并在日志中屏蔽)。

      首先,创建一个虚拟的Username with password 凭据。 UsernamePassword 值无关紧要,我们只需要一个凭据来用作占位符。输入一个 ID,例如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}"
      '''
      

      【讨论】:

      • 这是否有效?我一直在应用这个,到目前为止还没有成功。它无法覆盖默认值。
      • @harshavmb 当我发布它时它工作了,但它在某个时候停止了对我的工作。在我的情况下,参数会覆盖环境变量,但由于某种原因,它们不再在日志中被屏蔽。我已经使用 Mask Passwords 插件更新了答案。
      • 非常感谢。这让我松了一口气。您的最新解决方案运行良好..
      【解决方案4】:

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

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

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

      【讨论】:

      • 这个插件允许通过正则表达式过滤 Jenkins 的控制台输出。如果某些模式匹配,则匹配的字符串将替换为可以为配置中的每个模式指定的字符串。
      • Hm - 需要在 Jenkinsfile 中设置它,因为它只知道管道的“运行时”......此外,如果我指定一个带有秘密凭证的正则表达式,那将毫无用处在里面,因为每个 Jenkkns 管理员都可以阅读它......
      【解决方案5】:

      非常粗暴的解决方法。

      编写一个简单的脚本,例如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>
          }
      }
      

      结果,控制台没有任何显示:

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-06-29
        • 2018-05-27
        • 2018-05-08
        • 1970-01-01
        • 2017-04-02
        • 1970-01-01
        相关资源
        最近更新 更多