本文的主要思路和内容来自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相关要件和架构:
当然,这个是平台级,或者微服务化的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社区分享的知识。