CI/CD流水线是DevOps团队软件交付过程的基本组成部分。该流水线利用自动化和持续监控来实现软件的无缝交付。通过持续自动化,确保CI/CD流水线每一步的安全性非常重要。在流水线的各个阶段,通常需要访问凭据等敏感信息。保护这些信息对于保持强大的安全态势至关重要。本文将带你了解如何在JenkinsCI/CD流水线中保护密钥(Secrets)。
在CI/CD流水线中使用Secrets
如前所述,CI/CD流水线通常需要访问敏感信息,如密码和API密钥。以明文对它们进行硬编码会产生严重的安全风险,并且违反了大多数合规框架中的审计准则。使用这些凭证而不在非必要的情况下公开它们的机制,对于自动化软件交付很重要。
用于安全存储、管理和访问上述凭证的工具和技术的集合称为机密管理(SecretsManagement)。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是大多数基于云的基础设施的常见选择。与AWSAPI交互以预置和查询资源通常需要使用密钥/访问密钥凭证。保护这些凭证对于维护AWS账户的安全至关重要。
2.基础架构即代码(IaC)
现代应用程序架构通常依赖于基础架构即代码(IaC)来部署运行工作负载的底层系统。对这种配置进行编码能够更轻松地对可重复、可扩展和安全的基础架构进行维护。在配置此基础架构的过程中,通常需要将敏感信息(例如SSH密钥和API凭证)部署到节点。通过IaC和CI/CD自动配置基础设施是一种常见模式,管理机密是该工作流程的重要组成部分。
3.环境变量
环境变量在大多数CI/CD流水线中都有一致的用法。在处理CI/CD工作流时,需要动态设置值并保留这些数据,以供其他进程和脚本使用。在许多情况下,敏感值需要通过环境变量传递,这也再次强调了有效机密管理的必要性。
在Jenkins内保护secrets
Jenkins需要访问大量凭据才能与构成完整CI/CD流水线的所有平台和应用程序交互。Jenkins附带了一个默认的凭证插件,其提供一个内置的密钥存储。还带有凭据绑定插件,可以将凭据绑定到环境变量。
将密钥存储在Jenkinscontroller中使流水线中的应用程序,即使这些机密仅被创建一次仍然能够被多次引用。虽然Jenkins凭据插件提供了一种存储和管理机密的简单方法,但任何Jenkins管理员和流水线作者都可以访问它们。因此,DevOps团队应确保正确配置访问权限,以确保CI/CD流水线的安全。
Jenkins支持的secret类型
Jenkins机密插件支持的凭证包括:Secrettext、用户名/密码对、secretsfile、SSH用户名和证书。对于数量有限的密钥,可以单独存储,而大量密钥通常最好使用凭证文件进行管理。
在Jenkins中管理secret
接下来我们将讨论在Jenkins中保护secret的一些可用选项。一起来看看将secrets安全地注入Jenkins流水线的一些最佳实践。
1.一次性密码(OTP)
一次性密码通过确保用户名/密码组合不能多次使用来帮助防止用户帐户被盗用。虽然该帐户始终保留用户名,但用户每次登录时都会收到一个OTP。这可以保证Jenkins管理员和用户帐户的安全,防止密钥信息泄露。
2.避免硬编码密钥
删除已硬编码到CI/CD配置和Jenkinsfiles中的密钥。这样能够让敏感凭证信息不出现在流水线中,避免恶意行为者访问和利用。
3.将密钥存储在多个Jenkins文件
将密钥存储在多个文件中有助于实施凭据最少暴露原则。这样可以让凭据用于尽可能少的应用程序和用户。
4.使用授权控制来管理密钥权限
开发团队应配置安全检查,以确保请求资源访问的应用程序具有有效应用程序的属性。这些应用程序需要根据RBAC(Role-basedAccessControl)策略中分配的权限访问各种资源。
5.遵循最小权限原则
仅将权限授予需要访问流水线内密钥的应用程序。团队应始终如一地审核权限,确保在流水线的整个生命周期中最小权限原则得以实施和维护。
管理和存储密钥
这一节我们将会介绍3个实际使用密钥的Jenkins和Akeyless密钥管理平台的基本例子:
第一个例子是完全不安全的示例:使用纯文本环境变量来存储敏感凭据
第二个例子则是使用原生的Jenkins功能和插件来进行密钥管理
第三例子将会展示使用第三方工具来进行密钥管理的好处
纯文本示例
首先,我们将会在Jenkins中创建一个“freestyle”项目,并将其连接到GitHubRepo:
无论我们选择如何管理代码中的密钥,使用Jenkins内置的凭证机制来访问GitHub仓库是有用的。
我们的实际代码将是一个非常基本的Python应用程序,它进行API调用。该API需要一个简单的API密钥,以文本字符串的形式进行认证:
#!/usr/bin/envpythonimportosimportrequestsapi_key=os.environ[‘API_KEY’]response=requests.get(“
转载请注明:http://www.0431gb208.com/sjslczl/2481.html