

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 适用于 Amazon OpenSearch 服务的 JWT 身份验证和授权
<a name="JSON-Web-tokens"></a>

亚马逊 OpenSearch 服务现在允许您使用 JSON 网络令牌 (JWTs) 进行身份验证和授权。 JWTs 是基于 JSON 的访问令牌，用于授予单点登录 (SSO) 访问权限。您可以在 S OpenSearch ervice JWTs 中使用创建单点登录令牌来验证对您的 OpenSearch 服务域的请求。要使用 JWTs，必须启用精细访问控制，并且必须提供有效的 RSA 或 ECDSA PEM 格式的公钥。有关精细访问控制的更多信息，请参阅 Amazon Service [中的精细访问控制。 OpenSearch ](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/fgac.html)

您可以使用 OpenSearch 服务控制台、 AWS Command Line Interface (AWS CLI) 或配置 JSON Web 令牌 AWS SDKs。

## 注意事项
<a name="consider"></a>

在 JWTs 使用 Amazon OpenSearch 服务之前，您必须考虑以下几点：
+ 由于 PEM 格式的 RSA 公有密钥很大，我们建议使用 AWS 控制台配置 JWT 身份验证和授权。
+ 在为您指定主题和角色字段时，您必须提供有效的用户和角色 JWTs，否则，请求将被拒绝。
+ OpenSearch 2.11 是可用于 JWT 身份验证的最早兼容版本。

## 修改域访问策略
<a name="modifying"></a>

在将域配置为使用 JWT 身份验证和授权之前，必须更新域访问策略，以允许 JWT 用户访问该域。否则，所有传入的 JWT 授权请求都将被拒绝。为子资源 (/\*) 提供完全访问权限的建议域访问策略是：

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
      {
      "Effect": "Allow",
      "Principal": {
        "AWS": "*"
      },
      "Action": "es:ESHttp*",
      "Resource": "arn:aws:es:{{us-east-1}}:{{111122223333}}:domain/{{domain-name}}/*"
    }
  ]
}
```

------

## 配置 JWT 身份验证和授权
<a name="configuration"></a>

您可以在域创建过程中或通过更新现有域来启用 JWT 身份验证和授权。根据您选择的具体选项，设置步骤会略有差异。

以下步骤说明了如何在 OpenSearch 服务控制台中为 JWT 身份验证和授权配置现有域：

1. 在 “**域配置**” 下，导航到 “**JWT 身份验证和授权**” OpenSearch，选择 “**启用 JWT 身份验证和**授权”。

1. 配置要用于域的公有密钥。要执行此操作，您可以上传包含公有密钥的 PEM 文件，也可以手动输入。
**注意**  
如果上传或输入的密钥无效，则会在文本框上方显示一条警告，说明具体的问题。

1. （可选）您可以在“其他设置”下配置以下可选字段
   + **主题密钥** —您可以将此字段留空以使用您的默认`sub`密钥 JWTs.
   +  **角色密钥** —您可以将此字段留空以使用您的默认`roles`密钥 JWTs.

   完成更改后，请保存域。

## 使用 JWKS 端点验证 JWT
<a name="jwks-endpoint"></a>

您可以配置 JSON Web 密钥集 (JWKS) 端点 URL 来动态检索身份提供商的公钥，而不是配置静态公钥。配置 JWKS 端点后，S OpenSearch ervice 会自动获取和缓存用于验证 JWT 签名的公钥，从而无需在身份提供商轮换签名密钥时手动更新密钥。

JWKS 端点配置需要 OpenSearch 版本 3.3 或更高版本。

**注意**  
当同时配置 JWKS URL 和静态公钥时，JWKS URL 优先，静态公钥将被忽略。

### 向后兼容性
<a name="jwks-backward-compatibility"></a>

此功能保持了完全的向后兼容性：
+ 如果`JwksUrl`未指定或设置为 null，则系统使用现有的静态公钥机制。
+ 现有 JWT 配置无需修改即可继续运行。
+ 您可以通过更新域配置在静态密钥和 JWKS 之间切换。

### 配置 JWKS 端点
<a name="jwks-configuring"></a>

您可以使用 OpenSearch 服务控制台、或配置 API 配置 JWKS 终端节点。 AWS CLI

#### 控制台
<a name="jwks-console"></a>

**配置 JWKS 端点**

1. 在 “**域配置**” 下，导航到 **JWT 身份验证和授权。 OpenSearch**

1. 选择**启用 JWT 身份验证和授权。**

1. 对于**密钥来源**，请选择 **JWKS 网址。**

1. 输入您的身份提供商提供的 JWKS 终端节点 URL（例如）。`https://example.com/.well-known/jwks.json`

1. （可选）在 “**其他设置**” 下配置 “**主题密****钥” 和 “角色” 密钥**字段。

1. 选择**保存更改**。

#### AWS CLI
<a name="jwks-cli"></a>

以下 AWS CLI 命令为现有域上的 JWT 身份验证配置 JWKS 端点：

```
aws opensearch update-domain-config \
  --domain-name {{my-domain}} \
  --advanced-security-options '{"JWTOptions":{"Enabled":true, "JwksUrl":"{{https://example.com/.well-known/jwks.json}}", "SubjectKey":"{{sub}}", "RolesKey":"{{roles}}"}}'
```

#### 配置 API
<a name="jwks-api"></a>

以下对配置 API 的请求配置用于在现有域上进行 JWT 身份验证的 JWKS 端点：

```
POST https://es.{{us-east-1}}.amazonaws.com/2021-01-01/opensearch/domain/{{my-domain}}/config
{
  "AdvancedSecurityOptions": {
    "JWTOptions": {
      "Enabled": true,
      "JwksUrl": "{{https://example.com/.well-known/jwks.json}}",
      "RolesKey": "{{optional-roles-key}}",
      "SubjectKey": "{{optional-subject-key}}"
    }
  }
}
```

### JWT 标头要求
<a name="jwks-header-requirements"></a>

使用 JWKS 端点时，您的 JWT 标头必须包含用于验证的特定密钥的密钥 ID (`kid`)：

```
{
  "alg": "RS256",
  "typ": "JWT",
  "kid": "V-diposfUJIk5jDBFi_QRouiVinG5PowskcSWy5EuCo"
}
```

该`kid`值必须与 JWKS 端点响应中的密钥标识符匹配。

有关 JWKS 配置选项和安全设置的更多信息，请参阅文档中的[使用 JWKS 端点验证 J](https://docs.opensearch.org/latest/security/authentication-backends/jwt/#using-a-jwks-endpoint-to-validate-a-jwt) WT。 OpenSearch

## 使用 JWT 发送测试请求
<a name="test"></a>

创建具有指定主体和角色对的新 JWT 后，您可以发送测试请求。为此，请使用私钥通过创建 JWT 的工具签署您的请求。 OpenSearch 服务能够通过验证此签名来验证传入的请求。

**注意**  
如果您为 JWT 指定了自定义的主体密钥或角色密钥，则必须使用 JWT 的正确声明名称。

以下是如何使用 JWT 令牌通过域名的搜索端点访问 OpenSearch 服务的示例：

```
curl -XGET "$search_endpoint" -H "Authorization: Bearer <JWT>"
```

### 配置 JWT 身份验证和授权（AWS CLI）
<a name="cli"></a>

如果域存在，以下 AWS CLI 命令将启用 JWT 身份验证和授权： OpenSearch 

```
aws opensearch update-domain-config --domain-name <your_domain_name> --advanced-security-options '{"JWTOptions":{"Enabled":true, "PublicKey": "<your_public_key>", "SubjectKey": "<your_subject_key>", "RolesKey": "<your_roles_key>"}}'
```

#### 配置 JWT 身份验证和授权（通过 API 配置）
<a name="API"></a>

以下对配置 API 的请求在现有域 OpenSearch 上启用 JWT 身份验证和授权：

```
POST https://es.us-east-1.amazonaws.com/2021-01-01/opensearch/domain/my-domain/config
{
  "AdvancedSecurityOptions": {
    "JWTOptions": {
      "Enabled": true,
      "PublicKey": "public-key",
      "RolesKey": "optional-roles-key",
      "SubjectKey": "optional-subject-key"
   }  
  }
}
```

##### 生成密钥对
<a name="gen-key-pair"></a>

为了 JWTs 为您的 OpenSearch 域进行配置，您需要提供隐私增强邮件 (PEM) 格式的公钥。亚马逊 OpenSearch 服务目前在使用时支持两种非对称加密算法 JWTs：RSA 和 ECDSA。

要使用通用的 openssl 库创建 RSA 密钥对，请执行以下步骤：

1. `openssl genrsa -out privatekey.pem 2048`

1. `openssl rsa -in privatekey.pem -pubout -out publickey.pem`

在此示例中，`publickey.pem`文件包含用于 Amazon OpenSearch 服务的公钥，而`privatekey.pem`包含用于对 JWTs 发送到服务的文件进行签名的私有密钥。此外，如果您需要将私钥转换为常用`pkcs8`格式来生成，则可以选择将其转换为常用格式 JWTs。

如果您使用上传按钮将 PEM 文件直接添加到控制台，该文件的扩展名必须为 `.pem`，目前不支持其他文件扩展名，例如 `.crt`、`.cert` 或 `.key`。