每个团队都应知道的API安全威胁

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 每个团队都应知道的API安全威胁

目录

每个团队都应知道的API安全威胁

分页和资源限制不安全

如何防止分页攻击

API密钥生成不安全

如何保护API密钥池

密钥暴露

如何防止密钥暴露

DDoS攻击

防止DDoS攻击

服务器没有设置正确的SSL

如何设置正确的SSL

缓存头设置不正确

如何设置正确的缓存头

记录和监控不足

如何正确添加API日志记录

没有保护内部端点

没有处理授权

如何修正授权



每个团队都应知道的API安全威胁

随着越来越多的数据以API方式暴露,API的安全性变得越来越重要。由于API提供了对大量数据的直接访问,绕过了浏览器的预防措施,因此常会有SQL注入和XSS等问题。

API安全性的第一件事是,对你的API进行检测,以检测和阻止常见攻击以及未知的对象。在OWASP安全API列表中,你可以看到常见的API 漏洞和安全风险 。


分页和资源限制不安全

大多数API提供对作为实体列表(例如/users/widgets)的资源的访问。诸如浏览器之类的客户端,通常会过滤并分页浏览此列表,以限制返回给客户端的数量,如下所示:

First Call: GET /items?skip=0&take=10 
Second Call: GET /items?skip=10&take=10

但是,如果该实体具有任何PII (Personally Identifiable Information, 个人识别信息 ) 或其他敏感信息,则黑客很可能会抓取该端点以获取数据库中信息。这可能是最危险的。这也便于竞争对手了解组织的运行状况,或者为诈骗者提供获取大型电子邮件列表的方式。查看如何清除Venmo数据

初级的保护机制是检查请求数据总量,如果大于100或1000,则会引发业务错误。但这样组,也带来了两个问题:

  1. 对于数据API,合法客户可能需要获取并同步大量记录,例如通过cron任务调度。人为地限制分页大小可能会迫使你的API访问过于频繁,从而降低整体吞吐量。最大限制是为了确保满足内存和可伸缩性要求(并防止某些DDoS攻击),而不是为了保证安全性。
  2. 不能真正防止黑客攻击,黑客使用如下脚本(在重复访问之间随机睡眠)就可以绕过限制。

skip = 0

while True:    response = requests.post('https://api.acmeinc.com/widgets?take=10&skip=' + skip),                      headers={'Authorization': 'Bearer' + ' ' + sys.argv[1]})    print("Fetched 10 items")    sleep(randint(100,1000))    skip += 10


如何防止分页攻击

为了防止分页攻击,你应该跟踪在一定时间段内每个用户或API密钥,访问了单个资源的多少个次。通过在用户级别跟踪API资源访问,你可以在用户或API密钥达到阈值(例如在一个小时内访问1,000,000次)后阻止它们。像验证码一样,这会减慢黑客利用你的API的速度。

 


API密钥生成不安全

大多数API受某种API密钥或JWT(JSON Web令牌)保护。由于API安全工具可以检测到异常的API行为并自动阻止对API密钥的访问,因此这提供了一种天然的方式来跟踪和保护你的API。但是,黑客会通过生成大量用户和使用大量API密钥来绕过这些机制,就像网络黑客会使用大量IP地址来规避DDoS保护一样。


如何保护API密钥池

抵御此类攻击的最简单方法是要求使用方注册你的服务并生成API密钥。可以使用Captcha和2-Factor身份验证来阻止Bot(机器人)的暴力访问。除非有商业合作需求,否则注册你的服务的新用户不应具有以编程方式生成API密钥的能力。


密钥暴露

使用API的方式会增加密钥暴露的可能性:

  1. 允许API访问的时间段如果不提前设置好,这会增加黑客获得未过期的有效API密钥的可能性。
  2. API的使用者因为可以直接访问密钥,那就会存在将包含API密钥的CURL命令意外地复制/粘贴到公共论坛(如GitHub Issues或Stack Overflow中)的风险。
  3. API密钥通常承载令牌,一旦暴露,用户身份也就容易被获取。

如果由于用户错误而暴露了密钥,那么你可能会以为你是API提供者。因此需要通过添加防止意外暴露的保护措施来帮助他们。


如何防止密钥暴露

防止密钥暴露的最简单方法是利用两个令牌而不是一个。一个刷新令牌被存储为环境变量,并且只能用于生成短暂的访问令牌。与刷新令牌不同,这些短暂的令牌可以访问资源,但是有时间限制,例如数小时或数天。

客户将存储刷新令牌和其他API密钥。然后,你的SDK将在SDK初始化时或最后一个访问令牌到期时生成访问令牌。如果将CURL命令粘贴到GitHub等其他公共论坛中,那么黑客将只能在有限的时间内使用它。


DDoS攻击

API开辟了全新的业务模型,客户能够以编程方式访问你的API平台。但是,这会使DDoS保护变得棘手。大多数DDoS保护,目的是阻止恶意请求,但仍然需要让受信任用户通过。这就需要对HTTP请求进行分析识别,以检查机器人流量看起来像什么。


防止DDoS攻击

关于API的神奇之处在于,几乎每个访问都需要一个API密钥。如果请求没有API密钥,则可以自动拒绝它。

那么,如何处理经过身份验证的请求?最简单的方法是利用每个API密钥的速率限制计数器,例如每分钟处理X个请求,并使用429 HTTP response拒绝超过阈值的那些请求。有多种算法可以做到这一点,例如漏斗和固定窗口计数器。


服务器没有设置正确的SSL

数据可能由于错误配置的SSL证书或允许非HTTPS流量而泄漏。

对于现代应用程序,几乎没有理由接受非HTTPS请求,但是客户可能会错误地从其应用程序或暴露API密钥的CURL发出非HTTP请求。


如何设置正确的SSL

通过Qualys SSL Test或类似工具测试SSL的设置。

你还应该阻止所有在负载均衡器中完成的非HTTP请求。你还应该删除所有HTTP标头,保证只有HTTPS请求才能访问。如果你的API仅由你自己的应用使用,或者只能在服务器端访问,请查看REST API跨域资源共享权威指南


缓存头设置不正确

对动态数据的访问,API提供可API密钥的范围。因此你的缓存头要真能够正确使用API密钥的范围,以防止交叉污染。例如,具有代理服务器的客户可能使用多个API密钥,一个用于开发,一个用于生产。


如何设置正确的缓存头

你应该确保正确配置了Cache-Control标头。

app.use((req, res, next) => {  res.setHeader('Cache-Control', 'no-store, no-cache, must-revalidate');  res.setHeader('Pragma', 'no-cache');  // ...
});


记录和监控不足

大多数系统入侵研究表明,检测到数据泄漏的时间超过200天。如果你没有适当的API日志记录和监视,攻击者可以继续使用相同的漏洞,甚至可以探测更多漏洞。


如何正确添加API日志记录

你应该确保API日志记录不仅跟踪API请求本身,而且还应绑定到用户以对用户行为分析,数据并至少存储一年。Moesif API Security之类的解决方案为API产品提供了一整套API监视和分析功能,并且只需几分钟即可开始使用。

 


没有保护内部端点

不能因为未记录内部端点,而想当然认为黑客无法调用它。因此,除了使用身份验证和授权方案进行保护之外,你还应确保这些内部端点完全不暴露于公网。而这可以在负载均衡器或API网关中完成,提供多级安全性(一种常见的预防策略)。


没有处理授权

虽然大多数API开发人员都会添加诸如API密钥或OAuth之类的全局身份验证方案来验证人员身份,但实现授权却很困难,授权并且需要与身份验证分开进行。授权涉及检查此人(已被识别)是否可以访问特定资源。

因为授权是基于你的应用程序逻辑,因此你的授权标识符具有不规律性,否则黑客可以通过迭代轻松测试不同的id。对于在插入时id自增的SQL数据库尤其如此。


如何修正授权

确保已授权身份验证的用户有权访问所需的资源。这可能涉及检查链接到相关对象的用户ID或访问控制列表(ACL)。有关如何处理授权的更多信息,请查看我们的文章“为RESTful API构建身份验证和授权的步骤”。


译文链接: https://dzone.com/articles/top-10-api-security-threats-every-api-team-should



目录
相关文章
|
2月前
|
存储 安全 API
如何对 API 进行安全加密?
对API进行安全加密是保障数据安全和系统稳定的重要措施
171 56
|
2天前
|
弹性计算 监控 安全
API稳定安全最佳实践:用阿里云SDK为业务保驾护航
阿里云智能集团高级技术专家赵建强和曹佩杰介绍了API稳定安全最佳实践,涵盖业务上云真实案例、集成开发最佳实践、配额管理和共担模型四部分。通过分析企业在不同阶段遇到的问题,如签名报错、异常处理不严谨、扩容失败等,提出了解决方案和工具,确保API调用的安全性和稳定性。特别强调了SDK的使用、无AK方案、自动刷新机制以及配额中心的作用,帮助用户构建更稳定、安全的服务,提升运维效率。最终介绍了集成开发共担模型,旨在通过最佳实践和平台工具,保障业务的稳定与安全,推动行业创新与发展。
|
9天前
|
安全 API 数据安全/隐私保护
自学记录HarmonyOS Next DRM API 13:构建安全的数字内容保护系统
在完成HarmonyOS Camera API开发后,我深入研究了数字版权管理(DRM)技术。最新DRM API 13提供了强大的工具,用于保护数字内容的安全传输和使用。通过学习该API的核心功能,如获取许可证、解密内容和管理权限,我实现了一个简单的数字视频保护系统。该系统包括初始化DRM模块、获取许可证、解密视频并播放。此外,我还配置了开发环境并实现了界面布局。未来,随着数字版权保护需求的增加,DRM技术将更加重要。如果你对这一领域感兴趣,欢迎一起探索和进步。
66 18
|
3月前
|
Kubernetes 安全 Cloud Native
云上攻防-云原生篇&K8s安全-Kubelet未授权访问、API Server未授权访问
本文介绍了云原生环境下Kubernetes集群的安全问题及攻击方法。首先概述了云环境下的新型攻击路径,如通过虚拟机攻击云管理平台、容器逃逸控制宿主机等。接着详细解释了Kubernetes集群架构,并列举了常见组件的默认端口及其安全隐患。文章通过具体案例演示了API Server 8080和6443端口未授权访问的攻击过程,以及Kubelet 10250端口未授权访问的利用方法,展示了如何通过这些漏洞实现权限提升和横向渗透。
269 0
云上攻防-云原生篇&K8s安全-Kubelet未授权访问、API Server未授权访问
|
4月前
|
人工智能 安全 API
API应用安全风险倍增,F5助企业赢得关键安全挑战
API应用安全风险倍增,F5助企业赢得关键安全挑战
65 11
|
4月前
|
安全 Java API
【性能与安全的双重飞跃】JDK 22外部函数与内存API:JNI的继任者,引领Java新潮流!
【9月更文挑战第7天】JDK 22外部函数与内存API的发布,标志着Java在性能与安全性方面实现了双重飞跃。作为JNI的继任者,这一新特性不仅简化了Java与本地代码的交互过程,还提升了程序的性能和安全性。我们有理由相信,在外部函数与内存API的引领下,Java将开启一个全新的编程时代,为开发者们带来更加高效、更加安全的编程体验。让我们共同期待Java在未来的辉煌成就!
84 11
|
4月前
|
安全 Java API
【本地与Java无缝对接】JDK 22外部函数和内存API:JNI终结者,性能与安全双提升!
【9月更文挑战第6天】JDK 22的外部函数和内存API无疑是Java编程语言发展史上的一个重要里程碑。它不仅解决了JNI的诸多局限和挑战,还为Java与本地代码的互操作提供了更加高效、安全和简洁的解决方案。随着FFM API的逐渐成熟和完善,我们有理由相信,Java将在更多领域展现出其强大的生命力和竞争力。让我们共同期待Java编程新纪元的到来!
131 11
|
5月前
|
安全 API 数据处理
后端开发中的API设计哲学:简洁、高效与安全
【8月更文挑战第29天】 在后端开发的广阔天地中,API(应用程序编程接口)的设计如同编织一张无形的网,连接着数据的海洋与应用的大陆。本文将深入探讨如何打造一个既简洁又高效的API,同时不忘筑牢安全的防线。我们将从API设计的基本原则出发,逐步剖析如何通过合理的结构设计、有效的数据处理和严格的安全措施来提升API的性能和用户体验。无论你是初学者还是资深开发者,这篇文章都将为你提供宝贵的视角和实用的技巧,帮助你构建出更优秀的后端服务。
|
6月前
|
安全 API 网络架构
Python RESTful API设计新篇章,打造高效、易用、安全的Web服务接口,你准备好了吗?
【7月更文挑战第22天】在数字化转型中,RESTful API借助Python的Flask和Django REST Framework,提供高效、易用和安全的接口设计。Flask示例展示了简洁的CRUD操作,Swagger等工具增进API文档的易用性,而HTTPS、JWT和输入验证确保安全性。Python RESTful API设计涉及效率、可用性和安全,是不断进化的Web服务接口的关键。准备好踏上这一新篇章了吗?一起探索,创造卓越!
71 2
|
6月前
|
安全 API 网络安全
Django RESTful API安全实践
【7月更文挑战第19天】构建安全的Django RESTful API需要综合考虑多个方面,包括身份验证与授权、数据验证与清洗、安全的HTTPS连接、限制请求频率以及审计与日志记录等。通过实施这些安全实践,可以有效地保护API服务免受各种安全威胁的侵害,确保用户数据的安全性和服务的可用性。开发者在开发RESTful API时,应始终将安全性放在首位,确保API服务的安全可靠。