你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

在 Azure 上开发安全应用程序

在本文中,我们将介绍开发云应用程序时要考虑的安全活动和控件。 涵盖在Microsoft 安全开发生命周期(SDL) 的实现和验证阶段要考虑的安全问题和概念。 目标是帮助你定义可用于开发更安全的应用程序的活动和 Azure 服务。

本文涵盖以下 SDL 阶段:

  • 执行
  • 验证

执行

实施阶段的重点是建立早期预防的最佳做法,并从代码中检测和删除安全问题。 假设应用程序以你不希望使用的方式使用。 这有助于防止意外或故意滥用应用程序。

进行代码审查

在签入代码之前,请执行代码审查以提高总体代码质量,并降低产生 bug 的风险。 可以使用 Visual Studio 管理代码评审过程。

执行静态代码分析

静态代码分析 (也称为 源代码分析)作为代码评审的一部分执行。 静态代码分析通常是指运行静态代码分析工具,以查找非运行代码中的潜在漏洞。 静态代码分析使用 污点检查数据流分析等技术。

Azure 市场提供执行静态代码分析并协助进行代码评审的 开发人员工具

验证并清理应用程序的每个输入

将所有输入视为不受信任,以保护应用程序免受最常见的 Web 应用程序漏洞影响。 不受信任的数据是注入攻击的工具。 应用程序的输入包括 URL 中的参数、用户输入、数据库或 API 中的数据,以及用户可能会操纵的任何内容。 应用程序应该在以任何方式使用数据之前(包括向用户显示数据),验证数据在语法上和语义上是否有效。

在数据流的早期验证输入,以确保仅正确形成的数据进入工作流。 不希望数据库中保留格式不正确的数据,也不希望在下游组件中触发故障。

阻止列表和允许列表是执行输入语法验证的两种常规方法:

  • 阻止列表尝试检查给定的用户输入是否不包含“已知恶意”内容。

  • 允许列表会尝试检查给定的用户输入是否与一组“已知良好”输入匹配。 基于字符的允许列表是允许列表的一种形式,应用程序检查用户输入是否仅包含“已知良好”字符,或者输入与已知格式匹配。

    例如,这可能涉及检查用户名是否仅包含字母数字字符,或者它是否仅包含两个数字。

允许列表是构建安全软件的首选方法。 阻止列表很容易出错,因为不可能考虑到一个完整的潜在错误输入列表。

在服务器上执行此作,而不是在客户端上(或在服务器和客户端上)。

验证应用程序的输出

以直观方式呈现的或在文档中呈现的任何输出始终都应进行编码和转义。 转义(也称为输出编码)用于帮助确保不受信任的数据不会成为注入攻击的工具。 转义与数据验证相结合,可提供分层防御机制,从而整体提高系统的安全性。

转义可确保所有内容都显示为输出。转义还使解释器知道不应执行数据,因此可防止攻击发生。 这是另一种称为 跨站点脚本 (XSS)的常见攻击技术。

如果使用第三方提供的 Web 框架,则可以使用 OWASP XSS 防护备忘单验证网站上的输出编码选项。

联系数据库时使用参数化查询

切勿在代码中“即时”创建内联数据库查询,并将其直接发送到数据库。 插入到应用程序中的恶意代码可能会导致数据库被盗、擦除或修改。 应用程序还可用于在托管数据库的服务器上的操作系统上运行恶意操作系统命令。

请改用参数化查询或存储过程。 使用参数化查询时,可以安全地从代码调用该过程,并向其传递一个字符串,而无需担心将它视为查询语句的一部分。

删除标准服务器标头

服务器、X-Powered-By 和 X-AspNet-Version 等标头揭示了有关服务器和基础技术的信息。 建议取消这些标头以避免对应用程序进行指纹识别。 请参阅 删除 Azure 网站上的标准服务器标头

隔离生产数据

生产数据或“真实”数据不应用于开发、测试或任何其他用途,只应限于业务预期用途。 掩码(匿名)数据集应用于所有开发和测试。

这意味着很少有人能够访问你的真实数据,从而减少攻击面。 这也意味着更少的员工看到个人数据,从而消除了机密性的潜在泄露。

实现强密码策略

若要抵御暴力破解和基于字典的猜测,必须实施强密码策略,以确保用户创建复杂的密码(例如,最小长度为 12 个字符,需要字母数字和特殊字符)。

外部租户中的 Microsoft Entra 外部 ID 通过提供自助式密码重置等功能帮助你进行密码管理。

若要抵御默认帐户的攻击,请验证所有密钥和密码是否可替换,并在安装资源后生成或替换它们。

如果应用程序必须自动生成密码,请确保生成的密码是随机的,并且它们具有较高的信息量。

验证文件上传

如果应用程序允许 文件上传,请考虑为此有风险的活动采取预防措施。 许多攻击的第一步是将一些恶意代码引入受到攻击的系统。 使用文件上传可帮助攻击者完成此作。 OWASP 提供用于验证文件的解决方案,以确保上传的文件是安全的。

反恶意软件保护有助于识别和删除病毒、间谍软件和其他恶意软件。 可以在 Windows 和 Endpoint Protection 中安装Microsoft反恶意软件或Microsoft合作伙伴的终结点保护解决方案(Trend MicroBroadcomMcAfeeMicrosoft Defender 防病毒)。

Microsoft反恶意软件 包括实时保护、计划扫描、恶意软件修正、签名更新、引擎更新、示例报告和排除事件收集等功能。 你可以将 Microsoft Antimalware 和合作伙伴解决方案与 Microsoft Defender for Cloud 集成,以便轻松部署和内置检测(警报和事件)。

不要缓存敏感内容

不要在浏览器中缓存敏感内容。 浏览器可以存储缓存和历史记录的信息。 缓存的文件存储在 Internet Explorer 的文件夹中,例如临时 Internet 文件文件夹。 再次引用这些页面时,浏览器会显示其缓存中的页面。 如果向用户显示敏感信息(地址、信用卡详细信息、社会安全号码、用户名),则信息可能存储在浏览器的缓存中,并通过检查浏览器的缓存或按浏览器的 “后退 ”按钮进行检索。

验证

验证阶段涉及全面努力,以确保代码符合在前面的阶段建立的安全和隐私原则。

查找和修复应用程序依赖项中的漏洞

扫描应用程序及其依赖库,以识别任何已知的易受攻击的组件。 可用于执行此扫描的产品包括 OWASP 依赖项检查SnykBlack Duck

在运行状态下测试应用程序

动态应用程序安全测试(DAST)是在运行状态下测试应用程序以查找安全漏洞的过程。 DAST 工具在执行时分析程序,以查找安全漏洞,例如内存损坏、不安全的服务器配置、跨站点脚本、用户特权问题、SQL 注入和其他关键安全问题。

DAST 不同于静态应用程序安全测试(SAST)。 SAST 工具在代码未执行时分析源代码或已编译版本的代码,以便发现安全漏洞。

执行 DAST,最好在安全专业人员(渗透测试员或漏洞评估员)的协助下进行。 如果没有安全专业人员,您可以通过简单培训使用 Web 代理扫描工具自己动手进行动态应用安全测试(DAST)。 提前插入 DAST 扫描程序,确保不会在代码中引入明显的安全问题。 有关 Web 应用程序漏洞扫描程序列表,请参阅 OWASP 站点。

执行模糊测试

模糊测试中,通过故意向应用程序引入格式不正确或随机数据来引入程序失败。 在应用程序发布之前,诱发程序故障有助于揭示潜在的安全问题。

安全风险检测 是 Microsoft 专属的模糊测试服务,用于在软件中查找安全关键漏洞。

执行攻击面评审

在代码完成后查看攻击面有助于确保已考虑对应用程序或系统所做的任何设计或实现更改。 这有助于确保因更改(包括威胁模型)而产生的任何新攻击途径已经过审查并得到缓解。

可以通过扫描应用程序来生成攻击面的图片。 Microsoft提供名为 “攻击面分析器”的攻击面分析工具。 可以从许多商业动态测试和漏洞扫描工具或服务中进行选择,包括 OWASP 攻击面检测器Arachniw3af。 这些扫描工具对应用进行爬网,并映射可通过 Web 访问的应用程序的各个部分。 还可以在 Azure 市场中搜索类似的 开发人员工具

执行安全渗透测试

确保应用程序安全与测试任何其他功能一样重要。 使 渗透测试 成为生成和部署过程的标准部分。 针对已部署应用程序对定期安全测试和漏洞扫描进行计划,并监视打开的端口、终结点和攻击活动。

运行安全验证测试

Secure DevOps Kit for Azure (AzSK) 中的 Azure 租户安全解决方案 (AzTS) 包含用于多个 Azure 平台服务的 SVT。 定期运行这些 SVT,以确保 Azure 订阅和构成应用程序的不同资源处于安全状态。 还可以使用 AzSK 的持续集成/持续部署(CI/CD)扩展功能自动执行这些测试,该功能使 SVT 可用作 Visual Studio 扩展。

后续步骤

在以下文章中,我们建议使用有助于设计和部署安全应用程序的安全控件和活动。