API安全设计和开发检查单

371 阅读6分钟

本文的主要思路和内容来自OWASP的相关材料。主要讨论了基于其方法论的相关API设计的最佳实践和检查清单,目的是为了提升开发人员在设计和部署业务系统所涉及的WebAPI过程中,对系统漏洞、缺陷、安全风险、应对策略和解决方案的全面认知和设计、开发、部署安全Web系统的能力。

关于 OWASP

OWASP(Open Web Application Security Project,开放式Web应用安全项目),是一个国际性的非营利组织,致力于提高Web应用程序的安全性。其使命是通过教育、意识提高和开源工具的开发来使Web应用程序更安全。OWASP致力于推动Web应用程序安全的最佳实践,并提供关于Web应用程序安全的指南、文档、工具和资源。它开发了许多知名的项目和工具,包括OWASP Top 10漏洞列表、OWASP ZAP(开源漏洞扫描器)、OWASP WebGoat(用于教育目的的Web应用程序)等。OWASP通过社区参与和专家贡献来推动其使命,吸引了许多安全专家、开发人员和组织的支持和参与。它提供了一个平台,让安全专业人员和开发人员可以共享知识、经验和解决方案,以帮助提高Web应用程序的安全性。

OWASP提出了一个针对开发人员的高级检查清单,其中包括安全开发API的建议。该清单侧重于了解和减轻应用程序编程接口(API)的独特漏洞和安全风险的策略和解决方案。它涵盖了OWASP十大API安全问题。该清单应当适用于所有使用API进行通信的应用程序类型。

Web API基本架构

下图(来自OWASP)展示了WebAPI相关要件和架构:

1 wP-PK1BmdmAUbusBPKKdWA.webp

当然,这个是平台级,或者微服务化的WebAPI设计和架构。一般的业务级系统没有这么复杂,但相关的设计和实践安全的原则、原理是相同的,并不影响下面的讨论。

WHY

在了解最佳实践之前,我们首先应该了解为什么对开发人员来说保持API安全是重要的。这是因为:

  • 在现代化的Web和网络应用中,API被广泛使用
  • 由于API可能会公开应用程序逻辑和敏感数据(如个人身份信息PII),因此会显著的成为攻击者的主要目标
  • 没有安全的API,业务的持续发展和快速创新将是不可能的

在开发者开发和部署Web应用和API的时候,需要持续考虑的安全风险和检查清单如下:

对象授权

  • 使用用户策略和层次结构来实施授权检查。
  • 不要依赖客户端发送的ID,而是使用会话对象(如Token)中存储的ID。
  • 检查每个客户端请求以访问数据库的授权
  • 使用无法猜测的随机ID(UUID)

身份验证

  • 检查所有可能的身份验证方式以访问所有API
  • 密码重置和一次性链接的API也需要用户进行身份验证,并且同样严格保护
  • 使用标准身份验证、令牌生成、密码存储和多因素身份验证(MFA)
  • 使用短期访问令牌,检查令牌和访问的有效期
  • 验证和记录应用程序(这样您就知道与您进行通信的是谁)
  • 对身份验证使用更严格的速率限制,并实施锁定策略和弱密码检查
  • 不保存密码或者其简单或直接编码
  • 不在网络上传输密码或者其简单直接编码

过度数据暴露

  • 永远不要依赖客户端来过滤数据(可以使用客户端来减少处理工作或提升用户体验)
  • 检查所有API响应并根据使用者的实际需求进行调整
  • 为所有API响应仔细定义模式
  • 不要忘记错误响应,也要定义适当的模式
  • 确定所有敏感数据或个人身份信息(PII),并对其使用进行合理的解释。
  • 强制执行响应检查,以防止数据或异常的意外泄漏。

资源不足

  • 定义适当的速率限制
  • 明确和限制有效负载大小
  • 根据API方法、客户端或地址的需求或应允许的情况定制速率限制
  • 增加压缩比率的检查
  • 为容器资源定义限制
  • 优先进行数据过滤,尽量不处理冗余或无效数据
  • 优化数据处理和数据库操作

功能级授权

  • 不要依赖客户端来强制执行管理员访问权限。
  • 默认情况下拒绝所有访问
  • 仅允许属于适当组或角色的用户进行操作。
  • 正确设计和测试授权机制。

大规模赋值

  • 不要自动绑定传入的数据和内部对象
  • 明确定义您预期的所有参数和有效负载
  • 在所有可以通过API检索但不应被修改的属性的对象模式中,将readOnly属性设置为true
  • 在设计时精确定义您将在请求中接受的模式、类型和模式,并在运行时强制执行

安全配置错误

  • 建立可重复的加固和修补流程(如每周的手动或自动化配置检查脚本)
  • 自动定位配置缺陷
  • 禁用不必要的功能
  • 限制管理员访问
  • 定义和强制执行所有输出

注入

  • 永远不要相信您的API使用者,即使他们是内部人员
  • 严格定义所有输入数据,如模式、类型和字符串模式,并在运行时强制执行它们
  • 验证、过滤和清理所有传入数据
  • 定义、限制和强制执行API的输出检查,以防止数据泄漏

不当的资产管理

  • 保持对所有API主机的最新清单
  • 限制对不应公开的内容的访问
  • 限制对生产数据的访问,并将生产和非生产数据的访问进行分隔
  • 实施额外的外部控制,例如API防火墙
  • 妥善退役旧版本的API,或将安全修复程序回溯到它们
  • 实施严格的身份验证、重定向、CORS等措施

日志和监控不足

  • 记录失败的尝试、被拒绝的访问、输入验证失败或安全策略检查失败等情况
  • 确保日志格式化,以便其他工具也能使用它们
  • 保护日志,就像高度敏感的信息一样
  • 包含足够的细节以识别攻击者
  • 避免在日志中包含敏感数据——如果您需要这些信息进行调试,部分遮蔽它
  • 与SIEM和其他仪表板、监控和警报工具集成

特别感谢OWASP社区分享的知识。