Wie kann man Jenkins Passwörter aus credentials.xml entschlüsseln?


37

Ich habe das Projekt übernommen, in dem viele Jenkins-Anmeldeinformationen Passwörter oder Passphrasen enthalten, die ich wissen muss, um mit dem Projekt fortzufahren. Leider wurden diese Angaben nirgendwo dokumentiert.

Ich habe die credentials.xmlDatei überprüft, in der diese Anmeldeinformationen gespeichert sind, sie sind jedoch kein reiner Text, z. B .:

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

Hinweis: Ich habe es aus Datenschutzgründen leicht geändert.

Wie kann ich das ursprüngliche Passwort anhand der obigen Zeichenfolge entschlüsseln?


Ich erhalte eine Fehlermeldung mit der vorgeschlagenen Antwort: println (hudson.util.Secret.decrypt ("{{xxx / wwww + yyyy / zzzz =}}")) Das Symbol + bricht das Skript. Irgendein Vorschlag?
Jay Bau

@JayBau Versuch mit einzelnen Klammern: "{...}"einmal extra entfernen.
Kenorb

Antworten:


46

Zum Glück gibt es eine hudson.util.Secret.decrypt()Funktion, die dafür verwendet werden kann, also:

  1. Gehen Sie in Jenkins zu: /scriptSeite.
  2. Führen Sie den folgenden Befehl aus:

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

    oder:

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

    Wo {XXX=}ist dein verschlüsseltes Passwort? Dadurch wird das einfache Kennwort gedruckt.

    Um das Gegenteil zu tun, führen Sie Folgendes aus:

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

Quelle: gist attuxfight3r/jenkins-decrypt.groovy .


Überprüfen Sie alternativ die folgenden Skripte: tweksteen/jenkins-decrypt, menski/jenkins-decrypt.py.


Weitere Informationen finden Sie unter: Speicherung von Anmeldeinformationen in Jenkins .


7

Hier ist ein kurzer Ausschnitt, den Sie einfach über die Jenkins-Skriptkonsole ausführen können, um alle Ihre Anmeldeinformationen in Klartext zu speichern.

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

Eine kompliziertere Version, die für Nicht-Systemanmeldeinformationsanbieter aufgelistet wird:

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

Wie kann ich dies ändern, um Anmeldeinformationen aus allen Domänen und Ordnern abzurufen?
14.

@JMary Ich habe ein weiteres Beispiel hinzugefügt
Magnus


1

Für den Datensatz übernimmt das folgende Snippet, das in die Konsole eingefügt werden soll, auch die Aufgabe:

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))
  }
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.