Bagaimana cara mendekripsi kata sandi Jenkins dari credentials.xml?

37

Saya telah mengambil alih proyek di mana banyak kredensial Jenkins memiliki kata sandi atau string frasa sandi yang perlu saya ketahui untuk dapat melanjutkan proyek, sayangnya ini tidak didokumentasikan di mana pun.

Saya telah memeriksa credentials.xmlfile tempat kredensial ini disimpan, tetapi tidak dalam teks biasa, misalnya:

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

Catatan: Saya telah sedikit mengubahnya karena alasan privasi.

Bagaimana saya bisa mendekripsi kata sandi aslinya berdasarkan string di atas?

kenorb
sumber
Saya mendapatkan kesalahan dengan jawaban yang diajukan: println (hudson.util.Secret.decrypt ("{{xxx / wwww + yyyy / zzzz =}}")) Simbol + melanggar skrip. Ada saran?
Jay Bau
@JayBau Coba dengan kurung tunggal:, "{...}"hapus ekstra satu kali.
kenorb

Jawaban:

46

Untungnya ada hudson.util.Secret.decrypt()fungsi yang bisa digunakan untuk ini, jadi:

  1. Di Jenkins, buka: /scripthalaman.
  2. Jalankan perintah berikut:

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

    atau:

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

    di mana {XXX=}kata sandi terenkripsi Anda Ini akan mencetak kata sandi biasa.

    Untuk melakukan yang sebaliknya, jalankan:

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

Sumber: intisari dituxfight3r/jenkins-decrypt.groovy .


Atau periksa skrip berikut: tweksteen/jenkins-decrypt, menski/jenkins-decrypt.py.


Untuk detail lebih lanjut, periksa: Penyimpanan kredensial di Jenkins .

kenorb
sumber
7

Berikut ini cuplikan singkat yang bisa Anda jalankan dari konsol skrip jenkins, untuk membuang semua kredensial Anda ke teks biasa.

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

Versi yang lebih rumit yang mendaftar untuk penyedia kredensial non-sistem:

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)
    }
  }
}
Magnus
sumber
Bagaimana cara memodifikasi ini untuk mendapatkan kredensial dari semua domain, dari semua folder?
jmary
@jmary Saya telah menambahkan contoh lain
Magnus
Terima kasih banyak :-)
jmary
1

Sebagai catatan, cuplikan berikut yang akan ditempelkan ke konsol juga berfungsi:

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