本文基于serverless,主要针对中小项目,寻求具有普惠性质的安全方案。因为作者对腾讯云的实践经验多,解决的策略建议也以腾讯云为例,阿里云同理,可能只是功能的名字不同而已,但是其效果相同。
云原生(Serverless)将我们带进入了新时代,也就是下一代的计算平台。
传统的安全是基于边界防护的网络安全架构,是以职能区分、以人为主的防护策略安全,这已经不太能满足云原生的安全需求,云原生时代物理安全边界逐渐模糊,需要基于动态工作负载完成安全防护,变成了人人有责、无处不在的云原生安全体系。
传统安全主要是在右侧,云原生最大的特点是要求安全左移也就是安全前置,在开发的过程中就要考虑安全,将安全投资更多的放到开发安全,包括安全编码、供应链(软件库、开源软件等)安全、镜像及镜像仓库安全等,因此传统策略很多已经不再适用,对人员的安全意识和安全技能产生了额外要求。
很多技术人员认为技术才能保障安全,其实意识才是安全的最大保障。想想建国初期人人抓特务,想想朝阳区人民群众。
云原生改变了设施,我们不再是直接对CVM等传统硬件设施进行管理,而是部署于“执行环境”即屏蔽了传统硬件设施的“软资产”,如果说传统设施是有形资产的话,云原生的设施是“无形资源”。
因此云原生的安全应该主要由服务商来承担,内嵌于云平台,交付给我们的是基础安全的环境,我们只需要聚焦于业务相关的、少量的和高级的防护。云服务商可以使用超大型、大规模的安全策略和机制作用在整体的云原生上,我们是云原生环境的单个客户,平均下来单个企业安全成本很低的同时达到良好的效果。
我认为,云原生重塑了云服务商的安全体系的商业模式。
比如,腾讯云的API网关触发器的云函数,基础安全主要应该由API网关和云函数侧来负责,客户是需要重视并灵活使用安全配置提升安全系数,防御腾讯整体安全下的漏网之鱼。
云原生安全和传统安全并不同
安全有了新特点,那么他必然有独特的新要求。
项目的安全是为了保障在其商业价值实现过程中不被阻断。我们首先要明确一点:不能简单的追求安全的高度,安全本身也要高效和普惠,要降低中小企业安全负担,大负担、高成本的云安全是不适用的。
应该根据实际情况, 用合理的代价和恰当的方式让项目更安全,因此对于中小项目,必须在技术、成本和效果上有自己的取舍。比如业务开发周期都被疯狂压缩的项目中,是很难照顾并嵌入安全的。
安全方案不能一味追求技术和全面,能够被应用、可落地安全方案才是好方案。
安全方案要四化:框架化、轻量化、模块化、精细化。
框架化:安全功能尽量整合到框架中或提供成库。安全左移强制要求开发人员必须参与并进行编码,而开发人员更注重能给项目进度带来实质帮助的业务开发(除非公司绩效对安全进行考评,且与进度权重相同),因此在保证安全机制可以应用的前提下,给开发人员减负降低安全时间成本,安全的工作量越大越难落地,越容易产生偷懒情况。
轻量化:方案越重、上手难度越大越难以实施,聚焦核心需求的轻量方案更好落地。
精细化:serverless不同于传统安全,安全的管理必须精细到各个函数或API才能有效的进行安全防护,在serverless中,一篮子安全管理就是没安全。
模块化:安全应该可以便捷动态的开启和关闭,若安全机制较大的阻碍了进度(如测试的推进),会导致人员的抵制及项目商业价值的实现,因此模块化的安全就显得比较重要。
左移的必要性:云原生就是用完即走,资源配置动态化和快速快速消亡化, 时间达到了毫秒级, 这就要求安全的检测和反应近乎于实时,外置和后置的安全很难达到这种要求,因此安全需要做到代码内置。
开发团队不仅要考虑高效地构建产品,还在构建时实施安全性,因此安全性从一开始就成为开发流程不可分割的组成部分,最初的设计到集成、测试、部署直至软件交付。对于项目成员来说就是人人为云安全负责, 也就是DevSecOps。
建议:安全性应该嵌入框架,融合到项目管理和项目进度中并为其预估工作量,不预留工作量会让成员抵触安全,并让安全流于形式,后期嵌入和追加安全的代价高昂,会让是否要安全成为两难的决策。
DevSecOps=Sec+DevOps, “左移”是 DevSecOps 的一种说法: 它鼓励软件工程师将安全性从DevOps(交付)流程的右侧(末尾)移至左侧(开头)。
云原生的框架模式注重以服务为基础的细粒度拆分,serverless显著增加了服务的数量,打造了以服务为基础的新型应用模式,serverless未来也一定是细粒度拆分为主流(请注意,这里不是内涵腾讯云哈),但这个也给云原生带来了新的风险。
比如好像是20年还是21年的腾讯云的一个安全宣讲中提到“云原生安全是他们一个重点研究方向,未来他们会将云安全能力接入云函数”,潜台词就是现在还没有接入(到目前为止是否接入无明确信息确认)。当前云函数安全还是很薄弱,腾讯云现有云安全尚无消息确认已经应用在云函数。
腾讯云的serverless安全
2. Key的泄露:云原生应用对资源和设施的管理和使用基本都是基于Key,因此针对云原生的攻击首先的变化就是对key的攻击。根据统计,用户的api key无意泄露在github等网站其实是很常见的,因此有黑客专门去这些网站扫描无意提交的key信息。云服务商为了应对这种新攻击,基本都与GitHub这些主流的网站进行合作,主动扫描发现这些泄露的key并及时通知其客户消除风险。
北卡罗莱纳州立大学的一篇研究报告则直接指出,“我们在涉及到的10万开源项目中发现,凭证泄漏问题不是一次性偶然问题,而是每天都在发生的,有数千新的、不重复的机密凭证公布到了网站”
3. 云原生配置风险: Serverless使用的资产是品类多、动态的、用完即走的, 各种安全配置分散在各个产品中,缺乏统一管理和运维平台,难以做到管理和检查,从而导致配置安全和隐患,配置安全这个是容易被忽略的。多产品联动已经足够困难,更棘手的是,不少项目会跨厂商联动,比如组合了阿里云、腾讯云、高德开放平台、百度云等的产品,造成难度系数陡增。
不认真进行安全配置 就如同买了高昂的防盗门但出门却把钥匙插门锁上一样。亚马逊报告称数据泄露70%是权限配置不当造成的, 因此云安全提升了额外要求,就是云产品的配置学习, 这个也是最容易忽略出错的。
3. 资产多:采用云原生的时候,资产比较隐蔽变化也快,这个需要云服务商多多工作,同时跨厂商的使用让复杂度也更提升
4. API风险:serverless是细粒度的服务,他的安全重点也就是API安全,如API异常调用、越权操作、违规调用。
5. 内部审计风险:云服务商的Serverless无法保障细粒度的操作的记录和安全性,如更新代码人员、部署新服务人员、删除函数人员等,或要想实现付出的成本很高昂。
6. 功能天然风险:当前包括腾讯云的云函数在内的主流serverless云服务商,都提供了镜像部署和代码部署两种方式。在安全方面,镜像部署面临更多的安全风险(如镜像安全风险、镜像仓库安全风险)。
7. 安全变量风险:若将配置或敏感信息保存在环境变量,一旦被突破这些信息直接泄露、被修改甚至被利用。建议:少用或不用环境变量, 因此复杂的环境配置而导致必须用镜像部署的, 应该考虑将各种环境变量配置使用配置文件
8. 攻击面广:serverless中微服务模式部署有着其先天的优势而一定成为主流,但微服务随之带来了新的风险,可供攻击的面也更广泛;建议:采用“零信任”的理念来处理每次的访问的安全防御。
9. 环境变量风险:使用环境变量替代配置文件虽然存储更简单,但是使用环境变量本就是不安全行为,攻击者进入运行环境,可以轻易获取、修改环境变量信息,引发信息泄露。 腾讯云的文档做的就不好,竟然有把数据库的账号密码配置在环境变量
腾讯云的云函数文档
10. 资源权限管控风险:传统的基础设施是静态的,serverless中基础设施的出现和使用是函数级动态的,因此每个函数与资源的权限映射会非常多,如何高效进行角色和权限的管控是个复杂问题,很多开发者暴力为所有函数配置单一角色和权限,这一行为极大增加函数使用风险。
11. 跨函数调用数据清理不及时引入数据泄露风险:在运行过程中,调用结束后没有及时清除暂存的配置参数、账号信息或其他业务敏感信息,后续调用的函数访问时,可能存在越权和获取机密数据的情况。在“单实例多并发”或“请求多并发”功能的加持下,这个风险又会额外增加。建议:函数执行时,不要偷懒直接复用当前已经存在的文件、内存变量、配置信息等,而是每次都应该视为全新使用,有临时存储的需求时,必须检测操作的成功与否,以免误用历史信息。
12. 缺乏serverless专有安全解决方案:现在的安全工具和安全体系是基于云场景中的虚拟机或容器底座,基于web应用或传统框架进行设计开发和应用的。在servless上这些无法直接匹配或使用。
13. 钱包攻击:传统攻击以阻塞业务为目标,serverless的安全性让攻击者无法阻塞其业务,只能转而进行钱包攻击。
建议:
关于平台依赖性:很多人将平台耦合作为项目风险。虽然业务代码追求平台松耦合,但Serverless的安全首先靠云服务商做第一道,再靠各产品的安全配置,serverless的安全很难通过外挂形态解决,而是寻求云集成方法,因此有着很强的平台依赖性。
与云原生平台深度的耦合,提供新型云原生信息基础设施的防护、检测和响应能力,并将云原生技术赋能于这些安全产品、应用和解决方案;因此虽然这是风险,但我认为根本不是目前应该考虑的风险,真正云原生的项目还处于起步期,更重要的是培养人员新的安全意识,探索可落地的安全方案和机制。当前只有较少的项目将一个平台的特性充分发挥出来了,在这种还很缺乏意识、高效、深度、使用前提下, 讲究跨平台是不理智的。
不能一味追求接耦合平台,除非有大神将主流云服务商的平台安全机制进行封装。
以devops为代表的研发运营体系,专注敏捷迭代。传统安全侧重以人为主的防护策略,已经不能满足云原生实例频繁启停的生命周期变化及海量的东西向流量交互,我们需要新的安全设计原则。
一个基础、一个中心、六个基本点:
一个基础:我们在上面了解了云原生是特有风险,因此要以云原生的思路为基础构建安全运营体系,而不是传统的体系直接搬过来。
一个中心:以服务为中心构建安全防护措施,我们防护的是服务,不是硬件设施也无硬件设施。
六个基本点:
上面说的都是云原生的隐患,我们来说说云原生比传统的安全优势。
在网络攻击中,以攻击带宽或CPU资源的DDoS攻击是使用最广、最泛滥的攻击方式,我们将此攻击单独进行说明。
DDoS基本是低端的买流量攻击,只是不断发生请求,不会大量机器联动进行顺序攻击。在腾讯安全发布的《2021年上半年全球DDoS威胁报告》中统计的六种攻击手法,除了仅占用了5%比例的”其他”外,主流手法对serverless而言并不会怎么生效,有天然的防御优势。
DDoS的一般攻击并不分析业务 只是通过发送大量请求,来达到攻击带宽或CPU的目的。
DDoS是以IP、域名为重要目标进行拒绝服务攻击,因此防御DDoS的重要一条就是不能直接用IP,因此最近最出名的“某游戏”被攻击后难以防御的一个重要原因是他们客户端直接使用IP连接了服务器。
以腾讯云的云函数为例,每个云函数配置的API网关触发器本身会分配一个腾讯云的二级域名,对于APP和小程序来说我们可以直接使用这些域名。当我们使用这些域名的时候, DDoS攻击是落在这些域名上,这些域名由腾讯云管理,那么他们在承担响应的安全,因此大多的攻击方式并不会进入到我们的serverless中。
传统的DDoS攻击难以奏效,且好像并未针对serverless进行攻击手法特别优化。
因此当前针对serverless的攻击更多是传统攻击手段中的“模拟业务流量的高级攻击”,且攻击带宽和CPU改为DoW攻击。
DoW攻击(拒绝钱包攻击),其目的是耗尽账户账单金额。 因为serverless多按照次数等付费,这个特性让产生的费用没有特定限制,如果攻击者掌握了事件触发器,在未受保护情况下,函数调用会极速扩展,随之产生的费用也爆发式增长,最终倒是账户受到重大损失。
虽然有着良好的防DDoS攻击天然优势,我们不能因此就麻痹大意,防御建议:
遭遇攻击 只返回正常业务,所有鉴别出错的都不返回任何信息。只要不触发云服务商的丢包就不怕,cls鉴别IP自己取消返回,还不影响自己的数据库性能(必须配合bot头日志输出)
他是抵御模拟业务流量攻击的利器,零信任不是产品、不是体系架构,他是一种理念,使用方法取决于你自己。
一句话了解零信任:一切都不是安全的。
最初的零信任框架模型是由著名研究机构Forrester的首席分析师John Kindervag在2010年提出的,在Google的BeyondCorp项目中得到了应用后发展到国内。
零信任的核心思想可以概括为:一切都不是安全的,也就是永不信任,始终验证,授权时则必须最小授权,阻止权限突破。
如腾讯云中涉及cos的使用、API网关的使用,不管他的角色和操作是不是合法的,只通过CAM的策略机制分配一个最低权限的临时key使用。
零信任的范畴大,涉及面广,因此在serverless中应用零信任,需要对其进行收缩修改,直接使用成本太高且不见得实用。
Google的零信任体系的基础设施是身份,根据身份做权限管控持续的不信任,在Serverless中零信任的基础设施是函数级的业务,我们根据此函数的业务给与最低权限和最小的资源。
腾讯云的”联合身份临时访问凭证”是腾讯云中实现“零信任”的核心,它是基于CAM的,他们复杂、繁琐、易出错真的不像是现代设计出来的,更像是上个时代的产物。
这个"联合身份临时访问凭证”的生成是需要代价的,若创建函数,则同时还需要赋予触发器权限或API网关权限, 腾讯云的CAM很复杂不单是语法复杂,其涉及产品关联复杂,对于没有云原生全栈经验的中小项目来说,其学习和开发成本不亚于一个核心开发,并且也容易在使用过程中遭遇权限限制阻碍项目进度, 说不准就会项目进行一半就抛弃CAM开始摆烂,因此将其应用也是一个很大的挑战。因此我们需要将其封装,提供适合项目的更便捷的无需学习的方法(如借鉴Linux的777的权限机制),这样就极低成本实现了0信任。
至此我们serverless的安全介绍就结束了,后面我会根据devops的路径的各个环节来说下如何落地。
本文借鉴引用的文章如下(包含且不仅含, 资料查询的较多,难以一一列举):
2020年全球DDoS威胁报告 - 腾讯云
2021年上半年全球DDoS威胁报告 - 腾讯云
2021年云原生架构安全白皮书 - 云原生产业联盟
零信任的发展及其在远程访问中的应用 - Omdia
云原生安全白皮书技术详解 - 中国信息通信研究院云大所副所长 栗蔚
如何构建云时代的云原生安全运营中心?- 耿琛 腾讯安全高级工程师
云原生安全云防火墙核心能力与最佳实践 - 周荃 腾讯安全云防火墙产品负责人
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。