CI/CD 流水线是 DevOps 团队软件交付过程的基本组成部分。该流水线利用自动化和持续监控来实现软件的无缝交付。通过持续自动化,确保 CI/CD 流水线每一步的安全性非常重要。在流水线的各个阶段,通常需要访问凭据等敏感信息。保护这些信息对于保持强大的安全态势至关重要。本文将带你了解如何在 Jenkins CI/CD 流水线中保护机密(Secrets)。
在 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 流水线中的访问权限。一些用例包括源代码控制管理、基础设施连接、协作提供者和验证。让我们更详细地讨论这些用例中的每一个。
- 源代码控制管理 版本控制系统,如 Git,便于多人团队之间的协作。这些系统通过管理和存储来自多个开发人员的代码贡献,来帮助维护应用程序的开发。由于源代码可能包含一些组织最有价值的资产,因此正确验证和管理 Git 存储库的访问权限至关重要。
机密管理系统对保护用于将贡献者的主机连接到存储库的凭据非常重要。为了避免恶意攻击者利用 secrets 发起安全攻击,因此 secrets 并不存储在版本控制,而是存储在特殊的敏感文件中(当然这些敏感文件会被排除在存储库和日志之外)。
-
基础设施连接 CI/CD 流水线通常由在多个主机上的不同服务组成,这些主机分布在不同的基础设施上。随着这些主机不断地相互通信,通过 API 调用与服务通信,从而实现所需的应用程序功能。API 密钥和系统到系统(system-to-system)密码等 secrets 能够支持在基础设施之间建立安全的连接,从而连接多租户和多云 CI/CD 流水线。
-
跨团队协作 CI/CD 流水线包含跨多个开发、运营和质量保证环境的协作活动。这些团队依靠多种工具和框架来协作和共享信息。使用 secrets 进行协作有助于团队确保安全通信并在双方之间提供一层信任和安全保障。
-
验证 身份验证是 CI/CD 和应用程序安全的关键要素。通过将应用程序连接到身份和访问管理 (IAM)解决方案,secrets 用于确保 CI/CD 流水线的安全性和隐私性。这些解决方案提供了用户角色和权限的外部数据库,让用户无需在 CI/CD 流水线中暴露其凭据即可登录应用程序。
CI/CD 中的 Secrets 使用示例
要为改进机密管理奠定基础,了解一些简单的用例会很有帮助。
-
AWS 凭证 作为领先的云 SaaS 平台之一,AWS 是大多数基于云的基础设施的常见选择。与 AWS API 交互以预置和查询资源通常需要使用密钥/访问密钥凭证。保护这些凭证对于维护 AWS 账户的安全至关重要。
-
基础架构即代码 (IaC) 现代应用程序架构通常依赖于基础架构即代码 (IaC) 来部署运行工作负载的底层系统。对这种配置进行编码能够更轻松地对可重复、可扩展和安全的基础架构进行维护。在配置此基础架构的过程中,通常需要将敏感信息(例如 SSH 密钥和 API 凭证)部署到节点 。通过 IaC 和 CI/CD 自动配置基础设施是一种常见模式,管理机密是该工作流程的重要组成部分。
-
环境变量 环境变量在大多数 CI/CD 流水线中都有一致的用法。在处理 CI/CD 工作流时,需要动态设置值并保留这些数据,以供其他进程和脚本使用。在许多情况下,敏感值需要通过环境变量传递,这也再次强调了有效机密管理的必要性。
保护 Jenkins 内部的 secrets
Jenkins 需要访问大量凭据才能与构成完整 CI/CD 流水线的所有平台和应用程序交互。Jenkins 附带了一个默认的凭证插件,其提供一个内置的机密存储。还带有凭据绑定插件,可以将凭据绑定到环境变量。
将机密存储在 Jenkins 控制器中使流水线中的应用程序,即使这些机密仅被创建一次仍然能够被多次引用。虽然 Jenkins 凭据插件提供了一种存储和管理机密的简单方法,但任何 Jenkins 管理员和流水线作者都可以访问它们。因此,DevOps 团队应确保正确配置访问权限,以确保 CI/CD 流水线的安全。 Jenkins 支持的 secret 类型 Jenkins 机密插件支持的凭证包括:机密文本、用户名/密码对、机密文件、SSH 用户名和证书 。对于数量有限的机密,可以单独存储,而大量机密通常最好使用凭证文件进行管理。
在 Jenkins 中管理 secret
接下来我们将讨论在 Jenkins 中保护 secret 的一些可用选项。一起来看看将 secrets 安全地注入 Jenkins 流水线的一些最佳实践。
-
一次性密码 (OTP) 一次性密码通过确保用户名-密码组合不能多次使用来帮助防止用户帐户被盗用。虽然该帐户始终保留用户名,但用户每次登录时都会收到一个 OTP。这可以保证 Jenkins 管理员和用户帐户的安全,防止机密信息泄露。
-
避免硬编码机密 删除已硬编码到 CI/CD 配置和 Jenkinsfiles 中的机密。这样能够让敏感凭证信息不出现在流水线中,避免恶意行为者访问和利用。
-
将机密存储在多个 Jenkins 文件 将机密存储在多个文件中有助于实施凭据最少暴露原则。这样可以让凭据用于尽可能少的应用程序和用户。
-
使用授权控制来管理机密权限 开发团队应配置安全检查,以确保请求资源访问的应用程序具有有效应用程序的属性。这些应用程序需要根据 RBAC (Role-based Access Control)策略中分配的权限访问各种资源。
-
遵循最小权限原则 仅将权限授予需要访问流水线内机密的应用程序。团队应始终如一地审核权限,确保在流水线的整个生命周期中最小权限原则得以实施和维护。
结 论 由于安全性是 CI/CD 流水线的首要考虑因素,因此在 Jenkins 中使用机密时遵循最佳实践非常重要 。Jenkins 流水线依赖机密进行身份验证、协作和基础设施管理。CI/CD 机密管理对大多数团队来说都是一个挑战,因为在细节上实施访问控制非常困难和复杂。
而通过机密管理工具,Jenkins 用户可以获得更加集中且安全的资源来管理运行 CI/CD 流水线所需的包含敏感信息的凭据,加速 DevOps 工作流程。同时,安全团队也能够全面了解机密的位置和使用方式。借助自动化流程和集中访问策略,机密管理平台还可以帮助安全团队应对安全相关的法律和合规问题。