web-dev-qa-db-ja.com

WithCredentialsを使用せずにJenkinsパイプラインログ出力でパスワードを非表示にする

Jenkinsfileに基づいてパラメーター化されたJenkinsパイプラインがあります。一部のパラメーターには、ジョブのビルドログに表示したくない機密性の高いパスワードが含まれています。

だから私の質問は:どういうわけかJenkinsfile内に文字列を登録してそれを置き換えることができますか-たとえば**********-ログ出力に表示されるときはいつでも?

withCredentialsステップを認識していますが、資格情報がJenkins資格情報ストアに保存されていないため(実行時にパラメーターとして提供されているため)、使用できません。

私はここでこの答えを見つけました https://stackoverflow.com/a/42372859/154995 そしてこのようにそれを試しました:

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にインストールしています。

基本的に私は次のようなものを探しています: https://issues.jenkins-ci.org/browse/JENKINS-27486 -チケットは解決されましたが、最終的な実装のサンプルスニペットは提供されていません。

5
Michael Lihs

あなたが探していると思います JENKINS-36007

1
Jesse Glick

あなたは見ているかもしれません https://github.com/jenkinsci/log-file-filter-plugin

このプラグインを使用すると、正規表現を使用してJenkinsのコンソール出力をフィルタリングできます。一部のパターンが一致する場合、一致した文字列は、構成内の各パターンに指定できる文字列に置き換えられます。

現在、プラグインはjenkinsfileからのフィルターパターンの追加をサポートしていませんが、Jenkinsグローバル設定からのみサポートしています。

1
Sascha Retter

そもそもなぜこれがうまくいかなかったのかはわかりませんが、ここに問題の解決策があります。

次のように、非表示にするシークレットを使用して配列を定義します。

_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: ********
_
1
Michael Lihs

非常に野蛮な回避策。

簡単なスクリプトを作成します。例: 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

0
cherusk

ちょっとしたハックの回避策を発見しましたが、うまく機能しているようです。秘訣はwithCredentialsを使用することですが、変数をパラメーターでオーバーライドします。

environment ディレクティブのcredentials()ヘルパーメソッドを使用して環境変数を設定し、自動的に定義される(そしてログでマスクされる)2つの追加の環境変数をオーバーライドする例を次に示します。

まず、ダミーのUsername with password資格情報を作成します。 UsernamePasswordの値は関係ありません。プレースホルダーとして使用するには、資格情報が必要です。 dummy-credentialsなどの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}"
'''

jenkins log

0
Jason Day