您当前的位置:首页 > 电脑百科 > 程序开发 > 编程百科

API网关的权限验证实践

时间:2022-04-26 09:58:35  来源:  作者:足智多谋小瓜瓜
  1. 概述

公司、个人开发的系统上线后,系统中 API 暴露到网络上会存在一定的安全风险,比如:爬虫、恶意访问、错误访问等。API没有安全性,用户可以任意注册即可无限次访问和调用API,且没有请求与特定用户数据关联的简单方法,就无法防止恶意用户的恶意请求等。

常用 API 接口安全措施如下几种:

(1)数据加密

数据在互联网传输过程很容易被抓包,如果直接传输,那么用户数据可能被其他人获取,导致系统安全性等问题,所以必须对数据加密。常见的做法是对关键字段加密,比如用户密码直接通过 md5 加密。

(2)数据签名

数据在传输过程中经过加密,理论上就算被抓包,也无法对数据进行篡改,但是我们一般加密的部分其实只是在外网,现在很多服务在内网中都需要经过很多服务跳转,如果被攻入内网,则可以在任意节点篡改数据,所以这里的加数据签名可以防止内网中数据被篡改。数据签名就是由发送者产生一段无法伪造的一段数字串,来保证数据在传输过程中不被篡改。md5算法是常用的数据签名算法,其原理是将需要提交的数据通过某种方式组合成一个字符串,然后通过md5算法生成一段加密字符串,这段加密字符串就是数据包的签名。为保证安全性,最后的密钥会在客户端和服务端各备一份。

(3)添加时间戳

经过如上的加密,加签处理,就算拿到数据也不能看到真实的数据;但是有些攻击者不关心真实的数据,而是直接拿到抓取的数据包做恶意请求,以达到攻击的目的。我们可以使用时间戳机制,在每次请求的时候加入当前的时间,服务器端会拿到当前时间和消息中的时间相减,看看是否在一个固定的时间范围内,超过时间差的请求就视为非法请求。

(4)限流机制

如果有用户出现频繁调用接口的情况;这种情况需要给相关用户做限流处理,常用的限流算法包括:令牌桶限流,漏桶限流,计数器限流。令牌桶限流:系统以一定速率向桶中放入令牌,填满了就丢弃令牌;请求来时会先从桶中取出令牌,如果能取到令牌,则可以继续完成请求,否则等待或者拒绝服务。令牌桶允许一定程度突发流量,只要有令牌就可以处理,支持一次拿多个令牌。漏桶限流:按照固定常量速率流出请求,流入请求速率任意,当请求数超过桶的容量时,新的请求等待或者拒绝服务,因此漏桶算法可以强制限制数据的传输速度。计数器限流:这是一种比较简单粗暴的算法,主要用来限制总并发数,比如数据库连接池、线程池、秒杀的并发数;计数器限流只要一定时间内的总请求数超过设定的阀值则进行限流。

(5)黑名单限流

如果此用户进行过很多非法操作,或者说专门有一个中黑系统,经过分析之后直接将此用户列入黑名单,所有请求直接返回错误码。我们可以给每个用户设置一个状态比如包括:初始化状态,正常状态,中黑状态,关闭状态等等;或者我们直接通过分布式配置中心,直接保存黑名单列表,每次检查是否在列表中即可。

常用的安全防范有以下方式:API Keys、Basic Auth、Hmac、OAuth。本文主要讨论基于OAuth协议的API安全验证。本文主要介绍基于OAuth协议(Client Credentials)的实践。

  1. 系统架构

下图是一个笔者亲身经历的一个例子,到目前为止,运转良好。API服务服务网关采用基于Kong API网关的实现,认证中心是实现OAuth 2.0协议的权限认证系统,服务提供系统设置基于IP的白名单访问。

OAuth 2.0是一种用户验证和授权用户的流行方法,此方法依赖于身份验证服务器和API服务器进行通信以授予访问权限,在笔者的前面的文章中已经详细阐述OAuth的原理,在这里就不在赘述,想看的读者可以翻看历史记录找到该篇文章。下图标注了详细的流程。

API网关的权限验证实践

 

  1. JWT令牌的理论

JWT(全称:Json Web Token)是一个开放标准(RFC 7519),它定义了一种紧凑的、自包含的方式,用于作为JSON对象在各方之间安全地传输信息。该信息可以被验证和信任,因为它是数字签名的。如有读者想了解详细的JWT规范,可以访问RFC7519的官方网站:https://datatracker.ietf.org/doc/html/rfc7519。

JWT由3部分组成:标头(Header)、有效载荷(Payload)和签名(Signature)。在传输的时候,会将JWT的3部分分别进行Base64编码后用。进行连接形成最终传输的字符串。JWTString=Base64(Header).Base64(Payload).HMACSHA256(base64UrlEncode(header)+"."+base64UrlEncode(payload),secret)。

下图为一个简单的JWT的解码出来的例子:

API网关的权限验证实践

 

以上图为例,JWT的数据结构一般是一个三段式的字符,以“.”隔开:xxxxx.yyyyy.zzzzz。

JWT第一部分是Header头部分,它是一个描述JWT元数据的Json对象,通常如下所示。alg属性表示签名使用的算法,默认为HMAC SHA256(写为HS256),typ属性表示令牌的类型,JWT令牌统一写为JWT。最后,使用Base64 URL算法将上述JSON对象转换为字符串保存。

JWT第二部分是Payload,也是一个Json对象,除了包含需要传递的数据,还有七个默认的字段供选择。分别是,iss:发行人、exp:到期时间、sub:主题、aud:用户、nbf:在此之前不可用、iat:发布时间、jti:JWT ID用于标识该JWT。也可以加上自定义字段。需要注意的是,默认情况下JWT是未加密的,任何人都可以解读其内容,因此如果一些敏感信息不要存放在此,以防信息泄露。JSON对象也使用Base64 URL算法转换为字符串保存。

JWT第三部分是Signature签名。是这样生成的,首先需要指定一个secret,该secret仅仅保存在服务器中,保证不能让其他用户知道。然后使用Header指定的算法对Header和Payload进行计算,然后就得出一个签名哈希。也就是Signature。

那么Application Server如何进行验证呢?可以利用JWT前两段,用同一套哈希算法和同一个secret计算一个签名值,然后把计算出来的签名值和收到的JWT第三段比较,如果相同则认证通过。

JWT的优点包括如下:JSON格式的通用性,所以JWT可以跨语言支持,比如JAVAJavaScriptphp、Node等等。可以利用Payload存储一些非敏感的信息。便于传输,JWT结构简单,字节占用小。不需要在服务端保存会话信息,易于应用的扩展。

  1. Kong API网关的JWT令牌应用

下图是Kong认证的实际过程。

API网关的权限验证实践

 

如果配置中允许OPTIONS请求,并且请求的方法确实是OPTIONS,放行。

如果配置中设置了匿名消费者,并且有凭证,放行。这里是为了实现多重认证,通过配置匿名消费者来实现逻辑或的认证,此时必须有其他认证插件,当其他认证插件通过,jwt插件就不再验证,若不设置匿名,则既要jwt验证也要其他认证插件验证。

先后从query params,request header中查找token(根据配置的变量),token的格式为\s*[Bb]earer\s+(.+),如果从query params找到就返回了,不会再根据request header找。

如果没有找到token,或者token格式不对,并且不允许匿名,返回401。

如果没有找到token,并且允许匿名,根据配置的匿名的id查询消费者,增加request header:X-Consumer-ID、X-Consumer-Username和X-Anonymous-Consumer=true,id是自动生成的,username是配置时填写的,设置这个消费者的凭证是nil,放行。

如果找到token,且格式合法,jwt解码这个token,验证token的 clAIm,消费者,签名验证,过期验证,全部通过后,同匿名一样,增加步骤5中的request header,并且清除X-Anonymous-Consumer这个header。

以下是Kong网关集成OAuth插件的例子,首先启用OAuth插件,然后在将插件添加到需要集成权限的Service上。

API网关的权限验证实践

 


API网关的权限验证实践

 

请求的时候只要在HTTP Header带上“Content-Type:application/json”和“Authorization: Bearer 认证中心申请的JWT令牌”即可访问到所需的资源。

  1. Spring Cloud Gateway的JTW令牌应用

Spring Cloud Gateway是Spring官方基于Spring 5.0、Spring Boot 2.0和Project Reactor等技术开发的网关,Spring Cloud Gateway旨在为微服务架构提供一种简单而有效的统一的API路由管理方式。Spring Cloud Gateway作为Spring Cloud生态系中的网关,目标是替代ZUUL,其不仅提供统一的路由方式,并且基于Filter链的方式提供了网关基本的功能,例如:安全,监控/埋点,和限流等。

API网关的权限验证实践

 

使用Gateway全局过滤器获取JWT Token后进行用户认证及鉴权。下图为实现该过滤器的代码。

API网关的权限验证实践

 

  1. JWT令牌应用实例

1、登录获取token

API网关的权限验证实践

 

2、将token设置到Request Header后,访问资源服务

API网关的权限验证实践

 

3、当没有token访问资源服务时就会返回401

API网关的权限验证实践

 

  1. 总结

最后讲讲JWT的缺点,任何技术都不是完美的,所以我们得用辩证思维去看待任何一项技术。安全性没法保证,所以jwt里不能存储敏感数据。因为jwt的payload并没有加密,只是用Base64编码而已。无法中途废弃。因为一旦签发了一个jwt,在到期之前始终都是有效的,如果用户信息发生更新了,只能等旧的jwt过期后重新签发新的jwt。

续签问题。当签发的jwt保存在客户端,客户端一直在操作页面,按道理应该一直为客户端续长有效时间,否则当jwt有效期到了就会导致用户需要重新登录。那么怎么为jwt续签呢?最简单粗暴就是每次签发新的jwt,但是由于过于暴力,会影响性能。如果要优雅一点,又要引入redis解决,但是这又把无状态的jwt硬生生变成了有状态的,违背了初衷。所以印证了那句话,没有最好的技术,只有适合的技术。感谢大家的阅读,希望看完之后能对你有所收获。

本文简单的讨论API权限认证,关于API的限流等,后续将持续分享其他内容。码字不易,欢迎关注、点赞、收藏。



Tags:API网关   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
什么是API网关?
API 网关是什么?它有什么作用?为什么我们需要它?今天我们就来一起聊一聊。一、定义 在维基百科中,网关的定义是这样的:在计算机网络中,网关(英语:Gateway)是转发其他服务器通信数据的...【详细内容】
2023-07-30  Search: API网关  点击:(114)  评论:(0)  加入收藏
微服务为什么要用到API网关?
什么是微服务微服务架构(通常简称为微服务)是指开发应用所用的一种架构形式。通过微服务,可将大型应用分解成多个独立的组件,其中每个组件都有各自的责任领域。在处理一个用户请...【详细内容】
2023-04-13  Search: API网关  点击:(157)  评论:(0)  加入收藏
10大亮点!带你多角度了解云原生API网关Apache APISIX 3.0预览版
API 网关作为一个存在时间比较长的基础组件,一直致力于提供业务层面的限流限速、身份认证、可观测性等多方面的功能。随着服务端系统的迭代,越来越多的服务开始从裸金属迁移到...【详细内容】
2022-09-29  Search: API网关  点击:(720)  评论:(0)  加入收藏
Java原生API网关ShenYu
微服务网关 数据交互示意图 数据同步 admin与网关进行数据同步。数据同步是指在 shenyu-admin 后台操作数据以后,使用何种策略将数据同步到 Apache ShenYu 网关。Apache Shen...【详细内容】
2022-09-09  Search: API网关  点击:(865)  评论:(0)  加入收藏
API网关的权限验证实践
概述公司、个人开发的系统上线后,系统中 API 暴露到网络上会存在一定的安全风险,比如:爬虫、恶意访问、错误访问等。API没有安全性,用户可以任意注册即可无限次访问和调用API,且...【详细内容】
2022-04-26  Search: API网关  点击:(292)  评论:(0)  加入收藏
这样讲API网关,你应该能明白了吧
随着互联网技术的飞速发展,各类线上业务蓬勃发展,软件系统如雨后春笋般呈现在我们面前。 图片来自 Pexels为了提高系统的性能和可靠性,将应用服务进行拆分微服务化。作为系统入...【详细内容】
2021-04-07  Search: API网关  点击:(362)  评论:(0)  加入收藏
对API网关注册和接入的接口安全管理总结
今天谈下对API网关接入的接口服务进行安全管理方面的内容。在原来谈Kong网关的时候,曾经谈到Kong网关和安全相关的插件能力,其中包括了身份认证插件:Kong提供了Basic Authenti...【详细内容】
2020-12-30  Search: API网关  点击:(275)  评论:(0)  加入收藏
通过API网关实现微服务管控-限流,熔断和降级
今天准备谈下基于API网关来实现微服务治理管控中的服务限流,熔断和降级方面的内容。在前面谈微服务架构的时候也谈到过类似通过Hystrix,Sentinel来是服务限流熔断。包括也不...【详细内容】
2020-11-19  Search: API网关  点击:(445)  评论:(0)  加入收藏
给大家分享一款高性能api网关
在当前的互联网环境下,尤其是移动互联网的时代,用户通过手机APP可访问很多应用,作为应用的服务部分面对日益增多的客户,为了保证用户功能和体验,必然需要采用分布式等架构,以确保...【详细内容】
2020-11-06  Search: API网关  点击:(324)  评论:(0)  加入收藏
基于Apache APISIX的全流量API网关统筹集群流量
本文将从云原生时代的机遇和挑战说起,介绍一个全新的开源高性能云原生 API 网关——Apache APISIX,探讨如何解决云原生时代 API 网关所面临的一些痛点,最后介绍该开...【详细内容】
2020-10-13  Search: API网关  点击:(591)  评论:(0)  加入收藏
▌简易百科推荐
Meta如何将缓存一致性提高到99.99999999%
介绍缓存是一种强大的技术,广泛应用于计算机系统的各个方面,从硬件缓存到操作系统、网络浏览器,尤其是后端开发。对于Meta这样的公司来说,缓存尤为重要,因为它有助于减少延迟、扩...【详细内容】
2024-04-15    dbaplus社群  Tags:Meta   点击:(1)  评论:(0)  加入收藏
SELECT COUNT(*) 会造成全表扫描?回去等通知吧
前言SELECT COUNT(*)会不会导致全表扫描引起慢查询呢?SELECT COUNT(*) FROM SomeTable网上有一种说法,针对无 where_clause 的 COUNT(*),MySQL 是有优化的,优化器会选择成本最小...【详细内容】
2024-04-11  dbaplus社群    Tags:SELECT   点击:(1)  评论:(0)  加入收藏
10年架构师感悟:从问题出发,而非技术
这些感悟并非来自于具体的技术实现,而是关于我在架构设计和实施过程中所体会到的一些软性经验和领悟。我希望通过这些分享,能够激发大家对于架构设计和技术实践的思考,帮助大家...【详细内容】
2024-04-11  dbaplus社群    Tags:架构师   点击:(2)  评论:(0)  加入收藏
Netflix 是如何管理 2.38 亿会员的
作者 | Surabhi Diwan译者 | 明知山策划 | TinaNetflix 高级软件工程师 Surabhi Diwan 在 2023 年旧金山 QCon 大会上发表了题为管理 Netflix 的 2.38 亿会员 的演讲。她在...【详细内容】
2024-04-08    InfoQ  Tags:Netflix   点击:(5)  评论:(0)  加入收藏
即将过时的 5 种软件开发技能!
作者 | Eran Yahav编译 | 言征出品 | 51CTO技术栈(微信号:blog51cto) 时至今日,AI编码工具已经进化到足够强大了吗?这未必好回答,但从2023 年 Stack Overflow 上的调查数据来看,44%...【详细内容】
2024-04-03    51CTO  Tags:软件开发   点击:(9)  评论:(0)  加入收藏
跳转链接代码怎么写?
在网页开发中,跳转链接是一项常见的功能。然而,对于非技术人员来说,编写跳转链接代码可能会显得有些困难。不用担心!我们可以借助外链平台来简化操作,即使没有编程经验,也能轻松实...【详细内容】
2024-03-27  蓝色天纪    Tags:跳转链接   点击:(16)  评论:(0)  加入收藏
中台亡了,问题到底出在哪里?
曾几何时,中台一度被当做“变革灵药”,嫁接在“前台作战单元”和“后台资源部门”之间,实现企业各业务线的“打通”和全域业务能力集成,提高开发和服务效率。但在中台如火如荼之...【详细内容】
2024-03-27  dbaplus社群    Tags:中台   点击:(13)  评论:(0)  加入收藏
员工写了个比删库更可怕的Bug!
想必大家都听说过删库跑路吧,我之前一直把它当一个段子来看。可万万没想到,就在昨天,我们公司的某位员工,竟然写了一个比删库更可怕的 Bug!给大家分享一下(不是公开处刑),希望朋友们...【详细内容】
2024-03-26  dbaplus社群    Tags:Bug   点击:(9)  评论:(0)  加入收藏
我们一起聊聊什么是正向代理和反向代理
从字面意思上看,代理就是代替处理的意思,一个对象有能力代替另一个对象处理某一件事。代理,这个词在我们的日常生活中也不陌生,比如在购物、旅游等场景中,我们经常会委托别人代替...【详细内容】
2024-03-26  萤火架构  微信公众号  Tags:正向代理   点击:(14)  评论:(0)  加入收藏
看一遍就理解:IO模型详解
前言大家好,我是程序员田螺。今天我们一起来学习IO模型。在本文开始前呢,先问问大家几个问题哈~什么是IO呢?什么是阻塞非阻塞IO?什么是同步异步IO?什么是IO多路复用?select/epoll...【详细内容】
2024-03-26  捡田螺的小男孩  微信公众号  Tags:IO模型   点击:(10)  评论:(0)  加入收藏
站内最新
站内热门
站内头条