Come decifrare le password di Jenkins da credentials.xml?


37

Ho assunto il progetto in cui molte credenziali di Jenkins hanno password o stringhe di passphrase che devo conoscere per poter proseguire con il progetto, purtroppo non sono state documentate da nessuna parte.

Ho controllato il credentials.xmlfile in cui sono archiviate queste credenziali, ma non sono in testo semplice, ad esempio:

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

Nota: l'ho leggermente modificato per motivi di privacy.

Come posso decrittografare la sua password originale in base alla stringa sopra?


Ricevo un errore con la risposta proposta: println (hudson.util.Secret.decrypt ("{{xxx / wwww + yyyy / zzzz =}}")) Il simbolo + sta interrompendo lo script. Qualche suggerimento?
Jay Bau,

@JayBau Prova con parentesi singole:, "{...}"rimuovi una volta di più.
Kenorb,

Risposte:


46

Fortunatamente esiste una hudson.util.Secret.decrypt()funzione che può essere utilizzata per questo, quindi:

  1. In Jenkins, vai a: /scriptpagina.
  2. Esegui il seguente comando:

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

    o:

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

    dov'è la {XXX=}tua password crittografata. Questo stamperà la password semplice.

    Per fare l'opposto, esegui:

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

Fonte: gist attuxfight3r/jenkins-decrypt.groovy .


In alternativa, controllare i seguenti script: tweksteen/jenkins-decrypt, menski/jenkins-decrypt.py.


Per ulteriori dettagli, controllare: Archivio credenziali in Jenkins .


7

Ecco un breve frammento che puoi semplicemente eseguire dalla console di script jenkins, per scaricare tutte le tue credenziali in testo semplice.

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

Una versione più complicata che elenca i provider di credenziali non di sistema:

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)
    }
  }
}

Come modificarlo per ottenere credenziali da tutti i domini, da tutte le cartelle?
jmary

@jmary Ho aggiunto un altro esempio
Magnus il

Grazie
mille

1

Per la cronaca, anche il seguente frammento da incollare nella console fa il lavoro:

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))
  }
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.