Como descriptografar senhas Jenkins de credentials.xml?


37

Eu assumi o projeto em que muitas credenciais do Jenkins têm senhas ou sequências de senhas que eu preciso saber para avançar no projeto, infelizmente elas não foram documentadas em nenhum lugar.

Eu verifiquei o credentials.xmlarquivo em que essas credenciais estão armazenadas, mas elas não estão em texto simples, por exemplo:

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

Nota: eu mudei um pouco por motivos de privacidade.

Como posso descriptografar sua senha original com base na string acima?


Estou recebendo erro com a resposta proposta: println (hudson.util.Secret.decrypt ("{{xxx / wwww + aaaa / zzzz =}}")) O símbolo + está quebrando o script. Alguma sugestão?
Jay Bau

@JayBau Tente com colchetes simples: "{...}"remova mais uma vez.
kenorb 17/06

Respostas:


46

Felizmente, existe uma hudson.util.Secret.decrypt()função que pode ser usada para isso, então:

  1. Em Jenkins, vá para: /scriptpágina.
  2. Execute o seguinte comando:

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

    ou:

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

    onde {XXX=}está sua senha criptografada. Isso imprimirá a senha simples.

    Para fazer o oposto, execute:

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

Fonte: gist attuxfight3r/jenkins-decrypt.groovy .


Como alternativa, verifique os seguintes scripts: tweksteen/jenkins-decrypt, menski/jenkins-decrypt.py.


Para mais detalhes, consulte: Armazenamento de credenciais no Jenkins .


7

Aqui está um pequeno trecho que você pode executar no console de scripts jenkins, para despejar todas as suas credenciais em texto sem formatação.

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

Uma versão mais complicada que lista fornecedores de credenciais que não são do 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)
    }
  }
}

Como modificar isso para obter credenciais de todos os domínios, de todas as pastas?
jmary 14/08

@jmary Adicionei outro exemplo
Magnus


1

Para o registro, o seguinte snippet a ser colado no console também faz o trabalho:

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))
  }
}
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.