使用带有共享密钥的 JSON Web 令牌(JWT) - Amazon Kendra

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

使用带有共享密钥的 JSON Web 令牌(JWT)

以下示例说明如何在创建索引时将 JSON Web Token (JWT) 与共享密钥令牌一起用于用户访问控制。

Console
  1. 选择创建索引以开始创建新索引。

  2. 指定索引详细信息页面上,为您的索引指定名称和描述。

  3. 对于 IAM 角色,选择一个角色或选择创建新角色,并指定角色名称来创建新角色。该 IAM 角色将带有前缀 “AmazonKendra-”。

  4. 将所有其他字段保留为默认值。选择下一步

  5. 配置用户访问控制页面上,在访问控制设置下,选择以使用令牌进行访问控制。

  6. 令牌配置下,选择带有共享密钥的 JWT 作为令牌类型

  7. 用于签名共享密钥的参数下,选择密钥类型。您可以使用现有的 AWS Secrets Manager 共享密钥或创建一个新共享密钥。

    要创建新共享密钥,请选择新建,然后按照下列步骤操作:

    1. 在 “新 AWS Secrets Manager 密钥” 下,指定密钥名称。保存公有密钥时,将添加前缀 AmazonKendra-

    2. 指定键 ID。键 ID 是一个提示,指示哪些键用于保护令牌的 JSON Web 签名。

    3. 为令牌选择签名算法。这是用于保护 ID 令牌的加密算法。有关 RSA 的更多信息,请参阅 RSA 密码术

    4. 通过输入 base64 URL 编码的密钥来指定共享密钥。您也可以选择生成密钥来为您生成密钥。您必须确保该密钥是 base64 URL 编码的密钥。

    5. 可选)指定共享密钥何时有效。您可以指定密钥有效期的开始日期、截止日期,或同时指定两者。该密钥将在指定的时间间隔内有效。

    6. 选择保存密钥以保存新密钥。

  8. 可选)在高级配置下:

    1. 指定要在 ACL 检查中使用的用户名

    2. 指定要在 ACL 检查中使用的一个或多个

    3. 指定将验证颁发机构的颁发机构

    4. 指定声明 ID。您必须指定与 JWT 中的受众相匹配的正则表达式。

  9. 配置详细信息页面中,选择开发者版本

  10. 选择创建以创建索引。

  11. 等待您的索引创建完成。 Amazon Kendra 为您的索引配置硬件。此操作可能需要一些时间。

CLI

您可以将 JWT 令牌与内部的共享密钥一起使用。 AWS Secrets Manager该密钥必须是 base64 URL 编码的密钥。你需要 Secrets Manager ARN,而且你的 Amazon Kendra 角色必须有权访问该GetSecretValue资源。 Secrets Manager 如果您使用对 Secrets Manager 资源进行加密 AWS KMS,则该角色还必须有权访问解密操作。

要使用 JSON 输入文件创建索引,请先 AWS CLI 使用所需参数创建一个 JSON 文件:

{ "Name": "user-context", "Edition": "ENTERPRISE_EDITION", "RoleArn": "arn:aws:iam::account-id:role:/my-role", "UserTokenConfigurations": [ { "JwtTokenTypeConfiguration": { "KeyLocation": "SECRET_MANAGER", "Issuer": "optional: specify the issuer url", "ClaimRegex": "optional: regex to validate claims in the token", "UserNameAttributeField": "optional: user", "GroupAttributeField": "optional: group", "SecretManagerArn": "arn:aws:secretsmanager:us-west-2:account id:secret:/my-user-context-secret } } ], "UserContextPolicy": "USER_TOKEN" }

您可以覆盖默认的用户和组字段名称。UserNameAttributeField 的默认值为“user”。GroupAttributeField 的默认值为“groups”。

接下来,使用输入文件调用 create-index。例如,如果您的 JSON 文件名为 create-index-openid.json,则可以使用以下名称:

aws kendra create-index --cli-input-json file://create-index-openid.json

密钥必须采用以下格式 AWS Secrets Manager:

{ "keys": [ { "kid": "key_id", "alg": "HS256|HS384|HS512", "kty": "OCT", "use": "sig", //this value can be sig only for now "k": "secret", "nbf":"ISO1806 date format" "exp":"ISO1806 date format" } ] }

有关 JWT 的更多信息,请参阅 jwt.io

Python

您可以将 JWT 令牌与内部的共享密钥一起使用。 AWS Secrets Manager该密钥必须是 base64 URL 编码的密钥。你需要 Secrets Manager ARN,而且你的 Amazon Kendra 角色必须有权访问该GetSecretValue资源。 Secrets Manager 如果您使用对 Secrets Manager 资源进行加密 AWS KMS,则该角色还必须有权访问解密操作。

response = kendra.create_index( Name='user-context', Edition='ENTERPRISE_EDITION', RoleArn='arn:aws:iam::account-id:role:/my-role', UserTokenConfigurations=[ { "JwtTokenTypeConfiguration": { "KeyLocation": "URL", "Issuer": "optional: specify the issuer url", "ClaimRegex": "optional: regex to validate claims in the token", "UserNameAttributeField": "optional: user", "GroupAttributeField": "optional: group", "SecretManagerArn": "arn:aws:secretsmanager:us-west-2:account id:secret:/my-user-context-secret" } } ], UserContextPolicy='USER_TOKEN' )