Як розшифрувати паролі Дженкінса з облікових даних.xml?


37

Я взяв участь у проекті, де велика кількість облікових даних Дженкінса містить паролі або рядки парольної фрази, які мені потрібно знати, щоб просунутися в проекті, на жаль, вони ніде не були задокументовані.

Я перевірив credentials.xmlфайл, де зберігаються ці облікові дані, але вони не в простому тексті, наприклад:

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

Примітка. Я трохи змінив це з міркувань конфіденційності.

Як я можу розшифрувати свій початковий пароль на основі рядка, наведеного вище?


Я отримую помилку із запропонованою відповіддю: println (hudson.util.Secret.decrypt ("{{xxx / wwww + yyyy / zzzz =}}")) Символ + порушує сценарій. Будь-яка пропозиція?
Джей Бау

@JayBau Спробуйте з одними дужками: "{...}"видаліть зайві один раз.
kenorb

Відповіді:


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

Джерело: gist attuxfight3r/jenkins-decrypt.groovy .


Як варіант, перевірте такі сценарії: tweksteen/jenkins-decrypt, menski/jenkins-decrypt.py.


Для отримання більш детальної інформації перевірте: Зберігання облікових даних у Дженкінсі .


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 Я додав ще один приклад
Магнус

Велике спасибі :-)
резюме

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))
  }
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.