Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >RSAC解读:如何安全地使用CI_CD工具

RSAC解读:如何安全地使用CI_CD工具

作者头像
绿盟科技研究通讯
发布于 2022-11-14 05:03:42
发布于 2022-11-14 05:03:42
6710
举报

一、概述

2022年的RSA会议上,来自Coalfire的副总裁和首席战略官Dan Cornelld的议题《What Executives Need to Know about CI/CD Pipelines and Supply Chain Security》从使用CI/CD管道的安全性出发,首先向各位观众讲述了什么是CI/CD管道,并提出我们为何需要关注CI/CD使用过程中的安全风险,之后Dan Cornell面向安全从业人员以及DevSecOps实施人员讲述了使用CI/CD需要注意的安全风险,包括源代码仓库安全接入CI/CD管道可能引发的风险,引入第三方开源依赖库的风险,项目代码在构建测试、部署、打包、分发过程中面临的安全风险。最后,Dan Cornell提出了相应的安全建议并给出了未来6个月的具体DecSecOps实施计划。

二、背景

DevOps 全称为 Development & Operations,在 2009 年被提出,其代表的并非一种具体实现技术,而是一种方法论。DevOps 的出现最终目是为了打破开发人员与运维人员之间的壁垒和鸿沟,高效的组织团队通过自动化工具相互协作以完成软件生命周期管理,从而更快且频繁地交付高质量稳定的软件。如果说DevOps理念实现了软件的快速交付、那么CI/CD(Continuous integration & Continuous Delivery & Continuous Deployment)便是实现这一理念的主要方法,CI/CD 的核心概念是持续集成,持续交付,持续部署。依托 CI/CD,应用的整个生命周期(从集成和测试阶段,到交付和部署阶段)可达到持续自动化和持续监控的效果。

如我们所知,DevOps影响的不仅包含开发团队(Dev)和运维团队(Ops),还应包含安全团队(Sec),在系统生命周期(SDLC Systems Development Life Cycle)中,安全团队常聚焦于运营阶段,因而往往忽视了开发阶段的安全,所以“安全左移”的理念在近些年非常的火,其强调安全因素应纳入应用开发的早期阶段,常见的,我们在开发(Dev)与运维(Ops)之间加入安全(Sec),也就是DevSecOps理念,其侧重点是将安全工具自身整合至CI/CD工作流中,且安全工具主要纳入应用的测试、发布和运维阶段。

随着技术的不断发展,用户可采用的CI/CD工具逐渐增多,除了关注工具自身的安全问题之外,如何正确的使用CI/CD管道,关注并及时发现各个阶段存在的安全风险也尤为重要。

三、供应链攻击事件

供应链攻击是一种网络攻击,攻击者可利用软件或硬件来篡改服务程序,针对组织供应链中的薄弱环节实施攻击,从而导致服务程序被破坏。鉴于供应链自身的特性,恶意软件可以安装在供应链的任何阶段,且供应链攻击允许指定目标,若被攻击的供应商有很多客户,则受影响的数量会迅速增加[3]。此外,由于供应链依赖于已被信任并且可以广泛分发的软件,因而供应链攻击很难被检测。

3.1

Solar Winds供应链攻击事件

2020年12月,美国安全公司FireEye爆出有攻击者通过在SolarWinds软件中植入木马程序入侵了公司网络。该木马程序具有合法的数字签名并且伴随着软件的更新下发,借助软件供应链的特性,APT攻击者组织可对目标机构发起未授权访问,达到长期对目标机构的控制,并不断窃取核心数据。事件经历短短一周内就有超过200家重要机构受到影响,其中不乏一些全球科技发达地区的敏感机构,其中美国占比超过60%,包括美国国务院、国土安全部、国防部、财政部在内的多家政府机构均受到此事件的影响,事件影响力可谓巨大[3]。

3.2

Codecov供应链攻击事件

2021年,国外软件审计平台Codecov(该软件常被用于集成至CI/CD工作流中)遭受攻击者攻击,该事件直接导致近3万用户的隐私数据泄漏,究其原因,攻击者主要利用Codecov镜像Dockerfile中的错误配置提取Bash Uploader脚本(用户可通过该脚本上传测试数据)中的访问凭证,进而通过该凭证修改用户的Bash Uploader脚本[2],在长达1000多行的Bash Uploader脚本中添加如下两行代码[1]:

图1 Bash Uploader脚本中注入的恶意代码

可以看出,以上代码会将CI中所有的环境变量发送至第三方服务器,这些环境变量中可能包含Git访问凭证、API Key等敏感信息和密钥,攻击者进一步可以访问通过这些凭证访问的任何服务、数据和应用程序代码,危害巨大。

近两年供应链攻击事件层出不穷,分析并总结背后原因不难看出建立可信的软件开发环境、定期进行安全检查、关注依赖组件的已知漏洞、落实DevSecOps理念的重要性。

四、CI/CD应用过程中需要考虑的安全问题

Dan Cornell举例从数据流的角度看CI/CD管道安全,如下图所示:

图2 CI/CD管道示例图

可以看出示例中的CI/CD管道流程分为以下几个阶段:

1. 开发者提交代码至源码仓库;

2. CI/CD管道流程的构建阶段从源码仓库及开源仓库获取最新提交的代码以及相应依赖的开源组件代码;

3. 构建结束后生成二进制文件,进入测试阶段;

4. 测试阶段包括安全测试、集成测试、单元测试三个部分;

5. 测试完成后进入评估阶段,若测试通过进入后续的打包和分发阶段

上述流程结合一定的安全知识背景,我们可以看出安全风险可能存在于各个阶段,Dan Cornell从信息安全三要素机密性、完整性、可用性的角度阐述了这些风险,如从机密性上来看,主要涉及敏感数据泄露,如IP泄露、密钥泄露、漏洞披露为造成风险的主要因素;从完整性上来看,源代码植入后门、恶意挖矿或是其他恶意行为成为供应链攻击的主要一环;从可用性上来看,功能受到影响导致延迟发布与漏洞修复无法及时推送到生产环境[1] ,最终都会对软件交付产生不同程度的影响。

值得注意的是,随着业务越发复杂,系统架构从单体走向微服务化,CI/CD管道的复杂性也会相应增多,每个阶段都可能会产生大量的敏感数据,这些敏感数据往往会成为巨大的攻击杠杆。试想一旦攻击者拿到了源码仓库的访问凭证,那么整个CI/CD环境都可能遭到沦陷。因此,DevSecOps实施人员需要对数据的最终输出负责,评估软件CI/CD的运行环境,在CI/CD管道的每个阶段评估安全风险,如每一阶段涉及的服务种类、敏感数据、敏感数据存储、敏感数据分级、敏感数据传输加密等。

Dan Cornell从CI/CD使用的角度出发,阐述了各个阶段产生的风险,笔者将其进行了汇总,主要分为以下五部分。

4.1

CI/CD管道接入源码仓库的风险

通常情况下,CI/CD工具根据用户自定义的管道流程,在开发者进行git push或git pull等操作时触发接入源码仓库,在接入过程中由于源码仓库自身提供多种接入方式,进而扩大了风险面,下图展示了Gitlab提供的几种访问途径:

图3 源码仓库访问途径

可以看出除了常规的源码访问(push/pull/merge request等)、Web访问以及API访问,Gitlab还提供Webhook访问。在第三方开发团队对源码仓库进行push/pull操作时,若未对源码仓库接入进行有效认证,则可能会导致本地代码在CI/CD以外的环境中运行,进而造成源码不可控的风险。

4.2

引入第三方开源组件的风险

关于引入第三方开源组件的风险,通常包含以下四部分内容。

4.2.1

开源组件自身漏洞导致的风险

许多开源组件自身存在漏洞,不同风险级别的漏洞会导致CI/CD环境面临不同程度风险,例如若开源组件存在RCE漏洞,攻击者则可能利用该漏洞获取CI/CD管道中的环境变量,进而获取Gitlab或Github的有效访问凭证,最终接管整个源码仓库,引起巨大风险。

4.2.2

不安全的开源组件管理导致的风险

在CI/CD管道中,我们通常会引入第三方开源组件对项目依赖项进行构建管理。例如Java项目中,通常会引入Maven仓库,若我们的项目直接从Maven中央仓库进行拉取,我们就无法确定是否引入了含有漏洞的组件,进而可能导致组件漏洞被攻击者利用的风险。

4.2.3

攻击者为开源组件添加后门程序导致的风险

若攻击者拥有访问开源组件仓库的权限,进而可以通过为开源组件添加恶意后门程序,之后重新对外发布的形式,引发大规模供应链攻击的风险。若用户的项目源码中引入了含有后门的开源组件,攻击者则有可能利用该漏洞对CI/CD环境进行探测,进而导致整个环境沦陷的风险。

4.2.4

开源软件许可证导致的风险

开源组件的许可证类别较多,如常见的Apache License、MIT是相对宽容的许可证,这些许可证通常没有真正的限制条件,若将相应的开源组件引入自己开发的项目,并对外发布,仅需保留版权声明即可,不会面临使用上的法律风险。除此之外,还有一些顶级的开源许可证,例如GPL 3.0 和AGPL,其为限制性的许可证,若引入了相应开源组件并进行商用,则会面临法律风险。

4.3

构建阶段的风险

构建阶段,CI/CD管道通常会引入插件对源码以及第三方开源组件代码进行构建,该插件实际上也运行在CI/CD环境中,对于开发者而言,插件是不受信任的,含有漏洞的插件可能被攻击者利用进而访问到CI/CD管道中产生的数据,并将数据传送至第三方服务器,如3.2中提出的Codecov供应链事件影响,受害者下载了攻击者精心注入恶意代码的文件,导致CI/CD中的环境变量泄露,攻击者可以利用这些环境变量窃取受害者隐私数据,造成巨大影响。

4.4

测试阶段的风险

自动化测试是CI/CD管道中必经的一环,自动化测试常包含集成测试、单元测试、安全测试这几类流程,CI/CD工具会调用测试插件(可能来自CI/CD环境外部或内部)进行测试,例如Gitlab的CI/CD管道默认支持引入开源代码审计工具bundler-audit、gemnasium等,这些开源工具是否可信是我们需要关注的重点,如测试阶段产生的流量是在CI/CD环境内部还是外部,若是外部将不受DevSecOps实施者的控制,可能进而会导致测试流量被代理到第三方服务器的风险,再如当测试阶段完成后,测试结果最终存储在哪里,若存储在外部,也会导致数据泄露的风险。

此外,风险漏洞管理也十分关键,如当Gitlab进行镜像扫描后产生了一系列待修复的漏洞,谁拥有什么权限访问这些漏洞很重要,若管理员分配了错误的权限,则可能导致未授权访问的风险,这里的未授权访问主要针对的是第三方团队的开发人员。

4.5

打包和分发阶段的风险

经历测试阶段后,CI/CD管道会评估最新的测试结果,一旦测试通过会将软件进行打包以及后续的分发,此处以微服务架构的项目举例,打包阶段时,各个微服务通过Dockerfile文件进行镜像构建,并进行签名后将镜像上传至仓库。分发部署阶段时,Kubernetes会从镜像仓库中拉取最新版本的镜像以完成后续部署。以上过程中可能会产生一定的风险,主要包括以下两方面:

镜像自身内容引发的风险

若业务镜像依赖的基础镜像含有漏洞,可能导致攻击者利用已知漏洞对服务自身或其他微服务发起攻击,若镜像中的应用代码含有漏洞,也将会导致被攻击者利用的可能。

镜像分发过程引发的风险

由于CI/CD与Kubernetes可能不在同一环境,因而可能导致攻击者在分发过程中趁虚而入,利用镜像来源的不确定性(恶意镜像签名)对镜像的传输过程进行劫持,并替换成恶意镜像,亦或是对镜像仓库直接发起攻击,造成巨大影响。

五、面向CI/CD使用者的安全建议

在本次RSA演讲中,Dan Cornell面向CI/CD使用者提出了一些安全建议,

笔者将其进行了汇总,主要包含以下几部分:

针对4.1提出的风险,建议DevSecOps实施人员在CI/CD管道与源码仓库的接入上做好认证管理,并能够清晰的了解到项目源码的所处地,做好源码安全管控。

针对4.2提出的风险,建议首先梳理项目中所有依赖的开源组件,可通过SBOM(Software Bill of Materials)进行梳理,并采用SCA(Software Components Analysis)工具对开源组件进行漏洞扫描。其次,当项目中引入了新的开源组件,能够具备针对性的安全管控措施。最后,引入扫描组件的自身风险范围也应达到可控。

针对4.3提出的风险,建议对构建过程中的插件来源、插件需要访问的数据、数据最终的传送地进行确认,同时注意构建的频率是否异常。

针对4.4提出的风险,建议首先确认测试阶段是否包含第三方团队,若包含则需要确定测试产生的流量以及测试结果的最终去处。其次,需要确认扫描工具自身的安全性,做好实时修复漏洞的准备。最后,风险漏洞管理需要给予用户适当访问权限,遵循最小权限原则。

针对4.5提出的风险,建议首先从可靠源下载容器镜像,并定时对镜像进行漏洞扫描、漏洞修复以及后续的漏洞管理。其次,针对镜像构建过程进行签名,镜像拉取过程进行签名校验。最后,做好镜像仓库的安全管理,为镜像仓库用户分配合理访问项目的权限。

六、总结

从近年RSA议题及创新沙盒入围的安全初创公司来看,DevSecOps已成为一项必不可少的话题,从最初的DevOps到安全左移的DevSecOps理念,这一过程必然会引起相应技术以及用户使用行为上的变革,将安全部分纳入DevOps并不难,难的是如何充分的践行DevSecOps理念,如我们所知,开发人员和运维人员通常没有安全背景,如何让其安全地使用CI/CD工具是一大问题,Dan Cornell的议题分享较为全面的阐述了使用CI/CD工具过程中需要注意的安全风险,并针对这些风险提出了相应的安全建议,可为各企业在DevSecOps的实际落地过程中提供一定参考。

参考文献

[1] https://blog.gitguardian.com/codecov-supply-chain-breach/#what-happened-quick-timeline-of-events

[2] https://gist.github.com/davidrans/ca6e9ffa5865983d9f6aa00b7a4a1d10

[3] 北京金融科技产业联盟《供应链攻击安全启示 - SolarWinds事件分析》

内容编辑:创新研究院 浦 明

责任编辑:创新研究院 顾 奇

本公众号原创文章仅代表作者观点,不代表绿盟科技立场。所有原创内容版权均属绿盟科技研究通讯。未经授权,严禁任何媒体以及微信公众号复制、转载、摘编或以其他方式使用,转载须注明来自绿盟科技研究通讯并附上本文链接。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-07-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 绿盟科技研究通讯 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
如何实现接口之间参数加密传输 - RSA算法对接口参数签名及验签
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
用户1212940
2019/11/02
3K0
RSA的java实现
RSA非对称加密整理 辅助类 package net.yun10000.zf.util; import Java.security.interfaces.RSAPrivateKey; import java.security.interfaces.RSAPublicKey; public class RSAKeys { private RSAPublicKey publicKey; private RSAPrivateKey privateKey; public RSAPublicKey g
东营浪人
2019/09/05
7430
【Java小工匠聊密码学】--数字签名-DSA
DSA(Digital Signature Algorithm)是Schnorr和ElGamal签名算法的变种,被美国NIST作为数字签名标准(DigitalSignature Standard)。
Java小工匠
2018/08/10
6620
Java使用RSA加密解密签名及校验
再来一个Base64的类,当然你也可以用commons-codec-1.9.jar
全栈程序员站长
2021/04/13
4.4K0
Java使用RSA加密解密签名及校验
学一学RSA加密吧,下次对接的时候就不会被对方Diss了
RSA加密算法:是一种非对称加密算法,它需要两个密钥,一个是公开密钥,另一个是私有密钥;公钥用作加密,私钥则用作解密。只能用相对应的私钥才能解密并得到原本的明文,最初用来加密的公钥不能用作解密,加密和解密需要两个不同的密钥,因此被称为非对称加密,加密的双方在开发前根据明文的长度/数据加密等级需要协定好密钥的位数,目前可使用1024、2048、4096字节的密钥(key),安全性随字节长度升高而升高,性能随之而下降,时间复杂度为O(nlogn)。
关忆北.
2021/12/07
1.2K0
RSA加密解密(无数据大小限制,php、go、java互通实现)
RSA加解密中必须考虑到的密钥长度、明文长度和密文长度问题。明文长度需要小于密钥长度,而密文长度则等于密钥长度。因此当加密内容长度大于密钥长度时,有效的RSA加解密就需要对内容进行分段。
双鬼带单
2019/07/30
5K0
数据安全RSA算法,加密解密,签名验签流程详解
(1)、乙方生成一对密钥即公钥和私钥,私钥不公开,乙方自己持有,公钥为公开,甲方持有。
知了一笑
2019/10/23
2.2K0
数据安全RSA算法,加密解密,签名验签流程详解
国家专用加密数据传输之rsa,3des加密方法
公司项目需要对接国家市抽(器检市抽)表示必须使用3des加密来data(响应重要数据)以及使用rsa进行验证签名。
杨不易呀
2022/01/18
1.4K0
国家专用加密数据传输之rsa,3des加密方法
Java加密与解密之非对称加密算法
非对称加密算法与对称加密算法的主要差别在于非对称加密算法用于加密和解密的密钥不相同,非对称加密算法密钥分为公钥和私钥,公钥加密只能用私钥解密,反之私钥加密只能用公钥解密。相比对称加密算法,非对称加密算法加/解密效率低,但安全性高,这两种算法一般结合使用。常见非对称加密算法有RSA、ECC、Elgamal等。
布禾
2020/11/24
1.2K0
java RSA 解密
import org.apache.commons.codec.binary.Base64; import javax.crypto.Cipher; import java.security.*; import java.security.interfaces.RSAPrivateKey; import java.security.interfaces.RSAPublicKey; import java.security.spec.PKCS8EncodedKeySpec; import java.secu
FHAdmin
2021/09/10
2.3K0
【深度知识】RSA加密、解密、签名、验签的原理及方法
RSA加密是一种非对称加密。可以在不直接传递密钥的情况下,完成解密。者能够确保信息的安全性,避免了直接传递密钥所造成的被破解的风险。是由一对密钥来进行加解密的过程,分别称之为公钥和私钥。如果用公钥进行加密,则只能通过对应的私钥去解密,如果用私钥进行加密,则只能通过对应的公钥去解密。两者之间有数字相关,该加密发酸的原理就是对一极大整数做因数分解的困难行来保证安全性。通常个人保存私钥,公钥是公开的(可能同时多人持有)
辉哥
2021/03/02
6.5K0
【深度知识】RSA加密、解密、签名、验签的原理及方法
快速了解常用的非对称加密算法,再也不用担心面试官的刨根问底
加密算法通常被分为两种:对称加密算法和非对称加密算法。其中,对称加密算法在加密和解密时使用的密钥相同;非对称加密算法在加密和解密时使用的密钥不同,分为公钥和私钥。此外,还有一类叫做消息摘要算法,是对数据进行摘要并且不可逆的算法。
万猫学社
2022/04/22
1.6K0
快速了解常用的非对称加密算法,再也不用担心面试官的刨根问底
【Java小工匠聊密码学】--非对称加密--DH密钥交换算法
Diffie-Hellman由Whitfield Diffie和Martin Hellman在1976年公布的一种密钥一致性算法。Diffie-Hellman是一种建立密钥的方法,而不是加密方法。然而,它所产生的密钥可用于加密、进一步的密钥管理或任何其它的加密方式。Diffie-Hellman密钥交换算法及其优化首次发表的公开密钥算法出现在Diffie和Hellman的论文中,这篇影响深远的论文奠定了公开密钥密码编码学。
Java小工匠
2018/08/10
1.3K0
【Java小工匠聊密码学】--非对称加密--DH密钥交换算法
【Java小工匠聊密码学】--非对称加密--RSA1
  RSA加密算法是一种非对称加密算法。在公开密钥加密和电子商业中RSA被广泛使用。RSA是1977年由罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的。当时他们三人都在麻省理工学院工作。RSA就是他们三人姓氏开头字母拼在一起组成的。   对极大整数做因数分解的难度决定了RSA算法的可靠性。换言之,对一极大整数做因数分解愈困难,RSA算法愈可靠。假如有人找到一种快速因数分解的算法的话,那么用RSA加密的信息的可靠性就肯定会极度下降。但找到这样的算法的可能性是非常小的。今天只有短的RSA钥匙才可能被强力方式解破。到目前为止,世界上还没有任何可靠的攻击RSA算法的方式。只要其钥匙的长度足够长,用RSA加密的信息实际上是不能被解破的。
Java小工匠
2018/08/10
8040
springboot整合RSA进行sign签名校验
1.RSA工具代码 package com.unwulian.common.sign; /* --------------------------------------------**********-------------------------------------------- 该算法于1977年由美国麻省理工学院MIT(Massachusetts Institute of Technology)的Ronal Rivest,Adi Shamir和Len Adleman三位年轻教授提出,并
用户5927264
2020/07/27
2.3K0
RSA 非对称加密原理(小白也能看懂哦~)
RSA 加密原理 步骤 说明 描述 备注 1 找出质数 P 、Q - 2 计算公共模数 N = P * Q - 3 欧拉函数 φ(N) = (P-1)(Q-1) - 4 计算公钥E 1 < E < φ(N) E的取值必须是整数 E 和 φ(N) 必须是互质数 5 计算私钥D E * D % φ(N) = 1 - 6 加密 C = M E mod N C:密文 M:明文 7 解密 M =C D mod N C:密文 M:明文 公钥=(E , N) 私钥=(D, N) 对外,我们只暴露公钥。 示例 1、
java404
2018/05/18
6.5K2
区块链基础:非对称算法
1.Hash算法 package cn.hadron.security; import java.security.MessageDigest; import java.util.UUID; import org.eclipse.jetty.util.security.Credential.MD5; /** * crypto['krɪptoʊ]秘密成员, * 一些语言的crypto模块的目的是为了提供通用的加密和哈希算法 * 加密工具类 */ public class CryptoUtil
程裕强
2022/05/06
3840
区块链基础:非对称算法
加密-解密详解
参考视频: https://www.bilibili.com/video/BV1tz4y197hm
用户5927264
2020/07/30
2.8K0
JAVA使用几种非对称加密
DH: package com.fengyunhe.asymmetric; import com.sun.org.apache.xerces.internal.impl.dv.util.HexBin; import javax.crypto.*; import javax.crypto.interfaces.DHPublicKey; import javax.crypto.spec.DHParameterSpec; import java.security.*; import java.security
前Thoughtworks-杨焱
2021/12/08
4510
使用RSA算法对接口参数签名及验签
在不同的服务器或系统之间通过API接口进行交互时,两个系统之间必须进行身份的验证,以满足安全上的防抵赖和防篡改。
端碗吹水
2020/09/23
1.7K0
使用RSA算法对接口参数签名及验签
相关推荐
如何实现接口之间参数加密传输 - RSA算法对接口参数签名及验签
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档