Amazon OpenSearch Service 现在支持 JSON Web Token(JWT)身份验证和授权

最近,Amazon OpenSearch 推出了一个新功能,支持 JWT 认证和授权。虽然这个功能在开源的 OpenSearch 中早已存在,但在托管的 Amazon OpenSearch 中的实现一直不够理想。

此前的授权方式

控制台登录
  1. 内部数据库:使用基本的用户名和密码进行 HTTP 验证。如果切换到其他认证方式(如 IAM 或 SAML),此验证方式将被禁用。
  2. IAM 主用户:实际上是通过 Cognito 进行验证。由于中国区没有用户池,设置为 IAM 作为主用户故无法使用。
  3. SAML 单点登录:与 SAML 身份提供商(如 Azure AD、Auth0)集成。SAML 身份验证仅能在浏览器中访问 OpenSearch Dashboard,开启 SAML 后会禁用基本的 HTTP 验证。
编程方式

对于 SDK 而言,可以通过在 HTTP 请求中携带用户名和密码,或使用 SignV4 携带 IAM 身份信息进行认证。

常见的解决方案包括:

  1. 控制台和 SDK 都使用内部数据库的主用户进行基本 HTTP 验证。
  2. 控制台使用内部数据库或 SAML 凭证登录 OpenSearch Dashboard,然后在权限认证中给 IAM 身份单独授权访问索引,这样编程方式就可以使用 SignV4 的签名算法访问集群资源。

JWT 与 OIDC

JWT 验证流程
  1. 客户端请求:客户端向服务器发出登录请求,提供用户凭证(例如用户名和密码)。
  2. 服务器验证凭证:服务器验证用户凭证的有效性。
  3. 生成 JWT:如果凭证有效,服务器生成一个包含用户身份信息和其他声明的 JWT,并使用服务器的私钥签名。
  4. 返回 JWT:服务器将签名的 JWT 返回给客户端。
  5. 客户端存储 JWT:客户端收到 JWT 后,将其存储在本地存储或 cookie 中,以便在后续请求中使用。
  6. 携带 JWT 的请求:客户端在每次请求时将 JWT 包含在 HTTP 请求头中(通常是 Authorization: Bearer )。
  7. 服务器验证 JWT:服务器接收到请求后,提取并解析 JWT,验证其签名、有效期和其他声明的合法性。
  8. 处理请求:如果 JWT 验证通过,服务器处理请求并返回响应;如果验证失败,返回 401 或 403 错误。

在这里插入图片描述

OIDC 验证流程

OpenID Connect(OIDC)是在 OAuth 2.0 协议之上构建的一个身份层,用于实现单点登录(SSO)和身份验证。以下是 OIDC 的详细验证流程:

  1. 客户端请求身份认证:客户端向身份提供者(IdP)发送身份认证请求,包含 client_id、redirect_uri、scope、response_type 和 state 参数。
  2. 用户身份验证:身份提供者显示登录界面,用户输入凭证进行身份验证。
  3. 同意授权:用户登录成功后,身份提供者可能会显示同意授权页面。
  4. 返回授权码:用户同意授权后,身份提供者重定向客户端到 redirect_uri,并附带一个授权码。
  5. 交换授权码:客户端使用授权码向身份提供者的 Token 端点发送请求,以交换 access token 和 ID token。
  6. 返回令牌:身份提供者验证授权码后,返回 access token 和 ID token。ID token 是一个包含用户身份信息的 JWT。
  7. 验证 ID token:客户端接收到 ID token 后,验证其签名、声明合法性和过期时间。
  8. 使用令牌:客户端使用 access token 访问受保护资源,并解码 ID token 中的用户身份信息。

在这里插入图片描述

OpenSearch 的 JWT 认证授权

2024 年 6 月 19 日Amazon OpenSearch 在全球区上线了 JWT 认证授权功能,中国区的北京和宁夏区域的此功能在 2024 年 6 月 23 日上线控制台增加了 JWT authentication and authorization 功能,启用此功能需要开启精细访问控制,并导入验证 JWT 有效性的证书。

在这里插入图片描述
在这里插入图片描述

配置Auth0

配置 JWT 认证授权的步骤包括在 IDP 中创建 API,并使用 API 获取 JWT。以下是使用 Auth0 生成 JWT 的示例代码:

import requests
import json# 配置
AUTH0_DOMAIN = "<domain>.auth0.com"
CLIENT_ID = "<CLIENT_ID>"
CLIENT_SECRET = "<CLIENT_SECRET>"
AUDIENCE = "https://auth0-jwt-authorize"
GRANT_TYPE = "client_credentials"
TOKEN_URL = f"https://{AUTH0_DOMAIN}/oauth/token"
OUTPUT_FILE_PATH = 'jwt_token.json'# 请求负载和头部
payload = {"client_id": CLIENT_ID,"client_secret": CLIENT_SECRET,"audience": AUDIENCE,"grant_type": GRANT_TYPE
}
headers = {"content-type": "application/json"
}# 发送 POST 请求获取 JWT
response = requests.post(TOKEN_URL, json=payload, headers=headers)# 处理响应
if response.status_code == 200:data = response.json()with open(OUTPUT_FILE_PATH, 'w') as file:json.dump(data, file, indent=4)print(f"JWT 已保存到文件: {OUTPUT_FILE_PATH}")
else:print(f"请求失败,状态码:{response.status_code}")print(response.text)

我们在Auth0中新建一个API,然后会帮我们生成一个Application。后续我们会使用这个Application的Client ID和Secret ID以及Domain的信息来登录。

在这里插入图片描述
也就是说这三个信息确定了一个身份池,然后符合规则的用户可以通过这个身份池来换取JWT。可以在Applications-Applications 中看到。

配置好之后,可以通过Auth0的API来拿到登录后的JWT,以下是一个官方给的教程可以用来测试功能,当然也可以集成到APP中。

auth0 也提供了示例代码供我们测试:

在这里插入图片描述
官方提供代码样例可读性不是很高,让我们用用requests来改写一下,这个代码会把生成的JWT存在一个Json文件里面,这样我们就能容易的复制出来。

import requests
import json# 配置
AUTH0_DOMAIN = "<domain>.auth0.com"
CLIENT_ID = "<CLIENT_ID>"
CLIENT_SECRET = "<CLIENT_SECRET>"
AUDIENCE = "https://auth0-jwt-authorize"
GRANT_TYPE = "client_credentials"
TOKEN_URL = f"https://{AUTH0_DOMAIN}/oauth/token"
OUTPUT_FILE_PATH = 'jwt_token.json'# 请求负载和头部
payload = {"client_id": CLIENT_ID,"client_secret": CLIENT_SECRET,"audience": AUDIENCE,"grant_type": GRANT_TYPE
}
headers = {"content-type": "application/json"
}# 发送POST请求获取JWT
response = requests.post(TOKEN_URL, json=payload, headers=headers)# 处理响应
if response.status_code == 200:data = response.json()with open(OUTPUT_FILE_PATH, 'w') as file:json.dump(data, file, indent=4)print(f"JWT已保存到文件: {OUTPUT_FILE_PATH}")
else:print(f"请求失败,状态码:{response.status_code}")print(response.text)

我们可以看到控制台多出了一个JWT authentication and authorization 新功能,使用这个功能需要先开启精细访问控制,我们需要在这里需要导入验证JWT有效性的证书。
在这里插入图片描述

服务端需要填写验证JWT的PEM证书,那么我们要从Auth0的API中拿到这个信息。使用如下代码从.well-known/jwks.json中解析出来需要的证书,然后填写到OpenSearch中。

import requests
from jwcrypto import jwk
import json# 配置
JWKS_URI = 'https://<domain>/.well-known/jwks.json'  # 替换为你的Auth0域名
OUTPUT_DIR = './pem_keys'  # 你希望保存PEM公钥的目录# 创建输出目录
import osif not os.path.exists(OUTPUT_DIR):os.makedirs(OUTPUT_DIR)# 获取JWKS
response = requests.get(JWKS_URI)
jwks = response.json()# 处理每一个JWK
for index, jwk_key in enumerate(jwks['keys']):try:key = jwk.JWK(**jwk_key)pem = key.export_to_pem(private_key=False, password=None).decode('utf-8')kid = jwk_key['kid']# 将PEM格式公钥写入文件pem_file_path = os.path.join(OUTPUT_DIR, f'{kid}.pem')with open(pem_file_path, 'w') as pem_file:pem_file.write(pem)print(f'PEM格式公钥已保存到文件: {pem_file_path}')except Exception as e:print(f'处理公钥时出错: {e}')

配置好后,可以在 OpenSearch 的安全配置中看到 “View JWT details” 信息,验证 JWT 的有效性。通过标准的 JWT 流程使用 Postman 验证时,将 JWT 输入到 Bearer token 中,即可进行验证。
在这里插入图片描述

postman测试JWT

然后我们按照标准的JWT流程进行验证,这里使用Postman,验证方式使用Bear token,我们把通过应用程序模拟的JWT输入进去。
在这里插入图片描述

编程方式访问(Python)

我们也可以使用编程方式来进行访问,其实就是上加上一个’Authorization’: 'Bearer '的请求头。

import requestsurl = "OpenSearch URL"payload = {}
headers = {'Authorization': 'Bearer <jwt token>'
}response = requests.request("GET", url, headers=headers, data=payload)print(response.text)

几个月前,我参与了一些内部功能的审核工作。当时认为,既然系统支持 JWT,那么这应该也意味着支持 OIDC IDP,并且能够解决中国区 Cognito 无法集成的问题。然而,通过测试发现,JWT 仅能在编程方式中使用,控制台仍然需要使用原来的认证方式。也就是说,预想的从控制台跳转到 OIDC IDP 的方式仍然无法实现。期待未来能够实现从控制台无缝跳转到 OIDC IDP 的目标,为用户提供更便捷和安全的使用体验。

参考文档
【1】https://aws.amazon.com/cn/about-aws/whats-new/2024/06/amazon-opensearch-service-jwt-authentication-authorization/

【2】https://www.amazonaws.cn/new/2024/amazon-opensearch-service-supports-json-web-token-authentication-and-authorization/

【3】https://docs.aws.amazon.com/zh_cn/opensearch-service/latest/developerguide/JSON-Web-tokens.html

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

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

相关文章

Android开发系列(十一)Jetpack Compose之Dialog

Dialogs是在应用程序中显示一些额外信息或进行用户交互的常见功能。Jetpack Compose中的Dialog可以通过使用AlertDialog组件来创建。 基本用法 下面通过示例来了解Dialog的使用。 OptIn(ExperimentalMaterial3Api::class) Composable fun AlertDialogExample(onDismissReques…

Redis 7.x 系列【9】数据类型之自动排重集合(Set)

有道无术&#xff0c;术尚可求&#xff0c;有术无道&#xff0c;止于术。 本系列Redis 版本 7.2.5 源码地址&#xff1a;https://gitee.com/pearl-organization/study-redis-demo 文章目录 1. 前言2. 常用命令2.1 SADD2.2 SCARD2.3 SISMEMBER2.4 SREM2.5 SSCAN2.6 SDIFF2.7 SU…

DiAtom 共生菌固氮作用产生的碳输出(ANACONDAS)

Amazon iNfluence on the Atlantic: CarbOn export from Nitrogen fixation by DiAtom Symbioses (ANACONDAS) 亚马逊对大西洋的影响&#xff1a;DiAtom 共生菌固氮作用产生的碳输出&#xff08;ANACONDAS&#xff09; 简介 该研究项目探讨了亚马逊河羽流对热带北大西洋西部…

ECharts 源码代码规范

代码规范 - Apache EChartsApache ECharts&#xff0c;一款基于JavaScript的数据可视化图表库&#xff0c;提供直观&#xff0c;生动&#xff0c;可交互&#xff0c;可个性化定制的数据可视化图表。https://echarts.apache.org/zh/coding-standard.html 源文件 [强制] JavaScr…

STM32-hal库学习(4)--usart/uart通信 (同时显示在oled)

前言&#xff1a; 关于usart详解&#xff1a; stm32-USART通信-CSDN博客 因为在oled上显示&#xff0c;我们直接在上一个工程进行修改&#xff1a; STM32_hal库学习&#xff08;3&#xff09;-OLED显示-CSDN博客 其他配置与oled显示工程保持不变&#xff0c;打开oled文件的…

并发编程工具集——Lock和Condition(上)(十二)

简述&#xff1a;Java SDK 并发包通过 Lock 和 Condition 两个接口来实现管程&#xff0c;其中 Lock 用于解决互斥问题&#xff0c;Condition 用于解决同步问题。 再造管程的理由和期望 理由&#xff1a;synchronized 没有办法解决“破坏不可抢占条件方案”。 原因是synchroniz…

Linux kernel 与 设备树

Linux kernel 与 设备树 1 介绍1.1 概述1.2 发展历程1.3 各版本发布时间及特色1.4 Linux 单内核1.5 Linux 内核网址1.6 NXP 官方镜像与 野火 鲁班猫镜像的区别 2 Linux 内核组成2.1 进程管理2.2 内存管理2.3 文件系统2.4 设备管理2.5 网络功能 3 Linux 内核编译3.1 编译 Kernel…

小程序发布必须进行软件测试吗?测试内容有哪些?

在如今移动互联网时代&#xff0c;小程序已成为许多企业广泛采用的一种营销手段&#xff0c;然而&#xff0c;发布小程序之前进行充分的软件测试是至关重要的&#xff0c;因为它不仅可以确保小程序的质量&#xff0c;还可以避免潜在的风险和损失。 在进行小程序发布前进行软件…

可逆质子陶瓷电化学电池(R-PCEC)作为新型能量存储与转换装置开发应用价值大

可逆质子陶瓷电化学电池&#xff08;R-PCEC&#xff09;作为新型能量存储与转换装置开发应用价值大 可逆质子陶瓷电化学电池&#xff08;R-PCEC&#xff09;&#xff0c;同时具有燃料电池与电解槽功能&#xff0c;能够实现电能、化学能相互转化&#xff0c;是最具有发展前景的能…

「51媒体」政企活动媒体宣发如何做?

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 媒体宣传加速季&#xff0c;100万补贴享不停&#xff0c;一手媒体资源&#xff0c;全国100城线下落地执行。详情请联系胡老师。 政企活动媒体宣发是一个系统性的过程&#xff0c;需要明确…

餐饮冷库安全守护神:可燃气体报警器检定的科学性与有效性

随着餐饮业的快速发展&#xff0c;冷库成为储存食材、保证食品质量的重要场所。 然而&#xff0c;由于冷库环境的特殊性&#xff0c;如密封性强、温度低、湿度大等&#xff0c;一旦冷库内发生可燃气体泄露&#xff0c;后果将不堪设想。因此&#xff0c;在餐饮冷库中安装并合理…

SpringBoot集成道历(实现道历日期查询)

官网地址&#xff1a;官网地址https://6tail.cn/calendar/api.html 1、导入依赖 <dependency><groupId>cn.6tail</groupId><artifactId>lunar</artifactId><version>1.3.9</version></dependency><dependency><group…

MQTT遗嘱信息(2)

接前一篇文章&#xff1a;MQTT遗嘱信息&#xff08;1&#xff09; 本文内容参考&#xff1a; 什么是MQTT遗嘱消息&#xff1f;如何配置和处理遗嘱消息&#xff1f;_mqtt last will-CSDN博客 MQTT 协议学习&#xff1a;Retained&#xff08;保留消息&#xff09; 与 LWT&#x…

shark云原生-日志管理体系-filebeat

文章目录 1. deploy 文件1.1 RBAC1.2. DaemonSet1.2.1. Elasticsearch 连接信息1.2.2. Volume 1.3. ConfigMap1.3.1. 日志收集路径1.3.2. 日志事件输出目标 2. 在控制平面节点上运行Filebeat3. 查看输出3.1. 关于处理器 processors 4. 日志收集配置4.1. 手动指定日志收集路径4.…

基于SpringBoot前后端分离旅游出行管理系统设计和实现(源码+LW+调试文档+讲解等)

&#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN作者、博客专家、全栈领域优质创作者&#xff0c;博客之星、平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌&#x1f497; &#x1f31f;文末获取源码数据库&#x1f31f;感兴趣的可以先收藏起来&#xff0c;还…

聚观早报 | iPhone 16核心硬件曝光;三星Galaxy全球新品发布会

聚观早报每日整理最值得关注的行业重点事件&#xff0c;帮助大家及时了解最新行业动态&#xff0c;每日读报&#xff0c;就读聚观365资讯简报。 整理丨Cutie 6月28日消息 iPhone 16核心硬件曝光 三星Galaxy全球新品发布会 苹果正多方下注布局AI商店 黄仁勋2024年薪酬3400…

Zynq7000系列FPGA中的DMA控制器简介(一)

DMA控制器&#xff08;DMAC&#xff09;使用64位AXI主接口来执行与系统存储器和PL外围设备之间的DMA数据传输&#xff0c;操作频率同CPU_2x的时钟速率。传输由DMA指令执行引擎控制。DMA引擎运行在一个小指令集上&#xff0c;该指令集提供了一种灵活的指定DMA传输的方法。这种方…

【电路笔记】-MOSFET放大器

MOSFET放大器 文章目录 MOSFET放大器1、概述2、电路图3、电气特性3.1 ** I D = F ( V G S ) I_D=F(V_{GS}) ID​=F(VGS​)**特性3.2 I D = F ( V D S ) I_D=F(V_{DS}) ID​=F(VDS​)特性4、MOSFET放大器5、输入和输出电压6、电压增益7、总结1、概述 在前面的文章中,我们已经…

基本的 Spring Boot 配置步骤和常见的配置项【创建,配置,日志,数据库,安全,MVC】

基本的 Spring Boot 配置步骤和常见的配置项【创建&#xff0c;配置&#xff0c;日志&#xff0c;数据库&#xff0c;安全&#xff0c;MVC】 学习总结 1、掌握 JAVA入门到进阶知识(持续写作中……&#xff09; 2、学会Oracle数据库入门到入土用法(创作中……&#xff09; 3、…

EAK高压电阻器-引线高压电阻器-厚膜高压电阻器

描述 EAK高压电阻器是扁平高压电阻器&#xff0c;完全满足低感、稳定和精密无源元件的所有要求。 扁平高压电阻器最适合作为组装在 PCB 上的有线元件&#xff0c;但也可以用作 SMD 元件。 我们提供 HVR、HPR、HVI、HVD 和 HVS 系列的扁平高压电阻器&#xff0c;这些电阻器具…