开源网关 Apache APISIX 认证鉴权精细化实战讲解

关注公众号并添加到“星标⭐”,防止错过消息

后台回复【资料包】获取学习资料

GitOps 新手入门到专家进阶实战详细教程

作者钱勇,API7.ai 开发工程师,Apache APISIX Committer

在当下云原生越发成熟的环境下,API 网关最核心的功能可以概括为:连接 API 消费者和 API 提供者。

实际场景中,除去少部分允许匿名访问的 API 外,提供者往往都会对消费者有所限制,比如只有符合条件的消费者才可以对 API 进行访问。其次,提供者对于不同的消费者的访问策略可能并不相同,例如 A、B 消费者都可以访问 /send_mail API,但每分钟的调用频次需要区分计算。

从以上两点可以看出在 API 网关层面鉴别和验证 API 消费者的身份至关重要。本文将介绍云原生开源 API 网关 Apache APISIX 如何实现对于消费者的认证,以及目前被企业广泛采用的认证方式。进一步介绍 APISIX 的用户认证体系是如何与其他安全特性联动使用,从而进一步提升 API 网关的安全防护能力。

c1b6f028009888f0dbe732c9ac8e5753.png

Apache APISIX 的认证鉴权

Apache APISIX 是一个动态、实时、高性能的 API 网关,提供负载均衡、动态上游、灰度发布、精细化路由、限流限速、服务降级、服务熔断、身份认证、可观测性等数百项功能。在认证鉴权方面,APISIX 也是提供了非常多且方便的途径。

传统的 HTTP 代理往往只能基于请求域名、客户端 IP 等粗粒度手段对请求方进行识别,这对于一款 API 网关来说是远远不够的,我们需要有更丰富的认证方式来解决越来越复杂的业务需求。而 APISIX 区分于传统代理的一大优势就是灵活的插件扩展能力,这其中就包括一套用于用户认证的插件集合,这些插件根据实现方式的不同可以分为两大类。

第一种是对接外部认证服务,委托其进行认证。d6cea25075fbbe9f370a50ff1eac4543.png第二种则是在网关内部认证,配合 APISIX 设计的 Consumer 对象进行认证。a9dddf05a8a98c3adf04836bb4ad1224.png

下面将会依次介绍这两种认证方式。

对接外部认证服务

在企业采用 API 网关之前,系统中往往已经部署了独立的认证服务,此时我们要如何将 APISIX 与已有的认证服务进行对接呢?APISIX 提供了这样一系列插件,它们的工作原理就是通过对接各种外部的认证服务,委托它们完成认证。

例如,我们可以使用 openid-connect 插件对接任意支持 OIDC 协议的认证服务,下面是一段对接到 Keycloak 服务的样例配置:

curl http://127.0.0.1:9180/apisix/admin/routes -H "X-Api-Key: your-API-key" -XPOST -d '
{"uri":"/*","plugins":{"openid-connect":{"client_id":"apisix", // keycloak 创建 client 时生成"client_secret":"d5c42c50-3e71-4bbe-aa9e-31083ab29da4","discovery":"http://keycloak:8080/auth/realms/apisix_test_realm/.well-known/openid-configuration", // keycloak OpenID Endpoint"scope":"openid profile","bearer_only":false,"realm":"apisix_test_realm","introspection_endpoint_auth_method":"client_secret_post","redirect_uri":"http://127.0.0.1:9080/"}},"upstream":{...}
}'

网关内部认证

Consumer

当来自多渠道的请求到达 API 网关后,网关需要识别出这些调用方。为此,Apache APISIX 提出了 Consumer 概念,用来代表某类服务的调用方。7b45b28172b85d7520f632911b517106.pngConsumer 对象需要配置认证插件进行使用,以最简单的 key-auth 插件为例:

curl http://127.0.0.1:9180/apisix/admin/consumers  -H 'X-API-KEY: your-API-key' -X PUT -i -d '
{"username": "jack","plugins": {"key-auth": {"key": "auth-jack"}
}'

以上配置表示当请求中携带指定的 key(auth-jack)时,当前请求将会与 jack 这个消费者进行关联。可以看到,Consumer 上配置的认证插件实际上就是一个指定认证机制下的身份凭证,在 key-auth 插件中,key 即是标识某个消费者的凭证,类似的还有 basic-auth 插件的用户名与密码等等。

为路由配置认证插件

当我们通过 Consumer 将凭证信息与具体的消费者进行关联后,还需要在相应的路由上开启认证插件:

curl http://127.0.0.1:9180/apisix/admin/routes/orders -H 'X-API-KEY: your-API-key' -X PUT -i -d '
{"uri": "/orders","plugins": {"key-auth": {"header": "Authorization"}}
}'

以上配置表示在 /orders 这个路由上开启 key-auth 插件,验证效果如下:

curl http://127.0.0.1:9080/orders -H 'Authorization: auth-jack' -iHTTP/1.1 200 OK
...curl http://127.0.0.1:9080/orders -H 'Authorization: wrong-key' -iHTTP/1.1 401 Unauthorized
...
{"message":"Invalid API key in request"}

当来自用户的请求命中这条路由时,APISIX 会尝试通过 Authorization 头部拿到用户提供的 Key。如果无法获取或者获取到的 Key 是不合法的,那么该请求将会被网关直接拒绝,从而保护上游服务。

可以看到以上两种认证方式中,认证插件都处于整个体系中的核心地位,它的丰富度将直接影响着 API 网关用户对于认证方式的选择空间。

APISIX 支持的认证方式

认证鉴权作为计算机世界从第一天起就存在的基础机制,经过这么多年的迭代,已经发展成为一个非常多样化的领域。而 APISIX 的插件机制极大地降低了实现各种认证方式的开发成本,以下是部分 APISIX 已经支持的主流认证方式。

Key Auth

Key Auth 是目前 APISIX 所支持的认证方式中,使用起来最简单的。但 key-auth 插件在实际环境中有着非常丰富的应用场景,例如:收费软件中的 License、开放 API 平台中的用于标识开发者的 token 等等,都可以非常轻松地使用 key-auth 来实现。并且基于 APISIX 全动态的配置下发能力,Key 可以被迅速创建、吊销,而且实时生效。

Basic Auth

Basic Auth 是基于用户名、密码进行认证的方式,常用于网页登录场景,例如:网站的管理后台需要管理员登录后才可以使用,那么我们可以使用 Basic Auth 方式进行认证。

LDAP

LDAP(Lightweight Directory Access Protocol)是一种基于 X.500 标准的轻量级文件访问协议,通过 IP 协议提供访问控制和维护分布式信息的目录信息,借助于 LDAP ,运维人员可以细粒度地控制用户对资源的访问权限。通过 APISIX 的 ldap-auth 插件,可以轻松对接实现了 LDAP 协议的平台,例如微软的 Active Direcory,或者 Linux 平台的 OpenLDAP Server,从而能够精细化地控制 Consumer 对具体路由的访问权限。

OIDC

OpenID 是一个去中心化的网上身份认证系统。对于支持 OpenID 的网站,用户不需要记住像用户名和密码这样的传统验证标记。取而代之的是,他们只需要预先在一个作为 OpenID 身份提供者(identity provider, IdP)的网站上注册账号,而后就可以用这个账号登录所有对接了该提供者的应用,例如:可以通过知名的 Google 或者 Facebook 服务的账号来认证我们自身系统的用户。

针对 OIDC,APISIX 提供了 openid-connect 插件,可以用于对接支持了 OIDC 协议的认证服务。

Forward Auth

当 APISIX 的标准认证插件无法满足你当前需求时,或者当前系统中已经部署了专门的并且是非标准协议的认证服务,此时你可以考虑使用 forward-auth 插件。使用该插件可以将用户的请求通过 HTTP 形式转发至认证服务中,并在认证服务响应非正常状态(错误码非 20x)时,返回自定义报错或者将用户重定向至认证页面。

借助 forward-auth 插件的能力,可以非常巧妙地将认证与授权逻辑转移到专门的、非标准协议的外部服务中。

“认证+任意功能”,APISIX 助力 API 安全

用户认证只是 APISIX 保障 API 安全的第一步,将认证能力与其他安全类型插件的有机结合将会进一步放大网关的安全能力。

ACL 访问控制

在一个复杂的后端系统中,可能会存在部分 API 的安全限制是高于其他 API 的,这种限制不仅需要拦截匿名用户,而且需要对认证用户进行限制,例如:只允许白名单用户访问用户管理 API。

a59a9881bc01e993f966dda532d779c7.png

此时我们可以使用 APISIX 提供的 consumer-restriction 插件去实现一个访问控制机制。

curl http://127.0.0.1:9180/apisix/admin/routes -H 'X-API-KEY: your-API-key' -X POST -i -d '
{"uri": "/api/v1/users/admin","plugins": {"key-auth": {},"consumer-restriction": {"whitelist": ["Rose","Peter]}},"upstream": {...},
}'

上述配置中,通过 key-authconsumer-restriction 两个插件限制了:/api/v1/users/admin 路由需要通过 key auth 认证,并且仅 Rose 和 Peter 可以访问。

限流限速

前面我们介绍了可以通过在 Consumer 中配置认证插件将用户凭证与消费者进行关联,事实 APISIX Consumer 对象不仅仅可以挂载认证类型的插件,而是可以像路由和 Service 一样,挂载任意插件。

以限流场景举例,在实际应用中,限流策略往往不是一成不变而是"千人千面",不同服务等级的调用方拥有不同的 API 限流策略是非常常见的需求,这样的需求是无法通过在路由上挂载限流插件进行解决的。为此,我们可以在消费者上挂载限流插件,并且为每一个消费者指定不同的限流策略。

curl http://127.0.0.1:9180/apisix/admin/consumers  -H 'X-API-KEY: your-API-key' -X PUT -i -d '
{"username": "jack","plugins": {"key-auth": {"key": "jack"},"limit-count": {"count": 200,"time_window": 60,"rejected_code": 503,"key": "$consumer_name",}
}'curl http://127.0.0.1:9180/apisix/admin/consumers  -H 'X-API-KEY: your-API-key' -X PUT -i -d '
{"username": "rose","plugins": {"key-auth": {"key": "rose"},"limit-count": {"count": 1000,"time_window": 60,"rejected_code": 503,"key": "$consumer_name",}
}'

通过上方的配置,我们为 jack 和 rose 分别指定了不同的限流策略。Rose 在 60 秒内拥有更多的请求次数配额 1000,而 Jack 只有 200 配额。

总结

认证鉴权作为 API 网关不可或缺的能力,已然成为用户在选型 API 网关时考量的重要因素之一。

本文中介绍的开源网关 Apache APISIX,覆盖了所有主流的认证方式,可以满足企业用户对于认证鉴权的需求。同时 APISIX 还拥有其他以下优势:

  • 丰富的、开箱即用的认证插件;

  • 同时支持内置、外置认证方式,用户可以自由选择;

  • 支持二次开发,方便对接自定义鉴权中心。

这些优势都可以帮助企业更轻松的落地网关层面的认证鉴权,加强 API 安全。

- END -

a7e761a3c944cab5f2b1f7ee2403806d.gif

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/279943.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python应用POP3、IMAP、SMTP 协议,获取邮箱验证码

POP3和IMAP是邮件相关的协议,IMAP是比POP3更高级一点的协议,实…

固件中启用的虚拟化否_哪些固件或硬件机制可启用强制关机?

固件中启用的虚拟化否At one time or another, all of us have had to force our computers to shut down by pushing and holding the power button down until they powered off. Is this mechanism hardware-based, firmware-based, or both? Today’s SuperUser Q&A p…

.NET 云原生架构师训练营(基于 OP Storming 和 Actor 的大型分布式架构二)--学习笔记...

▲ 点击上方“DotNet NB”关注公众号回复“1”获取开发者路线图学习分享 丨作者 / 郑 子 铭 这是DotNet NB 公众号的第202篇原创文章目录为什么我们用 OrleansDapr VS OrleansActor 模型Orleans 的核心概念结合 OP Storming 的实践结合 OP Storming 的实践业务模型设计模型代…

PHP 多维数组转json对象

PHP 多维数组转json对象 php 数组转json对象&#xff0c;可能大家都知道要用json_encode,但是转换出来的格式多有不同&#xff0c;此处做个小小的记录&#xff01; 1. 一维数组转json对象 <?php $arr_1 [one, two, three]; var_dump(json_encode($arr_1)); $arr_2 [0 >…

微软文本检索_如何在Microsoft Word中引用其他文档中的文本

微软文本检索You probably have some text that you type often in your Word documents, such as addresses. Instead of retyping this text every time you need it, you can put this common text into one Word document and reference it in other documents–it’ll eve…

Hadoop-Flume-类比吸尘器图解

2019独角兽企业重金招聘Python工程师标准>>> 这是我自己理解Hadoop-Flume的方式 转载于:https://my.oschina.net/u/3697442/blog/1560613

ChatGPT 之后,再玩玩 Stable-Diffusion

前些天体验的 ChatGPT 主要用来进行文本方面的处理&#xff0c;那么图片生成有没有这样的 AI 工具 呢&#xff1f;答案是肯定的。例如&#xff1a;和菜头公众号的题图和文章中的插图大多都是使用 Stable-Diffusion 的 AI 图形生成工具创作的。顺着 Stable-Diffusion 搜索了下相…

渗透测试入门DVWA 教程1:环境搭建

首先欢迎新萌入坑。哈哈。你可能抱着好奇心或者疑问。DVWA 是个啥&#xff1f; DVWA是一款渗透测试的演练系统&#xff0c;在圈子里是很出名的。如果你需要入门&#xff0c;并且找不到合适的靶机&#xff0c;那我就推荐你用DVWA。 我们通常将演练系统称为靶机&#xff0c;下面请…

移动硬盘改台式机硬盘_如何在台式机或移动设备上离线使用Google云端硬盘

移动硬盘改台式机硬盘If there’s any drawback to using cloud-based services for all your productivity and organization needs, it’s that if you can’t get an Internet connection, you’re basically out of luck. 如果使用基于云的服务来满足您的所有生产力和组织需…

你可能不知道的容器镜像安全实践

大家好&#xff0c;我是Edison。最近在公司搭建CI流水线&#xff0c;涉及到容器镜像安全的话题&#xff0c;形成了一个笔记&#xff0c;分享与你&#xff0c;也希望我们都能够提高对安全的重视。时代背景近年来应用程序逐步广泛运行在容器内&#xff0c;容器的采用率也是逐年上…

【Win 10 应用开发】UI Composition 札记(二):基本构件

在上一篇中&#xff0c;老周用一个示例&#xff0c;演示了框架视图的创建过程&#xff0c;在本篇中&#xff0c;老周将给大伙伴们说一下 Composition 构建 UI 的一些“零件”。 UI Composition 有一个核心类——对&#xff0c;就是 Compositor 类&#xff0c;它是总生产车间&am…

禁用内置键盘_如何禁用Windows 10的所有内置广告

禁用内置键盘Windows 10 has a lot of built-in advertising. This isn’t just about the free upgrade offer: Even if you purchase a new PC that comes with a Windows 10 license or spend $200 for a copy of Windows 10 Professional, you’ll see ads in your operati…

震惊!顶着 39.5℃高烧 ,我和这哥俩都聊了些啥?

这是头哥侃码的第271篇原创上周三&#xff0c;我邀请了两位嘉宾进入直播间&#xff0c;即便自己顶着 39.5 度的高烧&#xff0c;还是强打精神与这哥俩聊了俩小时。相信关注我的朋友们都知道&#xff0c;我是头哥侃码的主理人&#xff0c;同时也是上海TGO上海分会董事会成员。赵…

在Windows Mobile模拟器(Emulator)建立网络连接

因为想使用Windows Mobile Emulator进行网络通信程序的测试&#xff0c;所以找方法配置Emulator的网络连接。在网上找了一些文章&#xff0c;很多都说需要安装Virtual PC 2007. 例如下面的文章Enable Network Connection Windows Mobile 6 Emulator 如果需要 Virtual PC 2007 可…

api游戏编程鼠标选择拖动_如何选择合适的游戏鼠标

api游戏编程鼠标选择拖动You don’t need a gaming mouse to play PC games—just about any mouse with two buttons and a wheel will play anything you want it to. But that’s no reason to deny yourself the wonderful variety of gaming mouse designs on the market.…

iOS - 上架的APP 生成二维码下载

1.首先打开苹果App Store商店进入到里面&#xff0c;找到需要打开链接地址的应用程序&#xff0c;例如&#xff1a;百度。2. 在App Store商店里面先点击一下应用程序图标&#xff0c;再按一下…分享按钮。 3. 接着选择分享APP&#xff0c;再点击拷贝链接地址&#xff0c;将应用…

Rsa2加密报错java.security.spec.InvalidKeySpecException的解决办法

最近在和支付宝支付做个对接&#xff0c;Java项目中用到了RSA2进行加解密&#xff0c;在加密过程中遇到了错误&#xff1a; java.security.spec.InvalidKeySpecException: java.security.InvalidKeyException: IOException : algid parse error, not a sequence 代码执行到这句…

浅析领域驱动设计

1.概要DDD&#xff08;Domain-driven design&#xff0c;模型驱动设计&#xff09;是一种软件设计的指导思想&#xff0c;而非固定的一套公式化开发模板&#xff08;这样就会导致网络上出现各种基于自己或业务上的理解而产出的DDD落地的实现&#xff0c;会让很想学习的开发者迷…

Delphi实现的透明阴影以及蒙版效果菜单

QQ2010的皮肤控件目前实现了一部分&#xff0c;看到有些软件的菜单&#xff0c;都有阴影&#xff0c;透明等效果&#xff0c;于是开始重新实现菜单控件&#xff0c;QQ2009版的菜单控件&#xff0c;是自己从TComponent继承了完全模拟实现的一个菜单&#xff0c;虽然实现了菜单控…

cortana搜索框_如何在Windows 10任务栏上隐藏Cortana搜索框

cortana搜索框One of the most talked about features in the latest version of Windows 10 was the Cortana personal assistant that is integrated directly into the taskbar. But what if you don’t want to waste all that taskbar space? 最新版本的Windows 10中最受…