原文发表于kubernetes中文社区,为作者原创翻译 ,原文地址

更多kubernetes文章,请多关注kubernetes中文社区

目录

每个团队都应知道的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

每个团队都应知道的API安全威胁相关推荐

  1. 每个前端开发者都应知道的25个实用网站

    微信搜索 [大迁世界], 我会第一时间和你分享前端行业趋势,学习途径等等. 本文 GitHub https://github.com/qq449245884/xiaozhi 已收录,有一线大厂面试完整 ...

  2. html 自定义属性_五道自测题-你我都应知道的HTML小知识

    这几天学习了HTML相关的基础知识之后,老师出了五道自测题,通过这几天学习的总结,和查阅相关文档,我也作出了自己的理解,以下是我学习的相关心得分享给大家. 1.HTML元素.标签和属性之间的关联与区别 ...

  3. 关于软件开发,都应该知道的10个常识

    2011年,马克·安德列森(Marc Andreessen)写了一篇文章,预言"软件吞噬世界".观点主要有两个:第一,许多传统业务正在被软件公司所取代:第二,所有其他公司都发现,他 ...

  4. 女孩做妻子前应知道的10件事

    女孩做妻子前应知道的10件事 一段时间的甜蜜恋爱期过后,你和心爱的他终于要踏上期盼已久的红地毯.你发誓一定要做个最幸福的小女人,要成一个永远让丈夫着迷的好妻子.从一个女孩的身份转变为一个妻子的身份前, ...

  5. 声学工程师应知道的150个声学基础知识

    和大家分享一下声学工程师应知道的150个声学基础知识. 注意,声学工程师和音频工程师可不是同一岗位,前者会更侧重于硬件,后者侧重于软件层面.但是关于声音的一些基础内容还是相同的,可以多多了解!!! 以 ...

  6. 声学工程师应知道的150个声学基础知识(全篇)

    和大家分享一下声学工程师应知道的150个声学基础知识. 注意,声学工程师和音频工程师可不是同一岗位,前者会更侧重于硬件,后者侧重于软件层面.但是关于声音的一些基础内容还是相同的,可以多多了解!!! 以 ...

  7. 每个人都应该知道的 18 个强大的 Excel 快捷键!

    Microsoft Excel 是一种程序,可让您在计算机或移动设备上高效地执行各种任务.它是全球小型和大型企业主要使用的重要工具. 如果您是一位经验丰富的用户,那么您可能知道 Excel 快捷键并正 ...

  8. 每一个JavaScript开发者都应该知道的10道面试题

    JavaScript十分特别.而且差点儿在每一个大型应用中起着至关关键的数据.那么,究竟是什么使JavaScript显得与众不同,意义非凡? 这里有一些问题将帮助你了解其真正的奥妙所在:   1.你能 ...

  9. 使用Mono平台前,请牢记产品观点(所有.Net程序员都建议知道的)

    技术领域有很多让人深感困惑的地方,不管是架构师.设计师还是程序员,在完成任务之余,偶尔都有自责的地方:程序员在使用新技术完成任务的时候,有时会觉的自己旧技术都没有完全掌握,使用新技术有些好高骛远:设计 ...

最新文章

  1. STM32 电机教程 16 - PMSM电机磁场定向控制原理
  2. python round函数_Python round() 函数
  3. Python练习-基于socket的FTPServer
  4. Image Lab 6 for MacOS WIN 图像分析软件下载
  5. Java ArrayList set()方法与示例
  6. idea重写接口没有@override_细说 Java Overload 与 Override 差别
  7. Windows环境变量配置问题
  8. linux系统如何启动rpcbind,在Linux系统上关闭rpcbind、postfix、rpc.statd、hpiod服务的方法...
  9. 纬地道路纵断面设计教程_市政道路从识图算量到施工工艺,一篇全搞定
  10. 如何取消html中页眉的下划线,Word文档页眉的横线怎么去掉?页脚的横线怎么去掉?...
  11. 阿里云云解析DNS怎么样?云解析DNS有什么优势?
  12. .NET CORE敏捷开发框架,企业信息化自主化解决方案
  13. 油价小程序开发 - 手把手教你写小程序(适合初学者)
  14. 基于Atmel128A单片机的MP31.0设计
  15. Flask框架基础入门教程
  16. 「Python|音视频处理|场景案例」如何使用ffmpeg下载m3u8视频到本地并保存成mp4
  17. 对比Python,看看Excel如何3步给证件照换底色?
  18. 饼图加引导线_如何在饼形图中添加引导线(Excel)/
  19. STM32C8T6时钟树
  20. MySQL 学习笔记——基础 DQL 查询语言

热门文章

  1. douyin web端滑动,点选验证码分析
  2. java枚举工具类_Java 枚举
  3. HTML table 表格 thead 表头固定,tbody 滚动
  4. SpringBoot内置http编码功能为例分析自动配置过程
  5. tomcat 在linux上的重启和关闭命令
  6. Blade - 腾讯开源的构建系统 c/c++编译环境
  7. vuex五个属性及其使用传参
  8. apache 文件 服务器,apache做文件服务器
  9. C++ 中 冒号:和双冒号::的简介
  10. 金蝶系统一直提示服务器超时,连接金蝶云服务器超时