如何从凭据.xml解密詹金斯密码?


37

我已经接手了这个项目,在该项目中,很多Jenkins凭证都包含我需要知道的密码或密码字符串,以便继续进行该项目,但是不幸的是,这些文件并未在任何地方进行记录。

我检查了credentials.xml存储这些凭据的文件,但它们不是纯文本格式,例如:

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

注意:出于隐私原因,我已对其进行了少许更改。

如何根据上述字符串解密其原始密码?


建议的答案出现错误:println(hudson.util.Secret.decrypt(“ {{xxx / wwww + yyyy / zzzz =}}”))+符号破坏了脚本。有什么建议吗?
周杰伦

@JayBau尝试使用单括号:"{...}",再去除一次。
kenorb

Answers:


46

幸运的是,有一个hudson.util.Secret.decrypt()可以用于此的函数,因此:

  1. 在詹金斯中,转到:/script页面。
  2. 运行以下命令:

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

    要么:

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

    {XXX=}您的加密密码在哪里。这将打印普通密码。

    相反,运行:

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

资料来源:要点tuxfight3r/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,

非常感谢:-)
jmary

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))
  }
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.