credentials.xml에서 Jenkins 비밀번호를 해독하는 방법은 무엇입니까?


37

많은 Jenkins 자격 증명에 프로젝트를 진행하기 위해 알아야 할 암호 또는 암호 문자열이있는 프로젝트를 인수했지만 불행히도 이러한 문서는 어디에도 문서화되어 있지 않습니다.

credentials.xml이러한 자격 증명이 저장된 파일을 확인 했지만 일반 텍스트가 아닙니다. 예 :

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

참고 : 개인 정보 보호를 위해 약간 변경했습니다.

위의 문자열을 기반으로 원래 비밀번호를 해독하려면 어떻게해야합니까?


제안 된 답변에 오류가 있습니다. println (hudson.util.Secret.decrypt ( "{{xxx / wwww + yyyy / zzzz =}}")) + 기호가 스크립트를 손상시킵니다. 어떠한 제안?
Jay Bau

@JayBau 단일 괄호로 시도하십시오 : "{...}", 추가로 한 번 제거하십시오.
kenorb

답변:


46

다행히도 hudson.util.Secret.decrypt()사용할 수 있는 기능이 있습니다.

  1. Jenkins에서 /script페이지 로 이동 하십시오.
  2. 다음 명령을 실행하십시오.

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

    또는:

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

    {XXX=}암호화 된 비밀번호는 어디에 있습니까 ? 일반 비밀번호가 인쇄됩니다.

    반대로하려면 다음을 실행하십시오.

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

출처 : 요점tuxfight3r/jenkins-decrypt.groovy .


또는 다음 스크립트를 확인하십시오. tweksteen/jenkins-decrypt, menski/jenkins-decrypt.py.


자세한 내용 은 Jenkins의 자격 증명 저장소를 확인하십시오 .


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 다른 예를 추가했습니다
Magnus

감사합니다 :-)
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))
  }
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.