『Apisix安全篇』探索Apache APISIX身份认证插件:从基础到实战


🚀『Apisix系列文章』探索新一代微服务体系下的API管理新范式与最佳实践 【点击此跳转】


📣读完这篇文章里你能收获到

  • 🛠️ 了解APISIX身份认证的重要性和基本概念,以及如何在微服务架构中实施API安全。
  • 🔑 学习如何使用APISIX的Key Authentication插件进行API密钥管理,包括创建消费者和路由。
  • 🔄 掌握如何定期轮换API密钥,以及如何为不同消费者分配不同权限范围的密钥。
  • 📊 探索如何通过日志记录和监控来增强APISIX的安全性和可审计性。

文章目录

  • 一、引言
    • 1.1 APISIX身份认证基础
    • 1.2 APISIX支持的身份授权插件
  • 二、APISIX身份认证核心组件
    • 2.1 Consumer
    • 2.2 Key Authentication
  • 三、身份认证实战
    • 3.1 启用 Key Authentication
      • 3.1.1 创建消费者
      • 3.1.2 创建Routes
      • 3.1.3 验证
    • 3.2 自定义请求头Header
    • 3.3 禁用 Authentication
  • 四、最佳实践

一、引言

在现代微服务架构中,API的安全性至关重要。随着业务系统之间的交互越来越频繁,API成为了核心数据和服务的交换通道。Apache APISIX作为一款高性能的云原生API网关,提供了丰富的插件生态以满足各种API治理需求,其中身份认证就是关键的一环。

1.1 APISIX身份认证基础

API 网关主要作用是连接 API 消费者和提供者。出于安全考虑,在访问内部资源之前,应先对消费者进行身份验证和授权。
image.png

1.2 APISIX支持的身份授权插件

APISIX 拥有灵活的插件扩展系统,目前有很多可用于用户身份验证和授权的插件。

  • Key Authentication
  • Basic Authentication
  • JSON Web Token (JWT) Authentication
  • Keycloak
  • Casdoor
  • Wolf RBAC
  • OpenID Connect
  • Central Authentication Service (CAS)
  • HMAC
  • Casbin
  • LDAP
  • Open Policy Agent (OPA)
  • Forward Authentication
  • Multiple Authentications

二、APISIX身份认证核心组件

本文将以Apache APISIX内置的Key-Auth插件为例,详细介绍如何实现API的身份认证。

2.1 Consumer

Consumer(也称之为消费者)是指使用 API 的应用或开发人员。
在 APISIX 中,消费者需要一个全局唯一的 名称,并从上面的列表中选择一个身份验证 插件

2.2 Key Authentication

Key Authentication(也称之为密钥验证)是一个相对比较简单但是应用广泛的身份验证方法,基于HTTP Header中的API密钥对请求进行验证。每个客户端都拥有一个唯一的API密钥,当客户端发起请求时,必须在请求头中包含此密钥,服务器端的APISIX将会检查并验证该密钥的有效性。
它的设计思路如下:

  1. 管理员为路由添加一个身份验证密钥(API 密钥)。
  2. API 消费者在发送请求时,在查询字符串或者请求头中添加密钥。

三、身份认证实战

3.1 启用 Key Authentication

3.1.1 创建消费者

创建一个名为 consumer-key 的消费者,并启用 key-auth 插件,密钥设置为 secret-key。所有携带密钥 secret-key 的请求都会被识别为消费者 consumer-key。

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

3.1.2 创建Routes

创建一个名为routes-key的路由,并启用 key-auth 插件

curl -i "http://127.0.0.1:9180/apisix/admin/routes" \
-H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
{"id": "routes-key","name": "routes-key","uri": "/ip","upstream": {"type": "roundrobin","nodes": {"httpbin.org:80": 1}},"plugins": {"key-auth": {}}
}'

3.1.3 验证

Key-Auth插件默认的Headers前缀为apikey,如需修改,可继续往下看
我们可以在以下场景中进行验证:

  1. 发送不带任何密钥的请求
curl -i "http://127.0.0.1:9080/ip"

image.png

  1. 发送携带正确密钥的请求
curl -i "http://127.0.0.1:9080/ip" -H 'apikey: secret-key'

image.png

3.2 自定义请求头Header

如果你不想从默认的 apikey header 获取 key,可以自定义 header,如下所示:

{"key-auth": {"header": "Authorization"}
}

接下来基于上面的Routes进行更改

curl -i "http://127.0.0.1:9180/apisix/admin/routes/routes-key" \
-H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PATCH -d '
{"plugins": {"key-auth": {"header": "Authorization"}}
}'

发送携带Header为Authorization的请求进行验证

curl -i "http://127.0.0.1:9080/ip" -H 'Authorization: secret-key'

image.png

3.3 禁用 Authentication

将参数设置 _meta.disable 为 true,即可禁用密钥验证插件。

curl "http://127.0.0.1:9180/apisix/admin/routes/getting-started-ip" -X PATCH -d '
{"plugins": {"key-auth": {"_meta": {"disable": true}}}
}'

四、最佳实践

  1. 定期轮换密钥:为了增加安全性,建议定期更换API密钥,避免长期使用同一密钥导致安全风险增大。
  2. 权限细分:可以为不同消费者分配不同权限范围的密钥,用于访问不同的API资源。
  3. 监控与日志记录:利用Apache APISIX的日志插件记录相关的认证事件,以便于审计和异常检测。

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

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

相关文章

FreeRTOS(三)

第二部分 事件组 一、事件组的简介 1、事件 事件是一种实现任务间通信的机制,主要用于实现多任务间的同步,但事件通信只能是事件类型的通信,无数据传输。其实事件组的本质就是一个整数(16/32位)。可以是一个事件发生唤醒一个任务&#xff…

ClickHouse初体验

1.clickHouse是啥? ClickHouse 是俄罗斯的 Yandex 于 2016 年开源的列式存储数据库(DBMS),使用 C语言编写,主要用于在线分析处理查询(OLAP),能够使用SQL查询实时生成分析数据报告 2.clickHouse的特点 2.1列式存储 对于列的聚合&…

【华为OD机试】考勤信息【C卷|100分】

题目描述 公司用一个字符串来表示员工的出勤信息 absent:缺勤 late:迟到 leaveearly:早退 present:正常上班 现需根据员工出勤信息,判断本次是否能获得出勤奖,能获得出勤奖的条件如下: 缺勤不超过一次; 没有连续的迟到/早退; 任意连续7次考勤,缺勤/迟到/早退不超过3次…

Redis中的缓存雪崩、缓存击穿、缓存穿透问题

这里写目录标题 什么是缓存雪崩(缓存时效)雪崩的原因如何预防缓存雪崩 什么是缓存穿透(访问不存在的数据,比如查询id为负一的数据)导致缓存穿透的原因解决办法 什么是缓存击穿(高并发时缓存时效)缓存击穿的原因解决办法…

glob模块篇

文章目录 glob模块介绍搜索当前目录下的所有 .txt 文件:搜索特定目录下的所有 .py 文件:搜索子目录中的文件:使用通配符:glob.glob(pathname, *, root_dirNone, dir_fdNone, recursiveFalse, include_hiddenFalse)glob.iglob(path…

vue中数字转汉字,带小数转化

小数转为角分 export default { methods: { numberToChinese(num) { if (typeof num ! number || isNaN(num)) { return 输入的不是一个有效的数字; } const chineseNums [零, 一, 二, 三, 四, 五, 六, 七, 八, 九]; const units [, 十, 百, 千]; const bigUnits […

城市内涝排水新模式:慧天[HTWATER]

慧天[HTWATER]软件:慧天排水数字化分析平台针对城市排水系统基础设施数据管理的需求,以及水文、水力及水质模拟对数据的需求,实现了以数据库方式对相应数据的存储。可以对分流制排水系统及合流制排水系统进行地表水文、管网水力、水质过程的模…

Transformers 直观解释——不仅是如何工作,而且为什么工作得这么好

输入序列如何到达Attention模块 注意力模块存在于编码器堆栈中的每个编码器中,以及解码器堆栈中的每个解码器中。我们将首先放大编码器的注意力。 Attention in the Encoder: 举个例子,假设我们正在研究一个英语到西班牙语的翻译问题&…

【旅游】泉州攻略v1.0.0

一、泉州古城 泉州市距离深圳大约520公里,从深圳北站出发,高铁大约3小时30分。 到达泉州西站后,往东南方向大约8公里,就可以到达主要的旅游景点泉州古城。 古城很适合使用一天玩耍,核心路线如下: 一路的景…

C++ STL教程

C STL教程 文章目录 C STL教程1.1 std::vector1.1.1vector的定义1.1.2vector容器的初始化1.1.3vector容器内元素的访问和修改1.1.4vector中的常用函数 1.2 std::string1.2.1string的定义1.2.2string的初始化1.2.3string中元素的访问和修改1.2.4string中连接字符串1.2.5string中…

AtCoder Beginner Contest 337 A - E

A - Scoreboard 大意 高桥队和青木队进行了场比赛&#xff0c;给出每场比赛中高桥队和青木队的积分&#xff0c;问最后谁总分更高或平局。 思路 统计总分比较即可。 代码 #include<iostream> using namespace std; int main(){int n, a0, b0;cin >> n;while(…

介绍部署esxi8.0产品的方式

什么是esxi esxi的中文叫裸机虚拟机管理器 ESXi是由VMware公司开发的一种裸机虚拟机管理器&#xff0c;全称为VMware ESXi。 ESXi是一种虚拟化技术&#xff0c;专门设计用于在物理服务器上运行虚拟机&#xff0c;它的主要特点是能够最大限度地降低硬件配置要求并简化部署过程…

184. 部门工资最高的员工

文章目录 题意思路代码 题意 题目链接 查出每个部门最高工资 思路 子查询group by 代码 select b.name as Department,a.name as Employee,salary from Employee as a left joinDepartment as b ona.departmentId b.id where(a.departmentId, salary) in(select departme…

C++迈向精通:学习笔记:类属性与类方法

类属性与类方法 注意&#xff1a;这不是教程&#xff0c;是学习笔记&#xff0c;不适合初学者阅读&#xff01;&#xff01; 类属性与方法 成员属性与成员方法 在类中定义的方法与属性&#xff0c;就叫做成员属性与方法。 类属性与类方法 依然在类里面&#xff0c;但区别…

vcf文件可以用excel打开吗?四种解决方案

vcf文件可以用excel打开吗&#xff1f; 当然可以。 一、VCF文件简介 VCF&#xff08;vCard&#xff09;文件是一种用于存储联系人信息的文件格式。它通常包含姓名、电话号码、电子邮件地址、地址等详细信息。VCF文件在多种设备和操作系统中广泛使用&#xff0c;特别是在电子邮…

字节流 字符流回顾

字节流&#xff1a;字节流以字节为单位进行数据传输。这种流适用于处理二进制数据&#xff0c;例如图片、音频、视频等文件。在Java中&#xff0c;字节流由InputStream和OutputStream类及其子类实现。常见的字节流类包括FileInputStream、FileOutputStream、等。 字符流&#…

2024全国水科技大会【高峰对话】北京排水集团(附部分报告题目)

北京排水集团坚持“服务社会、造福百姓、企业利益与公众利益高度一致”的宗旨&#xff0c;充分认知自身在地区经济发展中的社会责任&#xff0c;以满足政府与公众对公用事业企业服务的需求为首要任务&#xff0c;通过“现代化的队伍、现代化的手段、现代化的设备和现代化的管理…

springBoot+ureport报表引擎

UReport是一款基于单元格迭代模型的纯Java中式报表引擎。它架构于Spring之上&#xff0c;因此与企业应用具有良好的集成能力。UReport提供了基于Eclipse插件与基于网页的两种报表模版设计方式&#xff0c;采用类Excel报表模版设计风格&#xff0c;简单、易上手&#xff0c;可在…

数据结构和算法:搜索

二分查找 二分查找&#xff08;binary search&#xff09; 是一种基于分治策略的高效搜索算法。它利用数据的有序性&#xff0c;每轮缩小一半搜索范围&#xff0c;直至找到目标元素或搜索区间为空为止。 给定一个长度为 &#x1d45b; 的数组 nums &#xff0c;元素按从小到大…

django orm DateTimeField 6位小数精度问题

from django.db.backends.mysql.base import DatabaseWrapperDatabaseWrapper.data_types[DateTimeField] "datetime"意思就是重写源码里面的DateTimeField字段