credentials.xmlからJenkinsのパスワードを復号化する方法は?


37

多くのJenkins資格情報にパスワードまたはパスフレーズ文字列が含まれているプロジェクトを引き継ぎました。これらはプロジェクトを進めるために知っておく必要がありますが、残念ながらこれらはどこにも文書化されていません。

credentials.xmlこれらの資格情報が保存されているファイルを確認しましたが、プレーンテキストではありません。例:

<passphrase>{AAAAAAAAAAAANzxft/rDzyt8mhxpn3O72dxvVqZksL5vBJ4jNKvAjAA=}</passphrase>

注:プライバシー上の理由から、少し変更しました。

上記の文字列に基づいて元のパスワードを復号化するにはどうすればよいですか?


提案された回答でエラーが発生しています:println(hudson.util.Secret.decrypt( "{{xxx / wwww + yyyy / zzzz =}}"))+記号はスクリプトを破壊しています。なにか提案を?
ジェイバウ

@JayBau単一の括弧で試してください:"{...}"、余分なものを1回削除します。
ケノーブ

回答:


46

幸いなことに、hudson.util.Secret.decrypt()これに使用できる関数があります。

  1. Jenkinsで、次の/scriptページに移動します。
  2. 次のコマンドを実行します。

    println(hudson.util.Secret.decrypt("{XXX=}"))
    

    または:

    println(hudson.util.Secret.fromString("{XXX=}").getPlainText())
    

    {XXX=}暗号化されたパスワードはどこですか。これにより、プレーンパスワードが出力されます。

    逆に実行するには、次を実行します。

    println(hudson.util.Secret.fromString("some_text").getEncryptedValue())
    

出典:gist attuxfight3r/jenkins-decrypt.groovy


代わりに次のスクリプトを確認してください:tweksteen/jenkins-decryptmenski/jenkins-decrypt.py


詳細については、Jenkinsでの資格情報ストレージを確認してください。


7

以下は、jenkinsスクリプトコンソールから実行して、すべての認証情報をプレーンテキストにダンプできる短いスニペットです。

com.cloudbees.plugins.credentials.SystemCredentialsProvider.getInstance().getCredentials().forEach{
  it.properties.each { prop, val ->
    println(prop + ' = "' + val + '"')
  }
  println("-----------------------")
}

非システムクレデンシャルプロバイダー用にリストされているより複雑なバージョン:

import com.cloudbees.plugins.credentials.CredentialsProvider
import com.cloudbees.plugins.credentials.Credentials
import com.cloudbees.plugins.credentials.domains.Domain
import jenkins.model.Jenkins
def indent = { String text, int indentationCount ->
  def replacement = "\t" * indentationCount
  text.replaceAll("(?m)^", replacement)
}

Jenkins.get().allItems().collectMany{ CredentialsProvider.lookupStores(it).toList()}.unique().forEach { store ->
  Map<Domain, List<Credentials>> domainCreds = [:]
  store.domains.each { domainCreds.put(it, store.getCredentials(it))}
  if (domainCreds.collectMany{ it.value}.empty) {
    return
  }
  def shortenedClassName = store.getClass().name.substring(store.getClass().name.lastIndexOf(".") + 1)
  println "Credentials for store context: ${store.contextDisplayName}, of type $shortenedClassName"
  domainCreds.forEach { domain , creds ->
    println indent("Domain: ${domain.name}", 1)
    creds.each { cred ->
      cred.properties.each { prop, val ->
        println indent("$prop = \"$val\"", 2)
      }
      println indent("-----------------------", 2)
    }
  }
}

これを変更して、すべてのドメイン、すべてのフォルダーから資格情報を取得する方法は?
jmary

@jmary別の例を追加しました
Magnus


1

記録のために、コンソールに貼り付けられる次のスニペットも仕事をします:

def creds = com.cloudbees.plugins.credentials.CredentialsProvider.lookupCredentials(
    com.cloudbees.plugins.credentials.common.StandardUsernameCredentials.class,
    Jenkins.instance,
    null,
    null
)

for(c in creds) {
  if(c instanceof com.cloudbees.jenkins.plugins.sshcredentials.impl.BasicSSHUserPrivateKey){
    println(String.format("id=%s  desc=%s key=%s\n", c.id, c.description, c.privateKeySource.getPrivateKeys()))
  }
  if (c instanceof com.cloudbees.plugins.credentials.impl.UsernamePasswordCredentialsImpl){
    println(String.format("id=%s  desc=%s user=%s pass=%s\n", c.id, c.description, c.username, c.password))
  }
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.