保护您的 Jenkins 服务器:基本最佳实践
通过最小权限访问、HTTPS、插件卫生、安全管道、凭据控制和监控来强化Jenkins。
保护您的Jenkins服务器:基本最佳实践
保护您的Jenkins服务器至关重要,因为它可以访问您的源代码、部署目标、凭据和构建工件。如果Jenkins暴露或配置松散,攻击者可能能够读取仓库、篡改构建、窃取机密或利用构建代理进入您的网络。
最安全的Jenkins设置采用多层防护:强身份验证、最小权限、加密访问、谨慎的插件管理、安全的管道模式以及有用的审计日志。在将Jenkins暴露给更大的团队或连接到生产系统之前,请先实施以下控制措施。
用户管理和访问控制
强大的用户管理是第一道防线。Jenkins允许对用户可以看到和操作的内容进行细粒度控制。实施最小权限原则可确保用户和服务仅拥有执行任务所需的权限,从而最大限度地减少受损账户可能造成的损害。
身份验证
Jenkins可以集成多种身份验证系统。对于团队环境,请使用集中式身份验证,而不是仅依赖Jenkins的内部用户数据库。
- LDAP或Active Directory集成: 使用您现有的目录组和账户生命周期控制。
- SAML或OpenID Connect: 当您的Jenkins插件集支持时,通过您的身份提供商使用单点登录。
- 本地账户: 保留一个经过仔细保护的管理员紧急账户,但不要将共享的本地账户作为您的正常访问模式。
授权策略
用户通过身份验证后,授权决定其访问级别。
- 基于矩阵的安全: 这种内置策略允许您向用户或组分配权限。它适用于小型设置,但随着团队壮大,可能难以审计。
- 基于角色的策略: 基于角色的授权策略插件允许您定义角色,例如
开发者、操作员和管理员,然后将用户或组映射到这些角色。
示例:设置基于角色的授权
- 从Jenkins插件管理器安装基于角色的授权策略插件。
- 转到
管理Jenkins>安全。 - 在
授权下,选择基于角色的策略。 - 定义角色,例如
developer、release-manager和jenkins-admin。 - 仅授予每个角色所需的权限,例如
作业/读取、作业/构建或凭据/查看。 - 尽可能将目录组分配给角色,而不是个人。
保护Jenkins通信
确保进出Jenkins服务器的数据加密至关重要,尤其是在处理凭据和敏感构建信息时。
HTTPS配置
配置Jenkins使用HTTPS来加密客户端和服务器之间的所有通信。这可以防止窃听和中间人攻击。
最常见的生产模式是将Jenkins放在反向代理后面,例如Nginx、Apache、HAProxy或云负载均衡器。在代理处终止TLS,将HTTP重定向到HTTPS,并在管理Jenkins > 系统下设置Jenkins的公共URL。
如果您直接使用Jenkins内置的Web服务器运行HTTPS,请通过Jenkins启动选项(例如--httpsPort、--httpsKeyStore和--httpsKeyStorePassword)或通过特定于软件包的服务配置进行配置。确切的文件因安装方法而异,因此在更改之前请检查Jenkins服务的启动方式。
同时确保反向代理发送正确的转发标头。损坏的代理标头可能导致错误的重定向URL、失败的CSRF检查或指向普通HTTP的链接。
Jenkins和插件安全
Jenkins通过插件实现的扩展性是其最大的优势之一,但如果管理不当,也会带来潜在的安全风险。
保持Jenkins和插件更新
过时的Jenkins核心及其插件版本是常见的安全漏洞来源。定期更新两者以修补已知的安全缺陷。
- Jenkins核心更新: 关注Jenkins安全公告并规划定期的维护窗口。
- 插件更新: 经常查看更新通知。在可能的情况下,在非生产控制器上测试关键的插件更新。
插件白名单和审计
并非所有插件都是平等的。某些插件可能存在安全漏洞或已停止维护。
- 使用受信任的插件: 优先使用来自Jenkins更新中心的维护中的插件。
- 限制插件安装: 每个插件都会添加在您的控制器内运行的代码。
- 移除未使用的插件: 每季度或在重大流程变更后审计插件。
管理插件安全警告
Jenkins可以警告您已安装的插件存在已知的安全公告。密切关注管理Jenkins下的警告,并更新、替换或移除受影响的插件。
Jenkinsfile安全
Jenkinsfile定义了您的构建管道。保护它们对于防止恶意代码注入到您的构建过程中至关重要。
- 将Jenkinsfile存储在版本控制中: 像审查应用程序代码一样审查管道更改。
- 将管道代码视为可执行代码: Jenkinsfile可以运行shell命令、发布工件和请求凭据。
- 谨慎处理脚本审批: 脚本安全插件可能要求管理员批准某些Groovy方法或脚本。仅批准您理解的代码。
- 避免在UI中使用内联管道脚本: 优先使用带有代码审查的基于仓库的
Jenkinsfile。
示例:审批脚本
当管道遇到未批准的Groovy签名时,Jenkins会在管理Jenkins > 进程内脚本审批下列出它。在批准之前,请审查请求的签名和触发它的作业。广泛的批准可能会影响多个作业。
Jenkins凭据管理
Jenkins通常需要存储敏感的凭据,如API密钥、密码和SSH密钥,以访问其他服务。安全管理这些凭据至关重要。
- 使用Jenkins凭据存储: 将API令牌、密码、证书和SSH密钥存储为凭据,而不是以明文形式存储在作业定义中。
- 避免硬编码机密: 不要将机密放在
Jenkinsfile、shell脚本、构建日志或仓库变量中。 - 严格限定凭据范围: 使用文件夹和权限,确保生产凭据远离不需要它们的作业。
- 轮换凭据: 当人员离职、作业被删除或机密可能出现在日志中时,轮换部署密钥和服务令牌。
示例:在管道中使用凭据
pipeline {
agent any
stages {
stage('部署') {
steps {
withCredentials([sshUserPrivateKey(credentialsId: 'prod-deploy-key', keyFileVariable: 'SSH_KEY', usernameVariable: 'SSH_USER')]) {
sh 'ssh -i "$SSH_KEY" -o IdentitiesOnly=yes "[email protected]" "deploy_command"'
}
}
}
}
}
在此示例中,prod-deploy-key是存储的SSH私钥凭据的ID。Jenkins将密钥写入一个临时文件,供该步骤使用,并在日志中屏蔽支持的机密值。
网络安全和访问控制
除了Jenkins的内部安全之外,在网络层面保护服务器也至关重要。
- 防火墙规则: 将Jenkins访问限制在受信任的网络、VPN范围或身份感知代理入口点。
- 反向代理控制: 使用反向代理进行TLS、HTTP到HTTPS重定向、请求限制和一致的标头。
- 代理隔离: 不要在控制器上运行不受信任的构建。对于有风险的负载,使用一次性或严格控制下的代理。
- 网络分段: 除非作业确实需要,否则不要让Jenkins访问广泛的内部网络。
审计和监控
定期查看Jenkins日志和监控活动有助于检测和响应安全事件。
- 启用审计日志: 记录登录、权限更改、凭据更改、作业编辑和管理操作。诸如审计跟踪之类的插件可以提供帮助。
- 监控Jenkins日志: 查看控制器日志和构建日志,以发现意外的凭据使用、新的管理员账户、异常的作业编辑或重复的登录失败。
- 备份配置: 根据您的恢复计划备份Jenkins主目录、作业配置、插件列表和凭据元数据。像保护生产机密一样保护备份。
让Jenkins保持平淡无奇
目标是让Jenkins服务器的访问可预测、更改经过审查、插件已知、凭据不会泄露到作业或日志中。从SSO、最小权限角色、HTTPS、插件更新和安全的凭据使用开始。然后安排定期审查,以免昨天的临时例外成为明天的事件。