Jenkins #
存储Secrets(Storing Secrets) #
插件通常存储用户凭证(user credentials)和类似的秘密(secrets),如API Key、Token或仅是用户名和密码,以便与其他系统和服务进行交互。存储此类Secret的插件需要小心它们的存储方式。如果使用简单的字符串字段,并将其序列化为纯文本存储到磁盘,则可能会发生以下问题:
- 在许多系统中,Jenkins主目录(Jenkins Home)的部分区域可供其他用户帐户访问,这可能导致凭证以纯文本形式存储在磁盘上,从而被检索。
- 即使排除了
secrets/
目录,Jenkins主目录的备份也可能会泄露密钥。 - 字符串字段在配置表单中以纯文本形式传回,即使该值在密码字段中被隐藏,仍然可以通过HTML页面源代码访问。这甚至适用于仅具有扩展读取权限的用户。
所有这些问题的最简单解决方案是将密码存储为Secrets。
- 解密Secrets的Key存储在保护最严的
secrets/
目录中,建议从备份中排除该目录。 - Secrets字段以加密形式传回,这样用户就无法在稍后的时间检索其纯文本形式。如果用户仅具有扩展读取权限(Extended Read permission),密钥将从输出中删除。
一种更高级的选项是与Credentials Plugin集成。有关更多信息,请参见其文档。
加密Secrets和Credentials #
Jenkins使用AES算法对Secrets、Credentials及其对应的加密密钥进行加密和保护。这些加密密钥(encryption keys)存储在$JENKINS_HOME/secrets/
目录中,与用于保护这些密钥的主密钥一起存放。该目录应配置为仅允许Jenkins
控制器运行时使用的操作系统用户具有读取和写入权限(即设置chmod
为0700
或应用适当的文件属性)。主密钥(在加密术语中也称为“密钥加密密钥”)以未加密形式存储在Jenkins控制器文件系统的$JENKINS_HOME/secrets/master.key
中,因此不能防止具有直接访问该文件权限的攻击者实施攻击。
大多数用户和开发者通常通过以下方式间接使用这些加密密钥:
使用Secret API加密通用密钥数据;
通过Credentials API管理Credentials。
对于对加密技术感兴趣的用户,Jenkins使用AES的密码分组链接(CBC)模式,并结合 PKCS#5填充和随机初始化向量(IV)来加密CryptoConfidentialKey实例。这些实例存储于
$JENKINS_HOME/secrets/
目录中,文件名对应于CryptoConfidentialKey
的 ID。常见的密钥ID包括:hudson.util.Secret
:用于通用密钥;com.cloudbees.plugins.credentials.SecretBytes.KEY
:用于某些凭证类型;jenkins.model.Jenkins.crumbSalt
:由 CSRF 保护机制使用;org.jenkinsci.main.modules.instance_identity.InstanceIdentity.KEY
:用于标识Jenkins控制器。
Jenkins备份和还原
- ThinBackup插件并不会备份
$JENKINS_HOME/secrets/
目录,即使用ThinBackup做的备份不包含$JENKINS_HOME/secrets/
- 还需要额外单独做好
$JENKINS_HOME/secrets/
的备份这样在灾难时,才能通过全新安装Jenkins+使用ThinBackup的备份+使用额外备份
$JENKINS_HOME/secrets/
,完整恢复Jenkins实例。如果没有备份的$JENKINS_HOME/secrets/
,则原来加密Secrets和Credentials的将会无法使用。
Jenkins Remoting #
Jenkins Remoting 是一个库和可执行的Java jar下载地址文件,实现了Jenkins的通信层。这包括基于TCP的通信协议、远程过程调用、类加载、数据流传输等功能。目前,Remoting主要用于Jenkins控制器(controller)与 Jenkins 代理(agent)之间的通信。
Remoting子项目包括Remoting库本身、agent的相关包,以及许多特定于Remoting的插件和核心模块。
- remoting jar下载地址: https://repo.jenkins-ci.org/artifactory/public/org/jenkins-ci/main/remoting/
- 或从
http://<jennkin-ip>:<jenkins-port>/jnlpJars/agent.jar
下载