CI/CD 流水线是 DevOps 团队软件交付过程的根本组成部分。该流水线利用自动化和继续监控来实现软件的无缝交付。通过继续自动化,确保 CI/CD 流水线每一步的安全性十分重要。在流水线的各个阶段,通常须要拜访凭据等敏感信息。爱护这些信息对于放弃弱小的平安态势至关重要。本文将带你理解如何在 Jenkins CI/CD 流水线中爱护密钥(Secrets)。
转自 SEAL 平安
在 CI/CD 流水线中应用 Secrets
如前所述,CI/CD 流水线通常须要拜访敏感信息,如明码和 API 密钥。以明文对它们进行硬编码会产生重大的平安危险,并且违反了大多数合规框架中的审计准则。应用这些凭证而不在非必要的状况下公开它们的机制,对于自动化软件交付很重要。
用于平安存储、治理和拜访上述凭证的工具和技术的汇合称为密钥治理(Secrets Management)。Secrets 宽泛用于 IT、DevOps 和云环境。
Secrets 包含:
- 应用程序生成的明码
- 零碎到零碎的明码
- API 密钥
- 公有加密密钥
- 一次性明码
- 证书
- 特权账户凭证
CI/CD 流水线集成了多个配置管理平台,须要 secrets 来启用服务到服务的通信。这些平台还须要 secrets 来验证申请拜访 SSH 服务器、数据库、HTTP 服务和其余资源的实体。
CI/CD 中 Secrets 的用处
Secrets 用于治理 CI/CD 流水线中的拜访权限。一些用例包含源代码管制治理、基础设施连贯、合作提供者和验证。让咱们更具体地探讨这些用例中的每一个。
1. 源代码管制治理
版本控制系统,如 Git,便于多人团队之间的合作。这些零碎通过治理和存储来自多个开发人员的代码奉献,来帮忙保护应用程序的开发。因为源代码可能蕴含一些组织最有价值的资产,因而正确验证和治理 Git 存储库的拜访权限至关重要。
密钥管理系统对爱护用于将贡献者的主机连贯到存储库的凭据十分重要。为了防止歹意攻击者利用 secrets 发动平安攻打,因而 secrets 并不存储在版本控制,而是存储在非凡的敏感文件中(当然这些敏感文件会被排除在存储库和日志之外)。
2. 基础设施连贯
CI/CD 流水线通常由在多个主机上的不同服务组成,这些主机散布在不同的基础设施上。随着这些主机一直地互相通信,通过 API 调用与服务通信,从而实现所需的应用程序性能。API 密钥和零碎到零碎(system-to-system)明码等 secrets 可能反对在基础设施之间建设平安的连贯,从而连贯多租户和多云 CI/CD 流水线。
3. 跨团队合作
CI/CD 流水线蕴含跨多个开发、经营和质量保证环境的合作流动。这些团队依附多种工具和框架来合作和共享信息。应用 secrets 进行合作有助于团队确保安全通信并在单方之间提供一层信赖和平安保障。
4. 验证
身份验证是 CI/CD 和应用程序平安的要害因素。通过将应用程序连贯到身份和拜访治理(IAM)解决方案,secrets 用于确保 CI/CD 流水线的安全性和隐衷性。这些解决方案提供了用户角色和权限的内部数据库,让用户无需在 CI/CD 流水线中裸露其凭据即可登录应用程序。
CI/CD 中的 Secrets 应用示例
要为改良密钥治理奠定根底,理解一些简略的用例会很有帮忙。
1. AWS 凭证
作为当先的云 SaaS 平台之一,AWS 是大多数基于云的基础设施的常见抉择。与 AWS API 交互以预置和查问资源通常须要应用密钥 / 拜访密钥凭证。爱护这些凭证对于保护 AWS 账户的平安至关重要。
2. 基础架构即代码 (IaC)
古代应用程序架构通常依赖于基础架构即代码 (IaC) 来部署运行工作负载的底层零碎。对这种配置进行编码可能更轻松地对可反复、可扩大和平安的基础架构进行保护。在配置此基础架构的过程中,通常须要将敏感信息(例如 SSH 密钥和 API 凭证)部署到节点。通过 IaC 和 CI/CD 主动配置基础设施是一种常见模式,治理秘密是该工作流程的重要组成部分。
3. 环境变量
环境变量在大多数 CI/CD 流水线中都有统一的用法。在解决 CI/CD 工作流时,须要动静设置值并保留这些数据,以供其余过程和脚本应用。在许多状况下,敏感值须要通过环境变量传递,这也再次强调了无效秘密治理的必要性。
在 Jenkins 内爱护 secrets
Jenkins 须要拜访大量凭据能力与形成残缺 CI/CD 流水线的所有平台和应用程序交互。Jenkins 附带了一个默认的凭证插件,其提供一个内置的密钥存储。还带有凭据绑定插件,能够将凭据绑定到环境变量。
将密钥存储在 Jenkins controller 中使流水线中的应用程序,即便这些秘密仅被创立一次依然可能被屡次援用。尽管 Jenkins 凭据插件提供了一种存储和治理秘密的简略办法,但任何 Jenkins 管理员和流水线作者都能够拜访它们。因而,DevOps 团队应确保正确配置拜访权限,以确保 CI/CD 流水线的平安。
Jenkins 反对的 secret 类型
Jenkins 秘密插件反对的凭证包含:Secret text、用户名 / 明码对、secrets file、SSH 用户名和证书。对于数量无限的密钥,能够独自存储,而大量密钥通常最好应用凭证文件进行治理。
在 Jenkins 中治理 secret
接下来咱们将探讨在 Jenkins 中爱护 secret 的一些可用选项。一起来看看将 secrets 平安地注入 Jenkins 流水线的一些最佳实际。
1. 一次性明码 (OTP)
一次性明码通过确保用户名 / 明码组合不能屡次应用来帮忙避免用户帐户被盗用。尽管该帐户始终保留用户名,但用户每次登录时都会收到一个 OTP。这能够保障 Jenkins 管理员和用户帐户的平安,避免密钥信息泄露。
2. 防止硬编码密钥
删除已硬编码到 CI/CD 配置和 Jenkinsfiles 中的密钥。这样可能让敏感凭证信息不呈现在流水线中,防止歹意行为者拜访和利用。
3. 将密钥存储在多个 Jenkins 文件
将密钥存储在多个文件中有助于施行凭据起码裸露准则。这样能够让凭据用于尽可能少的应用程序和用户。
4. 应用受权管制来治理密钥权限
开发团队应配置安全检查,以确保申请资源拜访的应用程序具备无效应用程序的属性。这些应用程序须要依据 RBAC(Role-based Access Control)策略中调配的权限拜访各种资源。
5. 遵循最小权限准则
仅将权限授予须要拜访流水线内密钥的应用程序。团队应始终如一地审核权限,确保在流水线的整个生命周期中最小权限准则得以施行和保护。
治理和存储密钥
这一节咱们将会介绍 3 个理论应用密钥的 Jenkins 和 Akeyless 密钥治理平台的根本例子:
- 第一个例子是齐全不平安的示例:应用纯文本环境变量来存储敏感凭据
- 第二个例子则是应用原生的 Jenkins 性能和插件来进行密钥治理
- 第三例子将会展现应用第三方工具来进行密钥治理的益处
纯文本示例
首先,咱们将会在 Jenkins 中创立一个“freestyle”我的项目,并将其连贯到 GitHub Repo:
无论咱们抉择如何治理代码中的密钥,应用 Jenkins 内置的凭证机制来拜访 GitHub 仓库是有用的。
咱们的理论代码将是一个十分根本的 Python 应用程序,它进行 API 调用。该 API 须要一个简略的 API 密钥,以文本字符串的模式进行认证:
#!/usr/bin/env python
import os
import requests
api_key = os.environ[‘API_KEY’]response = requests.get(“https://thedogapi.com/v1/breeds?api_key={}”.format(api_key))
print(response)
Jenkins 提供了配置环境变量的性能,然而,如果没有额定的插件,它们只能对 Jenkins 的环境或实例进行全局设置。
代码将从方才配置的环境变量中读取 API 密钥。上面是构建步骤的配置:
构建步骤运行一些简略的提醒,而后理论执行代码。上面是一个胜利构建的日志的一部分:
API 密钥显然曾经在一个构建步骤中的一个简略指令中以明文日志的模式裸露进去。一个小小的谬误配置就有可能导致泄露或危险。
Jenkins Secret Text
当初咱们能够尝试通过应用内置的证书处理程序来进步咱们构建环境的安全性:
在本例中,咱们将应用简略的“Secret Text”凭据绑定来存储 API 密钥:
接下来,咱们配置咱们的构建 job 来应用新的凭证变量:
当初,在运行另一个构建 job 后,咱们再次查看构建日志:
只管咱们曾经将构建步骤配置为将变量内容打印到日志中,但 Jenkins 凭证处理程序晓得该值是敏感的,并在任何日志或输入中混同了理论值。
这诚然极大地提高了构建的安全性,但并不是美中不足的。这对一个用户量较少的 Jenkins 部署曾经足够用,但在一个大型的、分布式的 Jenkins 架构中,须要治理多个用户和团队的拜访权限,这十分复杂,难以无效治理。此外,存储在凭证变量中的密钥值依然能够被集群中的每个 Jenkins 实例以及具备适当权限的任何用户拜访。
如果任意节点被毁坏,逾越多个部署和上下文的密钥可能处于危险之中。用户依然须要手动爱护和配置 Jenkins 的基础设施,在本例中指密钥存储。如果有一种办法能够应用敏感的凭证,而不须要将他们存储在 Jenkins 外部,会怎么样呢?
密钥管理工具
让咱们试试应用 Akeyless 来治理密钥。既然咱们曾经和 Jenkins 部署集成,咱们能够依照文档来进行操作。Akeyless 与公开可用的 Hashicorp Vault 插件集成,因而 Jenkins 的设置很简略。
接下来,咱们将创立一个收费的 Akeyless 并配置密钥:
下一步是创立一个拜访角色,并且该角色有权限拜访刚刚创立的密钥:
当初咱们须要给咱们的拜访角色以正确的权限来查看密钥:
在 Akeyless 侧咱们须要创立的最初一个货色是一种认证形式。这就是咱们如何让内部实体,如咱们的 Jenkins 部署,可能对 Akeyless 进行 API 调用并检索密钥。
认证形式创立结束后,请确保通过下载 CSV 文件来保留拜访 ID 和密钥,否则这些值将不会再次显示。最初,咱们须要将咱们新创建的角色与这个拜访形式分割起来。
下一步是依据 Akeyless 文档配置 Jenkins 构建环境:
当初,咱们将运行另一个构建,这次配置的是利用此前配置过的 Akeyless vault
在日志中,当初有一个步骤展现了 Jenkins 从 Akeyless Vault 中检索密钥。但构建日志中的凭证值也仍旧是含糊的。当初,咱们有了一个与 Jenkins 实例集成的第三方密钥治理平台。
这看起来有些画龙点睛,然而一个齐全专一于密钥治理的内部工具是一个弱小的形象。Jenkins 首先是一个 CI/CD 工具,密钥治理是一个附加性能。在这种状况下,它永远无奈提供一流的性能、治理能力和平安保障,而专门的密钥治理平台则能够提供:
- 具备 SLA 保障的治理基础设施
- 零常识加密
- 直观的、可拜访的密钥治理和组织
- 与规范的 DevOps 工具和平台集成
像 Akeyless 这样的工具还能够防止治理简单的、自我托管的基础设施。咱们只需点击几下,就能领有一个运行中的密钥终端。
结 论
因为安全性是 CI/CD 流水线的首要思考因素,因而在 Jenkins 中应用密钥时遵循最佳实际十分重要。Jenkins 流水线依赖密钥进行身份验证、合作和基础设施治理。CI/CD 密钥治理对大多数团队来说都是一个挑战,因为在细节上施行访问控制十分艰难和简单。
而通过密钥管理工具,Jenkins 用户能够取得更加集中且平安的资源来治理运行 CI/CD 流水线所需的蕴含敏感信息的凭据,减速 DevOps 工作流程。同时,平安团队也可能全面理解密钥的地位和应用形式。借助自动化流程和集中拜访策略,密钥治理平台还能够帮忙平安团队应答平安相干的法律和合规问题。