通过现代应用程序开发提高安全性
关键字: [Amazon Web Services re:Invent 2023, 亚马逊云科技, Amazon CodeGuru Security, Modern Application Development, Software Release Cycle, Infrastructure Management, Distributed Applications, Infrastructure Security]
本文字数: 2900, 阅读完需: 14 分钟
导读
在本论坛中,我们将探讨现代应用程序开发中采用的安全实践,以及这些实践如何解决遗留应用程序中常见的安全挑战。论坛将阐述在开发生命周期的早期阶段集成安全性、在容器化和无服务器应用程序的各个层面应用安全性、执行API安全性、实施安全编码实践等模式。通过采纳这些实践,现代应用程序开发可以加快软件交付并增强安全态势。
演讲精华
以下是小编为您整理的本次演讲的精华,共2600字,阅读时间大约是13分钟。
在当代应用程序开发领域,出现了一种变革性的方法,不仅加快了软件交付速度,还增强了应用程序的可靠性、可扩展性和安全性。本次会议将通过当代应用程序开发实践的视角,深入探讨如何通过改进来提高安全性。
首先,将现代应用程序开发定义为一种整体方法,包括应用程序的设计、构建和管理。其核心原则是在提高软件交付速度的同时,同时增强应用程序本身的弹性、可扩展性和安全态势。这种方法的好处是多方面的,但就本次讨论而言,将主要关注现代应用程序开发的安全方面。
本次会议将围绕三个关键领域进行,每个领域都将提供宝贵的见解和可操作的收获。首先,将探讨软件发布周期及其与应用程序安全性的内在关系,深入研究软件开发的复杂性。其次,将研究基础设施管理对第一个领域的深远影响。最后,将进入分布式应用程序架构的领域,并探讨相应的基础设施安全考虑因素。
在传统的应用程序开发中,手动软件发布流程是常见的做法。开发人员和运营团队通常在孤立的环境中工作,手动构建、测试和部署软件更改。这种手动交互需要手动批准和交接,使得整个过程缓慢、容易出错且资源密集。从安全角度来看,这种方法需要更大的努力来识别潜在的漏洞,而较慢的部署节奏则会阻碍及时应用安全修复的能力,导致应用程序长期处于不安全状态。
与传统应用程序开发方法形成鲜明对比的是,现代应用程序开发方法利用了自动化流水线(亦称为CI/CD(持续集成、持续部署和持续交付)流水线)的强大功能。这些流水线协调了开发生命周期,自动构建、测试和推出代码更改。这种方法的好处多方面:它不仅加快了交付速度,而且还强化了一致性,从而减少了人为错误和失误。自动化有助于在部署之前识别安全问题,从而降低了将不安全代码部署到生产环境中的风险。此外,它还能够更快地修复漏洞并及时修补在检测到漏洞时的漏洞。
传统上,安全测试通常被推迟到开发生命周期的最后阶段,这是开发团队将安全视为障碍或阻碍的一种表现。这种做法培养了一种被动的文化,只有在问题发生后才匆忙修复,导致延迟、大量返工,甚至可能需要放弃最初的工作,重新构建更安全的解决方案。缺乏统一的、主动的安全方法可能会导致不一致和无效的安全措施。
现代应用程序开发采用了”向左移动安全”的概念,即将安全考虑提前到流程的早期阶段,甚至在最初的编码阶段。这种方法使开发团队能够比等到最后时才发现安全漏洞要早得多地识别和解决安全漏洞。威胁或安全问题的缓解成本随着在软件开发生命周期中发现的时间越晚而呈指数级增长。在软件生命周期的最初阶段实施的早期检测,不仅能够实现更快速和更安全的软件发布,而且还能防止浪费开发时间和返工,从而降低了在流程后期发现缺陷时修复的成本。
安全不仅仅是工具和测试的问题,它也是一个人员和所有权文化的问题。许多客户表示,扩大安全知识一直是一个挑战,亚马逊云科技也面临着同样的挑战。在亚马逊云科技,所有权是一个优先考虑的领导原则,亚马逊云科技坚信每个人都是安全的所有者。
在一方面,服务团队或构建团队人数达数百人,各自负责其服务的安全性。他们编写代码、构建软件、部署和运营,并对其安全性负全责。另一方面,一个中央安全团队负责整个组织的安全性,同时也作为业务的推动者。
亚马逊云科技通过一种称为安全卫士(Security Guardian)计划的机制来解决扩展安全性的挑战。安全卫士是现有构建团队中受过培训的安全倡导者,一些客户称他们为安全专家。该计划已在之前的reinvent会议上讨论过,包括所跟踪的指标、观察到的效率提升以及整体影响。
本次会议强调,通过利用各种工具、流程和自动化来获得更早的安全审查反馈,可以在应用程序开发生命周期的每个步骤中改善安全性。该过程从作者阶段的威胁建模开始,有助于在编写代码之前识别风险和安全问题。威胁建模回答了”会出现什么问题?“这个问题,并在定义需求和设计功能时开始,从而考虑潜在问题并设计适当的风险缓解解决方案。
在作者阶段,开发人员处理功能请求或任务,通常需要编写安全代码。培训、知识共享、同行评审和集成开发环境(IDE)中的本地安全检查可以帮助实现这一目标。此外,亚马逊云科技最近推出了CodeWhisperer,这是一款基于人工智能的工具,可通过在IDE中提供实时代码建议和可操作的安全性发现,与Amazon CodeGuru集成,帮助开发人员更快、更安全地编写代码。
进入源代码阶段,源代码被检入,可以采用同行评审、静态分析(例如静态应用程序安全测试或SAST)和Git Secrets(用于检测敏感数据)等工具。Amazon CodeGuru Security是一种静态应用程序安全工具,利用机器学习检测安全策略违规和漏洞,可以集成到这个阶段。
在构建阶段,代码被编译、进行单元测试,并创建可部署的工件或镜像。在此阶段,可以实施额外的安全检查,包括分析软件中已知的漏洞、评估开源或第三方组件的 CVE(常见漏洞和暴露)、以及生成软件材料清单(SBOM),以了解组织内部的软件环境。可以利用 Amazon Inspector 服务,该服务可以近乎实时地检测 EC2 实例、Lambda 函数和存储在 Amazon Elastic Container Registry (ECR) 中的容器镜像的软件漏洞和意外的网络暴露。
在测试阶段,进行与其他系统的集成测试,并将应用程序部署到各种环境(如开发、测试、预生产环境)。在此阶段,动态应用程序安全测试(DAST)发挥作用。DAST 涉及与正在运行的应用程序交互、发送数据包,并推断潜在风险,补充了之前进行的静态分析。
在部署阶段,应用程序被部署到生产环境,通常先进行小规模推广,然后再进行更广泛的部署。利用 Amazon Inspector 等工具进行持续监控,可以检测安全问题,从而使构建团队能够推送更新并缓解风险,而无需直接接触生产环境。
管道将人员、流程和自动化结合在一起,实现安全左移,并在整个软件开发生命周期中提供安全检查。然而,这并非终点。同样的原则也可以应用于基础设施。
在许多传统环境中,即使采用了自动化的软件发布流程,基础设施的设置仍然是手动完成的,导致错误增加、环境之间的不一致性加剧,以及正确配置基础设施的部署时间延长。从安全角度来看,这种不一致性可能导致错误配置,使环境变得不安全。
与传统应用程序开发不同,现代应用程序开发采用基础设施即代码的方式,允许构建者以编程方式定义应用程序的组件。如今,创建存储桶、Lambda 函数、容器和其他资源都是通过代码编写的,类似于软件开发。这种方式带来了诸多好处,包括版本控制、可重复性、更容易扩展、一致的环境(因为它们是从相同的”模板”复制而来)以及加速基础设施部署。
将基础设施视为代码可以降低部署错误配置而暴露漏洞的风险,并且由于它是代码,可以利用应用于软件的相同安全检查。由此产生的一致环境提高了安全检查的有效性。
在基础设施管道的创作阶段,构建者可以使用亚马逊云科技 CloudFormation、Terraform 或亚马逊云科技 Cloud Development Kit (CDK) 等工具编写或模型化他们的基础设施。CDK 是一个开源的多语言开发框架,允许使用熟悉的语言(如 Java、JavaScript、C# 和 TypeScript)对基础设施进行建模,从而更容易、更快地对应用程序进行建模。
在源阶段,CDK 代码被检入存储库,可以应用同行评审和静态测试等实践,CodeGuru Security 与 GitLab、GitHub 和亚马逊云科技 CodePipeline 集成良好。
构建阶段是可以扩展安全检查以包括在 CDK 应用程序中建模的基础设施配置的地方。可以使用 CloudFormation Guard、Open Policy Agent 和 CDK Nag 等策略验证工具将策略定义为代码,并在合成期间验证 CDK 应用程序是否符合这些策略。
在测试阶段,可以使用 Amazon Inspector 扫描实例、容器和 Lambda 函数中的漏洞。此外,亚马逊云科技 IAM Access Analyzer 可以自动运行 IAM 策略的安全检查,如果存在风险策略,会发出警报,如果检测到风险,可能会导致部署失败。
在部署阶段,亚马逊云科技 提供了多种工具来监控和解决配置偏移。Amazon Web Services Config Rules 能够自动评估 亚马逊云科技 资源是否根据所需的策略和状态进行配置,或者可以使用 CloudFormation Drift Detection,它会在 CloudFormation 堆栈的配置发生变化时发出警报。Amazon GuardDuty 则是一项利用机器学习进行持续监控和威胁检测的服务,同样可用于基础设施安全。
接下来,我们将重点转移到分布式应用程序和基础设施安全。在传统软件开发中,随着时间的推移,庞大且复杂的代码库(通常被称为”意大利面条代码”)可能会逐渐形成一个纠缠的库、依赖项、冗余功能和复杂性的混合体,这使得任何人都难以理解。这种复杂性阻碍了软件更新,减缓了创新步伐,并且由于需要工程时间来构建或更改代码库中的任何内容,从而增加了成本。从安全角度来看,这些代码库存在风险,因为很难识别漏洞或问题,并在不影响代码库中其他流程的情况下部署更改。
另一方面,现代应用程序强调软件组件化或将软件组件的大小缩小为更小、分布式和独立的组件,负责单个功能或业务逻辑。这种方法提供了许多好处,包括更容易扩展(因为每个组件都可以独立扩展)、改善故障隔离(如果一个组件失败,其他组件可能不受影响)以及加速开发(因为团队可以同时在不同的组件上工作并并行更新它们)。
从安全角度来看,这些组件化的无服务器架构允许限制授予每个组件的范围和权限,从而实现针对性的风险配置文件和权限。此外,由于组件较小,更容易识别问题,从而在发现安全事件或新漏洞时缩短响应时间。
在为组件化软件构建架构时,自然会导致分布式应用程序,而且通常采用微服务架构。微服务不仅是一种应用程序架构浪潮,也是一种组织方法,团队围绕小型独立服务组织,这些服务通过明确定义的 API 进行通信。
虽然微服务在服务发现、负载均衡和网络通信方面引入了复杂性,但它们也带来了安全挑战。本次会议将分布式应用程序与传统应用程序进行对比,后者通常只有单一代码库、数据库和网络入口点,看起来更容易保护。然而,过度强调边界安全性,如防火墙和入侵检测系统,忽视了应用程序的不同组件和层,如数据层。这种方式缺乏针对由不同风险概况的不同服务组成的更复杂应用程序所需的细微差别和特异性。
在现代应用程序开发中,目标是在所有层面应用安全性,这个概念被称为”深度防御”。这种方法将安全性融入到应用程序的每个组件中,包括单个服务、数据服务和网络。这种多层方法的好处包括冗余(如果一层出现问题,其他层可能仍然提供保护)和更精确的安全控制,尽管后者在由多个组件和服务组成的分布式应用程序中可能是一个挑战。
接下来,会议将逐步介绍如何保护涉及 API Gateway、Lambda、容器、DynamoDB、Aurora、S3 和 CloudFront 的示例微服务架构。
对于用户身份验证,建议使用集中式身份提供商,如 Amazon Cognito,因为它们可以处理身份验证并扩展到大量用户,利用共享责任模型。
保护 API 访问至关重要,因为 API 通常是进入微服务的入口点。Amazon API Gateway 提供了几种访问控制机制,包括与 Cognito 的本机集成(用户在 Cognito 中进行身份验证并接收 API Gateway 期望的令牌)和 Lambda 授权者(自定义逻辑检查令牌并允许或拒绝调用)。API Gateway 还可以执行基本请求验证,检查参数、查询字符串、标头和有效负载是否符合配置的 JSON 模式请求模型。此外,它还可以限制允许应用程序的 CORS(跨源资源共享)标头、方法和来源域。
对于DynamoDB的访问控制,是通过IAM策略来处理的,其中可以缩小操作和资源的范围。有趣的是,IAM条件可以根据用户的Cognito身份进一步限制权限,从而使用户的身份成为他们可以在表中访问哪些项目的边界。
对于Amazon S3,资源默认是私有的,访问是通过资源策略(也称为存储桶策略)来控制的。在示例架构中,由CloudFront访问的单页React应用程序的存储桶可以通过在CloudFront中创建一个Origin Access Identity (OAI),并授予OAI读取存储桶的权限来保证只能通过特定的CloudFront分发进行访问。
在Lambda中,权限有两个主要方面:资源策略,它定义了谁可以与Lambda函数交互;以及访问策略,它指定了Lambda函数可以执行的操作(例如与S3存储桶交互)。此外,信任策略授予Lambda函数权限以承担访问策略的角色。
然后,会话讨论了分布式应用程序中常见的安全问题,如分布式拒绝服务(DDoS)攻击、跨站点脚本攻击和SQL注入攻击。
对于DDoS保护,亚马逊云科技Shield Standard为所有亚马逊云科技客户免费提供对常见网络和传输层DDoS攻击的自动保护。对于更复杂的保护,包括应用层DDoS攻击,可以启用Shield Advanced,提供访问DDoS响应团队以进一步缓解。
跨站点脚本和SQL注入攻击是Web应用程序最常见的OWASP风险之一。虽然现代应用程序开发框架通常具有内置保护,但开发人员仍然有责任验证用户输入。亚马逊云科技Web应用程序防火墙(WAF)可以通过创建访问控制列表并附加托管或自定义规则来过滤流量、检测这些攻击并强制执行有效负载大小限制来提供帮助。
整个会话的重点是采用”深度防御”方法,将安全性集成到分布式应用程序的每个组件和层中,提供冗余和精确的安全控制。
总而言之,现代应用程序开发实践,例如自动化管道、基础设施即代码和分布式架构,通过更早期的漏洞检测、一致的环境、细粒度访问控制和深度防御策略,提高了安全性。将安全性向左移动,贯穿整个开发生命周期,团队可以利用自动化、一致环境和精确安全控制的力量,更快地交付更加安全和弹性的应用程序,这些安全控制针对其应用程序的特定组件和风险配置文件进行了定制。
下面是一些演讲现场的精彩瞬间:
在传统方法中,安全测试通常被推迟到开发生命周期的最后阶段,这可能导致严重的延误、重复工作以及不一致且无效的安全措施。
动态应用程序安全测试(DAST)通过与运行环境交互、发送数据包并检测潜在风险,与静态分析源代码不同。
在现代应用程序中,我们专注于将软件组件化或将这些软件组件缩小为更小的分布式和独立的组件,每个组件负责单个功能和单个业务逻辑。
总结
在这个富有洞见的演讲中,演讲者深入探讨了现代应用程序开发与增强安全措施之间的错综复杂关系。他们强调了自动化、持续集成和持续部署(CI/CD)流水线在简化软件发布的同时,实施一致性并减少人为错误方面的关键作用。这种方法能够及早发现和修复安全漏洞,防止将不安全的代码部署到生产环境中。
演讲者重点强调了三个关键领域:软件发布周期、基础设施管理以及分布式应用程序和基础设施安全架构。他们强调了将安全提前的重要性,将安全检查贯穿整个开发生命周期,从编写阶段的威胁建模到部署期间的动态应用程序安全测试。
在基础设施管理方面,演讲者倡导将基础设施视为代码,利用亚马逊云科技 CloudFormation 和云开发工具包(CDK)等工具。这种方式有助于实现环境的一致性,实现策略验证,并允许进行与应用于软件代码相似的安全检查。
在讨论分布式应用程序和微服务架构时,演讲者强调了采用多层安全方法(即深度防御)的必要性。他们演示了如何使用亚马逊云科技服务(如 Amazon Cognito、IAM 策略和亚马逊云科技 WAF)来保护各种组件,包括 API 网关、数据库、无服务器函数和存储服务。
最后,演讲者强调了采取主动、全面的安全方法的重要性,培养一种所有人都负责确保应用程序和基础设施安全的所有权文化。通过采用现代应用程序开发实践并利用亚马逊云科技服务,组织可以增强其安全态势,同时加速软件交付和创新。
亚马逊云科技(Amazon Web Services)是全球云计算的开创者和引领者。提供200多类广泛而深入的云服务,服务全球245个国家和地区的数百万客户。亚马逊云科技致力于成为企业构建和应用生成式AI的首选,通过生成式AI技术栈,提供用于模型训练和推理的基础设施服务、构建生成式AI应用的大模型等工具、以及开箱即用的生成式AI应用。深耕本地、链接全球 – 在中国,亚马逊云科技通过安全、稳定、可信赖的云服务,助力中国企业加速数字化转型和创新,并深度参与全球化市场。