CI/CD 管道作为软件开发过程的重要组成部分,对黑客来说是一个很有吸引力的目标。根据我们对云环境的研究,我们分享了常见的错误配置,并提供了有关如何修复它们以防止供应链攻击的提示。
在面向互联网的复杂云环境中,管理密钥和凭据是一项艰巨的挑战。
在我们最近对云服务提供商漏洞的研究过程中,我们发现了三种被忽视的错误配置模式,这些模式使云环境面临 CI/CD
供应链攻击风险。这些错误配置使黑客能够执行横向移动和操纵源代码,篡改组织的组件并将恶意代码传播到内部服务或外部客户。
在这篇博文中,我们将提供减轻 CI/CD
供应链攻击风险的最佳实践,并强调持续监控 CI/CD
环境以防止密钥遗忘和网络配置错误的需要。
CI/CD
管道是一组实践和工具,可帮助组织快速高效地开发、构建和部署高质量的软件给用户,同时最大限度地降低错误和错误的风险。
CI/CD
管道通常包括以下步骤:
代码由开发人员编写并提交给版本控制系统,例如 Git
。
使用 Jenkins
和 CircleCI
等持续集成 (CI
) 工具自动构建和测试代码。
构建的代码会自动打包并部署到测试环境以进行测试和验证。
如果测试和验证成功,代码将部署到生产环境或存储在组件存储库中以供服务拉取和使用。
CI/CD
管道是黑客的热门目标,因为它们包含许多影响组织软件供应链的集中组件。因此,管道中任何一项被入侵可能会危及各种环境。例如,黑客可以入侵云环境中的容器注册表存储库,然后将恶意容器镜像传播到公司的内部服务,或通过其软件向外部客户传播。
由于 CI/CD
管道用于自动化构建、测试和部署过程,因此它们通常可以访问敏感信息,如密钥和凭据,黑客可以利用这些信息进行横向移动。此外,CI/CD
管道的自动化和复杂性使攻击检测和预防变得复杂,增强了它们对黑客的吸引力。
在我们对云环境的研究过程中,我们发现了普遍存在的 CI/CD 错误配置,这些错误配置往往被安全从业者忽视,并将它们汇总成一个建议性的补救步骤列表。
鉴于黑客经常利用多个安全漏洞来入侵 CI/CD
组件,仅解决以下问题之一就可以显着减少组织的攻击面。
容器注册表通常部署在容器化的云环境中,存储在构建和生产阶段使用的容器镜像。这些私有镜像可以使用容器注册表凭证拉取,这些凭证通常位于容器化实例的文件系统中。
如果黑客成功入侵这类实例,他们可以从文件系统获取容器注册表凭据并访问容器注册表中存放的所有镜像。
借助只读权限,黑客可以分析公司的应用程序、研究漏洞并寻找存储在注册表镜像中的敏感密钥和专有代码。借助写入权限,容器注册表凭据可以让黑客覆盖现有的生产镜像或将恶意代码传播给外部用户或使用这些镜像的其他内部服务。
黑客入侵在容器化环境中对外的服务
他们在文件系统中找到容器注册表凭据
他们利用凭据从注册表中获取其它的私有镜像
他们用恶意代码感染镜像
确保对容器注册表实施适当的访问控制和范围划分。虽然大多数云服务提供商通过 IAM
身份提供注册表权限管理,但 SaaS
提供商通常通过服务的 Web
界面或 API
使用注册表权限管理。
为角色分配read-only
或write-only
特权,并将具有权限的角色pull
和push
权限仅限于他们需要的存储库和镜像。例如,开发人员不需要写入权限,因为他们不需要直接将镜像推送到在容器编排上运行的注册表或容器化服务。至于有push
权限的角色,他们应该只参与 CI/CD
管道的最后阶段,将最终镜像推送到注册表。
另外,避免向使用容器注册表的应用程序和自动化授予列表资源权限,以防止黑客进行侦察和了解可以访问哪些存储库。
为了拉取私有镜像,Kubernetes
节点必须能够访问存储它们的容器注册表。此容器注册表的凭据位于密钥资源中。每个 pod
配置的imagePullSecrets
字段中都提到了密钥的名称。
如果黑客入侵了可以访问容器注册表密钥的 pod
,他们可以利用这些凭据从注册表中检索所有可访问的镜像。这些镜像进一步可能包含专有代码或其他密钥。如果容器注册表凭据具有写入权限,黑客可能会覆盖生产镜像并在内部或外部传播恶意代码。
黑客入侵了提供对外服务的 pod
他们在文件系统中找到一个 Kubernetes
服务帐户令牌
他们使用令牌从集群中获取容器注册表密钥
他们利用凭据从注册表中获取其它的私有镜像
他们用恶意代码感染镜像
防止这种供应链风险的最有效方法是限制 pod
的服务帐户权限并限制对容器注册表密钥的访问。
云环境中被遗忘的密钥会带来严重的安全风险。这些密钥,例如云访问密钥、密码、CI/CD
凭证和 API
访问令牌,通常会在构建和部署过程之后遗留在生产环境的组件中。
在我们的研究过程中,我们在多个被忽视的位置发现了敏感密钥,包括 Linux bash
历史文件和容器镜像基础层。一些密钥可能会出现在镜像层中,但会隐藏在最终压缩的文件系统中。这些被遗忘的密钥可以让黑客进行横向移动,然后执行远程代码来篡改镜像的构建过程。
黑客入侵了对外服务
他们在.bash_history
文件中找到了操作系统镜像构建过程的 CI/CD
凭据
该密钥授予内部存储桶的访问权限, 该桶包含了构建过程中使用的生产就绪组件
黑客修改组件以在下一个构建中传播恶意代码
黑客从公司的公共容器注册表中获取公开可用的容器镜像
他们在容器的历史文件中找到敏感的密钥
这些镜像具有用于构建镜像的所有历史命令以及内部存储桶的密钥
存储桶包含镜像构建过程中使用的生产就绪组件
黑客修改存储桶中的工组件以便在镜像的构建中传播恶意代码
为防止黑客获取敏感密钥,您的组织应在每个组件构建的最后阶段定期扫描环境和生产组件来查找密钥。 这可以使用相关产品或开源工具(例如Trufflehog
)来完成。
此外,您应该扫描所有镜像层和元数据文件,因为它们可能会被潜在的黑客访问。这可以保护敏感信息不被意外暴露和随后被利用。例如,密钥可以隐藏在:
AWS SSM
日志 —/var/log/amazon/ssm/*
Bash
历史——~/.bash_history
或者/root/.bash_history
Linux
日志文件 —/var/log/journal/*
通过采取这些步骤,您可以保护您的组件并维护 CI/CD
管道的安全。
组织内对外服务的应用程序与其内部 CI/CD
组件之间的连接可以为黑客提供横向移动的能力。
在Hell's Keychain
攻击中,由于缺乏足够的网络控制,研究人员得以访问内部 CI/CD
存储库。这种错误配置并非 IBM Cloud
独有,因为它已在多个云提供商及其客户中观察到。在我们看来,这个问题在行业讨论和云安全解决方案中经常被忽视。
黑客入侵了对外服务
他们在.bash_history
文件中找到操作系统镜像构建过程的 敏感密钥
密钥授予对内部存储桶的访问权限
黑客尝试连接到存储桶
它们由于限制性资源策略而失败,该策略只允许来自 CI/CD
虚拟专用网络的连接
实施强大的网络策略并强制执行云分段可以保护您的组织免受此类 CI/CD
供应链攻击。在对外服务的环境中监控云访问密钥并验证它们不授予对 CI/CD
环境的访问权限。此外,云身份和存储桶应限制在 CI/CD
虚拟网络中。
在无法限制网络访问的SaaS CI/CD
解决方案(如github
)的情况下,服务凭证或访问令牌不能存储在对外服务的应用程序。如果黑客设法入侵此类应用程序,他们将能够绕过所有网络限制并直接访问包含生产代码和组件的服务。
最后,您应该考虑采用双因素身份验证和基于角色的访问控制等安全措施来保护您的 SaaS CI/CD
解决方案。
CI/CD
管道是软件开发过程的重要组成部分,使组织能够快速、一致地交付高质量的软件。然而,这些管道是恶意黑客的一个有吸引力的目标:一个被入侵的组件可能危及多个环境。
在这篇博文中,我们描述了常见的 CI/CD
管道配置错误,并提供了有关如何修复它们以防止供应链攻击的提示。这些错误配置包括过度授权的容器注册表访问、遗忘的密钥以及生产和 CI/CD 环境之间的链接。仅实施上述最佳实践之一就可以显着减少攻击面并保护软件供应链。