您还未登录! 登录 | 注册 | 帮助  

您的位置: 首页 > 软件开发专栏 > 网络/安全 > 正文

从脆弱性到胜利:捍卫您的CI/CD管道

发表于:2023-07-17 作者:科技狠活与软件技术 来源:今日头条

自动化的持续集成/持续交付(CI/CD)流水线被用来加快开发速度。拥有可以触发或预定的流水线,可自动接收代码、合并代码、构建代码、测试代码并自动交付,这真是太棒了。然而,由于这些流水线通常需要访问互联网以下载依赖项,并且需要访问各种机密信息以上传至生产环境,这意味着一旦这样的流水线遭到入侵,攻击者就有很多选择来破坏您的操作、窃取信息或机密信息。

本文介绍的所有故事都涉及知名的CI/CD工具的违规事件。大多数公司依赖这些工具,这意味着与其他软件供应链攻击一样,所有恶意行为者只需攻击一个目标,就可以获得广泛的影响范围。

接下来,让我们来看一下过去几年中几个突出的故事,展示了这种攻击向量固有的漏洞。在文章结束时,我将确保提供一些建议来加固和保护您的流水线,无论您使用的是什么工具。

自动化的持续集成/持续交付(CI/CD)流水线被用来加快开发速度。自动触发或预定的流水线能够自动接收代码、合并代码、构建代码、测试代码并自动交付。然而,这些流水线通常以速度和易用性为目标,并不一定会考虑到安全性。由于流水线通常需要访问互联网以下载依赖项,并且需要访问各种机密信息以上传到生产环境,一旦流水线遭到入侵,攻击者就有多种选择来破坏您的操作、窃取信息或机密信息。

本文中介绍的所有故事都描述了著名CI/CD工具遭受的入侵事件。大多数公司依赖这些工具,这意味着与其他软件供应链攻击一样,恶意行为者只需攻击单个目标就能造成广泛影响。

让我们回顾一下过去几年中几个突出事件,展示了这种攻击方式的固有漏洞。文章结尾,我将提供一些建议,以加强和保护您的流水线,无论您使用的是哪种工具。

CircleCI的入侵事件

在2023年1月,持续集成和交付平台CircleCI公开披露了一起安全入侵事件,攻击者成功未经授权地访问了公司的基础设施。攻击是由一封钓鱼邮件发起的,欺骗了一名员工以分享他们的凭据,攻击者利用这些凭据访问了公司的系统。该员工使用了双重认证,但攻击者在员工登录系统后抓取了一个会话Cookie,使他们能够冒充该员工,并最终升级访问了CircleCI的一部分生产系统。

攻击者访问了一些客户数据,包括姓名、邮箱地址和账单信息。公司报告称没有访问到任何代码或知识产权,并且没有客户报告到他们账户或数据的任何未经授权的访问。

CircleCI迅速做出了应对,展开了调查,并与执法部门和网络安全专家合作,确定了攻击的范围,并修复了导致攻击发生的漏洞。该公司还重置了所有员工和客户的凭据,并实施了其他安全措施,例如加强系统的监控。

DevOps受到干扰:Argo CD的安全入侵事件

Argo CD是一款用于将应用程序持续部署到Kubernetes集群的热门开源工具。2022年2月,发现了Argo CD中的一个新漏洞,该漏洞允许未经身份验证的用户访问由该工具管理的Kubernetes应用程序的敏感信息。该漏洞是由Argo CD的API服务器配置错误引起的,该错误允许未经授权的用户执行API请求并检索诸如密钥、配置和应用程序元数据等信息。只要攻击者有权限创建或更新应用程序并知道或能够猜测包含有效YAML的文件的完整路径,他们就可以创建恶意的Helm图表,并继续在值中使用YAML文件,直到找到通常不可访问的重要数据。

此漏洞被评定为CVSS分数7.5(高危),影响着包括2.1.4版本在内的Argo CD的所有版本。Argo CD在2.1.5版本中发布了针对该漏洞的补丁,建议用户尽快升级到该版本。

此漏洞被认为特别令人担忧,因为Argo CD通常用于管理生产环境中的关键应用程序和基础架构。敏感信息的泄漏可能允许攻击者访问敏感数据或采取其他恶意行动,从而影响应用程序的可用性或安全性。

解开Codecov入侵的谜团:经验教训

Codecov是一款用于跟踪和分析代码覆盖率的工具,用于CI/CD流水线中,使开发人员能够衡量和分析他们的测试的有效性。根据Codecov的安全更新所述:

“2021年4月1日星期四,我们得知有人未经我们的许可,未经授权地访问了我们的Bash Uploader脚本,并进行了修改。攻击者之所以能够获得访问权限,是因为Codecov的Docker镜像创建过程中存在的错误,导致攻击者能够提取修改我们的Bash Uploader脚本所需的凭证。”

Bash Uploader由客户用于将他们的代码覆盖率报告上传到Codecov平台。使用这种访问权限,攻击者修改了Bash上传脚本,添加了恶意代码,该代码可以在上传过程中从用户系统中收集环境变量、验证令牌和其他敏感数据。然后,这些数据被发送到攻击者控制的远程服务器。

Codecov确认该入侵事件影响了大约1%的客户群体,其中包括技术、金融和医疗保健行业的重要公司。该公司确认,在入侵期间没有更改任何客户代码或代码覆盖率报告,但用户验证令牌和其他敏感信息可能已受到威胁。

Codecov立即采取行动删除了恶意代码,并提醒受影响的客户重置其验证令牌并采取其他安全措施。该公司还展开了对这一事件的调查,并与执法部门和网络安全专家合作,确定了攻击的来源。

如何保护您的流水线?

如上所述,CI/CD流水线是为了速度和自动化而构建的,并不一定在设计时考虑到安全性。三家大型知名公司都遭受了某种类型的攻击,可能导致客户信息曝光,这表明您自己的流水线和数据的漏洞性。

无论您使用的是何种工具或CI/CD平台,您可以采取一些措施来提高安全性并在恶意攻击者成功访问流水线或网络时减少潜在的损害。

威胁建模:威胁建模是一种结构化的方法,用于识别对系统或应用程序可能构成的安全威胁,并设计相应的对策来减轻这些威胁。作为一种练习,假设有人入侵了您的流水线。他们现在可以访问哪些环境?他们可以看到和使用哪些密钥?他们可以修改您的代码吗?影响测试吗?从web上提取文件或运行逆向shell吗?即使您认为已对流水线进行了清理并正确分割了网络访问权限,勾起一下恶意行为的想象力,然后检查一下,以便您了解最糟糕的情况。您可能会惊讶地发现您的流水线平台或工具中隐藏着哪些在明显情况下的开放密钥和访问选项。

网络分割:网络分割是将较大的网络划分为更小、更安全的子网络或段的实践,每个子网络或段都有自己的安全控制和策略。网络分割的目的是通过限制潜在安全入侵的范围并将攻击的潜在影响最小化来增加整体网络的安全性。将网络分割成较小的段限制了攻击者的横向移动,并降低了未经授权的访问或数据泄漏的风险。

伴随着钓鱼攻击日益普及,您的开发人员或其他员工可能成为此类骗局的受害者,毕竟我们都是人类。假设您的开发人员的凭据可能会被恶意行为者利用,这意味着您需要确保绝大多数开发人员不具备足够的权限,使他们能够单独地窃取机密信息、向生产镜像中加入恶意代码、或者只需推送自己版本的生产代码而无人可阻拦。确保每个人只具备完成工作所需的最低限度的权限是一项耗时的工作,让每个人都拥有管理员权限并就此作罢是非常诱人的。不要被黑暗面所吸引 - 遵循最小权限和零信任原则。

监控和警报:继续上述内容,即使对开发人员进行了深入的训练,以提高他们防范网络钓鱼和其他社会工程攻击的意识,安全入侵仍然可能发生。您并不知道何时或以何种方式发生入侵,但您应该做好随时发现的准备。由于大多数流水线环境是临时的,这意味着一旦工作完成,除非您自己创建这些迹象,否则不会留下争论发生的证据。

确保对流水线中发生的所有事情进行记录,包括每次PR、合并、构建和测试。确保用户信息也被记录下来,以便在需要时进行审查。对配置文件或环境本身的任何更改也应记录下来。目标是能够对入侵进行清晰的事后调查。事先确定哪些事件应产生警报,并确保正确的人员接收到这些警报。注意不要洪水般地发送无用或错误的警报 - 这会导致人们因接收到无用或错误的警报而忽略它们,或在推迟处理时故意忽略警报。显然,这些日志中不应包含任何开放密钥或密码 - 这导致下一个重点:

密钥管理:确保使用某种密钥管理工具。至少,这将使您能够在发生入侵时更容易轮换密钥和密码。还应该做一些工作,将在系统上进行的任何记录中的流数据和访问密钥屏蔽。任何未经授权的人员都不应该能够访问这些信息,他们绝对不应该能够更改它们。

随着组织越来越多地依赖基于云的服务、容器化应用程序和其他分布式环境,这些环境要求在不同的系统和应用程序之间安全共享和管理密钥,因此加强密钥管理变得日益重要。

结合最小权限的RBAC原则:基于角色的访问控制(Role-Based Access Control,RBAC)的原则是根据用户在组织中的分配角色或工作职责来授予他们对系统资源的访问权限。在RBAC中,用户被分配角色,该角色定义了他们对各种系统资源(如文件、文件夹或应用程序)的权限和访问权。另一方面,最小权限的原则是授予用户至少权限和访问特权,以执行他们的工作职能所需的最低级别。这意味着用户只能访问他们完成特定任务所需的资源,并且没有其他权限。RBAC和最小权限原则通常一起作为互补的安全原则使用。在RBAC中,用户被分配的角色具有访问所需资源的适当级别,最小权限原则确保用户只能访问执行特定任务所需的最低级别的资源。

这两个原则共同有助于维护一个安全且良好管理的系统,风险最小,未经授权的访问或数据泄漏的风险较小。作为额外的安全措施,您还可以设置特定系统关键操作需要多个用户授权的机制。需要注意的是,由于这种做法可能会显著降低开发工作速度,因此应谨慎使用。但对于关键更新,例如删除主要分支或修改依赖关系列表,至少需要两个拥有适当访问权限的人批准该更新。

展望未来

没有人会停止使用CI/CD和其他自动化工具来加快工作进程。我们生活在一个不断追求更快代码更新的世界中。我们只需要确保以安全意识的方式进行,并不会在追求速度的同时危及我们的代码和生产环境。

您可以做的最重要的事情之一就是认真思考,未经授权的人员如果获取了访问权限会发生什么。一旦您意识到危险和流水线和网络中的不同薄弱点,相信您能够采取正确的步骤来弥补潜在的漏洞。