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 os

if 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 requests

url = "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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【分布式系列】分布式锁在 Redis 主从部署中的挑战

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

易基因:围产期母体有毒物质暴露对子代血液、大脑和肝脏DNA甲基化的影响 | 研究速递

大家好&#xff0c;这里是专注表观组学十余年&#xff0c;领跑多组学科研服务的易基因。 母体在环境化学物质中暴露可能对后代的健康造成不利影响。越来越多的证据支持这些不良效应至少部分受表观遗传修饰调控。目前尚不清楚血液中的表观遗传变化是否反映了大脑皮层或肝脏等目…

【机器学习】K-means++: 一种改进的聚类算法详解

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 K-means: 一种改进的聚类算法详解引言1. K-means算法回顾1.1 基本概念1.2 局限性…

TEMU半托管模式引领跨境电商新风尚

TEMU半托管模式作为2024年的热门话题&#xff0c;正吸引着越来越多卖家的目光。继全托管模式取得巨大成功之后&#xff0c;半托管模式的推出无疑为跨境电商行业注入了新的活力。 在选品方向上&#xff0c;TEMU半托管模式强调商品的聚焦与精选。卖家在选择上架商品时&#xff0c…

数据恢复篇:适用于Windows 的顶级数据恢复软件

适用于Windows的免费和付费的最佳数据恢复软件 **嘿&#xff0c;我要和大家一起泄露所有的测试工具。在评论中留下您的想法和最喜欢的选择&#xff01; 适用于 Windows 的最佳数据恢复软件 1.奇客数据恢复 奇客数据恢复版是Microsoft操作系统的顶级数据恢复软件应用程序之一&a…

智能电表和普通电表有什么区别

智能电表和普通电表在多个方面存在显著的区别&#xff0c;以下是对这些区别的详细分析&#xff1a; 一、功能上的区别 1、电能计量功能&#xff1a; 普通电表&#xff1a;只有电能计量功能&#xff0c;用于记录用户消耗的电量。 智能电表&#xff1a;除了基本的电能计量功能…

ChatTTS源码部署

感谢阅读 默认已完成的操作准备工作下载源码安装依赖下载补丁(报错在运行) 界面展示(discord上有各种补丁&#xff0c;我的加了UI补丁和音色增强)提示词常用&#xff08;这个每个音基本都能生效&#xff09;语调类语速类情感类 默认已完成的操作 python版本>3.9 cuda版本的…

Windows 系统 Solr 8.11.3 安装详细教程(最新)

Windows 系统 Solr 8.11.3 安装详细教程 说明什么是Solr下载与解压如何启动启动命令&#xff1a;浏览器中打开dashboard其他命令查看关闭命令 说明 本次只是简单安装&#xff0c;为了在项目中使用&#xff0c;如果在公开服务器中安装需要更改开放端口&#xff0c;配置权限等。 …

java使用Graphics2D生成图片

UI图 实际图片数据库中只存了一个二维码转的base64的数组,直接导出只有一个二维码 这里使用 Graphics2D 画图 public static void main(String[] args) {// 假设你有一个Base64编码的字符串&#xff0c;它表示一张图片String base64ImageString "/9j/4AAQSkZJRgABAgAAA…

RabbitMQ的Fanout交换机

Fanout交换机 Fanout&#xff0c;英文翻译是扇出&#xff0c;我觉得在MQ中叫广播更合适。 在广播模式下&#xff0c;消息发送流程是这样的&#xff1a; 1&#xff09; 可以有多个队列2&#xff09; 每个队列都要绑定到Exchange&#xff08;交换机&#xff09;3&#xff09; …

秋招Java后端开发冲刺——非关系型数据库篇(Redis)

一、非关系型数据库 1. 主要针对的是键值、文档以及图形类型数据存储。 2. 特点&#xff1a; 特点说明灵活的数据模型支持多种数据模型&#xff08;文档、键值、列族、图&#xff09;&#xff0c;无需预定义固定的表结构&#xff0c;能够处理各种类型的数据。高扩展性设计为水…

8.计算机视觉—增广和迁移

目录 1.数据增广数据增强数据增强的操作代码实现2.微调 迁移学习 Transfer learning(重要的技术)网络结构微调:当目标数据集比源数据集小得多时,微调有助于提高模型的泛化能力。训练固定一些层总结代码实现1.数据增广 CES上的真实故事 有一家做智能售货机的公司,发现他们…

如何实现灌区闸门控制自动化?宏电“灌区哨兵”为灌区闸门控制添“智慧”动能

闸门控制站是节水灌溉工程中的重要组成部分。随着科技的不断进步和农田水利现代化的发展&#xff0c;传统的闸门控制和管理手段已经不能满足现代农业的发展要求。以宏电“灌区哨兵”为核心的闸门自动化控制系统&#xff0c;能有效解决灌区闸门距离远、数量多、不易操作、不好监…

Java操作Word文档

文章目录 Java操作Word文档引言1、技术选型结论 2、基础文本填充2.1 引入依赖2.1.1. poi2.1.2. poi-ooxml2.1.3. poi-ooxml-schemas 总结2.2 业务思路2.3 业务层 OfficeService2.4 通用工具类 OfficeUtils2.5 控制层 OfficeController 3、表格3.1 准备模板3.2 业务层 OfficeSer…

激光雷达数据处理与典型案例分析实践技术应用

激光雷达技术以其高精度、高效率的特点&#xff0c;已经成为地表特征获取、地形建模、环境监测等领域的重要工具。掌握激光雷达数据处理技能&#xff0c;不仅可以提升工作效率&#xff0c;还能够有效提高数据的质量和准确性&#xff0c;为决策提供可靠的数据支持。 随着激光雷…

烟火监测报警摄像机

当今社会&#xff0c;随着城市化进程的加快和人们生活水平的提高&#xff0c;烟火监测报警摄像机作为一种新型智能安防设备&#xff0c;正逐步在各个领域得到广泛应用&#xff0c;其在保障公共安全和预防火灾中的作用日益凸显。烟火监测报警摄像机利用先进的视觉识别技术和智能…

电脑怎么更改网络ip地址?四招助你轻松搞定

在数字化时代的浪潮中&#xff0c;电脑已成为我们日常生活和工作中不可或缺的工具。然而&#xff0c;随着网络技术的飞速发展&#xff0c;网络安全问题也日益凸显。为了保护个人隐私和网络安全&#xff0c;我们有时需要更改电脑的IP地址。本文将详细介绍如何轻松更改电脑的网络…

[Ant Design Vue 树控件Tree]内存溢出报错

使用ant design vue控件时发现报错&#xff0c;但是数据展示时没有问题的&#xff1b; 具体报错信息&#xff1a;Maximum call stack size exceeded 经排查&#xff0c;是我的目录下数据过多&#xff0c;差不多有小一万的数据&#xff1b; 查看官方文档&#xff0c;使用虚拟滚…

win11 下载 Chromium 源码并编译

环境准备&#xff1a; win11操作系统 16G内存 100G硬盘 能够翻墙的代理 python 3.9.x 本文只是列举主要过程&#xff0c;具体细节自己去研究。 1.安装vs2022 自行百度下载安装&#xff0c;注意win11要安装2022&#xff0c;不要安装2019 2.下载安装depot_tools 自行百…

机器学习Python代码实战(二)分类算法:k-最近邻

一.k-最近邻算法步骤 1.选择适当的k值。它表示在预测新的数据点时要考虑的邻居数量。 2.计算距离。计算未知点与其他所有点之间的距离。常用的距离计算方法主要有欧氏距离&#xff0c;曼哈顿距离等。 3.选择邻居。在训练集中选择与要预测的数据点距离最近的k个邻居。 4.预测…