jenkins credentials笔记

简述

Jenkins 是一个开源的、提供友好操作界面的持续集成(CI)工具,起源于 Hudson(Hudson是商用的),主要用于持续、自动的构建/测试软件项目、监控外部任务的运行(这个比较抽象,暂且写上,不做解释)。Jenkins 用 Java 语言编写,可在 Tomcat 等流行的 servlet 容器中运行,也可独立运行。通常与版本管理工具(SCM)、构建工具结合使用。常用的版本控制工具有 SVN、GIT,构建工具有 Maven、Ant、Gradle。

凭证(cridential)是 Jenkins 进行受限操作时的凭据。比如使用SSH登录远程机器时,用户名和密码或 SSH key 就是凭证。而这些凭证不可能以明文写在 Jenkinsfile 中。Jenkins 凭证管理指的就是对这些凭证进行管理。

为了最大限度地提高安全性,在 Jenkins master 节点上对凭证进行加密存储(通过 Jenkins 实例 ID 加密),只有通过它们的凭证 ID 才能在 pipeline 中使用,并且限制了将证书从一个 Jenkins 实例复制到另一个 Jenkins 实例的能力。

也因为所有的凭证都被存储在 Jenkins master 上,所以在 Jenkins master 上最好不要执行任务,以免被 pipeline 非法读取出来,应该分配到 Jenkins agent 上执行 pipeline。

Jenkins 凭证

目前 Jenkins 支持如下类型的凭证:

  • Username with password
  • GitHub App
  • SSH Username with private key
  • Secret file
  • Secret text
  • X.509 Client Certificate
  • Certificate

其中 Username with password 和 SSH Username with private key 是应用最广泛的。

Secret text 是一串需要保密的文本,比如 Github 的 token。

Username with password 指用户和密码凭证。

Secret file 指需要保密的文本文件。使用 Secret file 时,Jenkins 会将文件复制到一个临时目录中,再将文件路径设置到一个变量中。构建结束后,所复制的 Secret file 会被删除。

SSH Username with private key 指一对SSH用户名和密钥。

Jenkins 的凭据信息(类似 git 账号密码、用户账号密码、tomcat 账号密码)以及服务器的密钥账号密码等信息 ,在 Jenkins 服务器的本地都是有存储的,并且都进行了加密。

Jenkins的相关凭据信息存储在 ${JENKINS_HOME}/credentials.xml 文件中,其中类似下面的就是密码密文:

1
{AQAAABAAAAAgQI+cpXwSulM5zcFv14L5eODWtRDiP1HBCY/zg8H3kTDE4swuJ+j5DiVg251XDjq+}

Jenkins 凭证破解

普通破解

Jenkins 的密码是使用 hudson.util.Secret.fromString("明文密码").getEncryptedValue() 加密的,而解密的话就需要使用 hudson.util.Secret.fromString("{XXX=}").getPlainText() 进行解密。

用 Jenkins 的管理员账号登录,在系统管理列表中找到 Script Console 这个选项,然后

1
println(hudson.util.Secret.fromString("{AQAAABAAAAAgQI+cpXwSulM5zcFv14L5eODWtRDiP1HBCY/zg8H3kTDE4swuJ+j5DiVg251XDjq+}").getPlainText())

或者

1
println(hudson.util.Secret.decrypt("{AQAAABAAAAAgQI+cpXwSulM5zcFv14L5eODWtRDiP1HBCY/zg8H3kTDE4swuJ+j5DiVg251XDjq+}"))

点击运行按钮,解密后的明文密码就会打印出来。

Jenkins publish over SSH 破解

如果使用了 Jenkins publish over SSH,则相关的密码记录 ${JENKINS_HOME}/jenkins.plugins.publish_over_ssh.BapSshPublisherPlugin.xml 内。

我们可以使用开源项目 https://github.com/rabbitmask/Jenkins_Credentials_Crack 进行凭证破解。

Jenkins credentials 解密和转储

使用项目 https://github.com/hoto/jenkins-credentials-decryptor 可以完成对 Jenkins 凭证的解密。

我们需要知道Jenkins 将加密的凭据存储在credentials.xml文件中或config.xml文件夹下。要解密它们,您需要master.keyhudson.util.Secret文件。

所有文件都位于 Jenkins 主目录中:

1
2
3
4
$JENKINS_HOME/credentials.xml 
$JENKINS_HOME/secrets/master.key
$JENKINS_HOME/secrets/hudson.util.Secret
$JENKINS_HOME/jobs/example-folder/config.xml

我们需要从 release 中下载二进制构建(需要注意的是,暂时只支持 Linux)

之后使用指令:

1
2
3
4
5
./jenkins-credentials-decryptor \
-m $JENKINS_HOME/secrets/master.key \
-s $JENKINS_HOME/secrets/hudson.util.Secret \
-c $JENKINS_HOME/credentials.xml \
-o json

即可将凭证以 json 形式输出在标准输出中。

-o 属性是可选的,默认为 json,可以指定为 text 模式。