跳转到内容
主菜单
主菜单
移至侧栏
隐藏
导航
首页
最近更改
随机页面
MediaWiki帮助
代码酷
搜索
搜索
中文(中国大陆)
外观
创建账号
登录
个人工具
创建账号
登录
未登录编辑者的页面
了解详情
贡献
讨论
编辑“︁
Jenkins凭证加密
”︁
页面
讨论
大陆简体
阅读
编辑
编辑源代码
查看历史
工具
工具
移至侧栏
隐藏
操作
阅读
编辑
编辑源代码
查看历史
常规
链入页面
相关更改
特殊页面
页面信息
外观
移至侧栏
隐藏
您的更改会在有权核准的用户核准后向读者展示。
警告:
您没有登录。如果您进行任何编辑,您的IP地址会公开展示。如果您
登录
或
创建账号
,您的编辑会以您的用户名署名,此外还有其他益处。
反垃圾检查。
不要
加入这个!
= Jenkins凭证加密 = '''Jenkins凭证加密'''是Jenkins安全管理中的核心机制,用于保护敏感信息(如密码、API密钥、SSH私钥等)不被明文存储或泄露。通过加密存储和安全的访问控制,确保只有授权用户和作业能够使用这些凭证。 == 概述 == Jenkins使用基于Java加密架构(JCA)的对称加密系统来保护凭证。凭证在保存到磁盘前会被加密,并在需要时由Jenkins主节点解密。加密密钥存储在<code>$JENKINS_HOME/secrets/</code>目录下,默认情况下仅对系统管理员可见。 === 加密流程 === <mermaid> graph LR A[明文凭证] --> B[Jenkins加密引擎] B --> C[密文存储到磁盘] C --> D[授权访问请求] D --> E[解密为明文] E --> F[使用凭证] </mermaid> == 加密机制详解 == === 密钥管理 === Jenkins使用以下两种密钥: * '''主密钥(master.key)''':用于加密其他密钥的根密钥 * '''Hudson密钥(hudson.util.Secret)''':实际用于加密凭证的密钥 密钥生成公式(简化): <math> SecretKey = PBKDF2WithHmacSHA256(password, salt, iterations) </math> === 凭证存储位置 === 加密后的凭证存储在: * <code>$JENKINS_HOME/credentials.xml</code>(全局凭证) * 作业配置XML文件中(作业级凭证) == 代码示例 == === 查看加密密钥 === <syntaxhighlight lang="bash"> # 查看Jenkins密钥文件结构 ls -l $JENKINS_HOME/secrets/ </syntaxhighlight> 输出示例: <pre> -rw------- 1 jenkins jenkins 16 May 1 10:00 master.key -rw------- 1 jenkins jenkins 256 May 1 10:00 hudson.util.Secret -rw------- 1 jenkins jenkins 4096 May 1 10:00 filepath-filters.d </pre> === 通过API访问加密凭证 === <syntaxhighlight lang="groovy"> // Groovy脚本示例:获取加密的Git凭据 import jenkins.model.* import com.cloudbees.plugins.credentials.* def creds = Jenkins.instance.getExtensionList( 'com.cloudbees.plugins.credentials.SystemCredentialsProvider' )[0].getCredentials() creds.each { c -> if(c instanceof StandardUsernamePasswordCredentials) { println "ID: ${c.id}" println "Description: ${c.description}" // 实际使用时密码会被安全地处理 println "Username: ${c.username}" } } </syntaxhighlight> == 安全最佳实践 == 1. '''定期轮换密钥''':通过<code>$JENKINS_HOME/secrets/rotate-master-key</code>文件触发主密钥轮换 2. '''限制访问权限''': * 设置<code>secrets/</code>目录权限为700 * 使用Jenkins的凭证ACL系统控制访问 3. '''避免硬编码''':不在流水线脚本中直接写入敏感信息 4. '''使用凭证插件''':推荐使用Credentials Binding插件安全地传递凭证 == 实际案例 == === 场景:保护数据库连接信息 === 1. 在Jenkins中添加一个"Secret Text"类型凭证存储数据库密码 2. 在流水线中使用凭证: <syntaxhighlight lang="groovy"> pipeline { agent any environment { DB_PASSWORD = credentials('prod-db-password') } stages { stage('Deploy') { steps { sh 'echo "Connecting to database..."' // 密码会自动注入且不会显示在日志中 sh 'some-db-tool connect --password $DB_PASSWORD' } } } } </syntaxhighlight> === 故障排除 === {| class="wikitable" |- ! 问题 !! 解决方案 |- | 加密密钥损坏 || 从备份恢复<code>secrets/</code>目录 |- | 凭证无法解密 || 检查<code>hudson.util.Secret</code>文件权限(600) |- | 主节点迁移问题 || 确保复制所有密钥文件并保持相同权限 |} == 高级主题 == === 自定义加密实现 === 通过实现<code>hudson.util.Secret</code>类可以扩展加密方式: <syntaxhighlight lang="java"> public class CustomSecret extends hudson.util.Secret { @Override protected String encrypt(String plainText) { // 自定义加密逻辑 } @Override protected String decrypt(String encryptedText) { // 自定义解密逻辑 } } </syntaxhighlight> === 加密性能考量 === Jenkins使用AES-128加密算法,在典型硬件上的性能表现: {| class="wikitable" |- ! 操作 !! 平均耗时(ms) |- | 加密单个凭证 || 0.5-2 |- | 解密单个凭证 || 0.3-1.5 |- | 批量加密(100个) || 20-50 |} == 参见 == * [[Jenkins安全配置]] * [[Jenkins凭证管理]] * [[Jenkins流水线安全最佳实践]] [[Category:集成部署]] [[Category:Jenkins]] [[Category:Jenkins安全]]
摘要:
请注意,所有对代码酷的贡献均被视为依照知识共享署名-非商业性使用-相同方式共享发表(详情请见
代码酷:著作权
)。如果您不希望您的文字作品被随意编辑和分发传播,请不要在此提交。
您同时也向我们承诺,您提交的内容为您自己所创作,或是复制自公共领域或类似自由来源。
未经许可,请勿提交受著作权保护的作品!
取消
编辑帮助
(在新窗口中打开)