共有シークレットで JSON ウェブトークン (JWT) を使用する - Amazon Kendra

共有シークレットで JSON ウェブトークン (JWT) を使用する

次の例は、インデックスを作成するときに、共有シークレットトークンを使用した JSON ウェブトークン (JWT) を使用してユーザーアクセスコントロールを行う方法を示しています。

Console
  1. [Create index] (インデックスの作成) を選択して、新しいインデックスの作成を開始します。

  2. [Specify index details] (インデックスの詳細の指定) ページで、インデックスに名前と説明を付けます。

  3. [IAM role] (IAM ロール) には、ロールを選択するか、または [Create a new role] (新規ロールの作成) を選択し、新しいロールを作成してロール名を指定します。IAM ロールには、プレフィックス「AmazonKendra-」が付いています。

  4. その他のフィールドはすべてデフォルトのままにしておきます。[Next] (次へ) を選択します。

  5. [Configure user access control] (ユーザーアクセスコントロールの設定) ページの、[Access control settings] (アクセスコントロールの設定) で、[Yes] (はい) を選択し、アクセス制御にトークンを使用します。

  6. [Token configuration] (トークンの設定) で、[JWT with shared secret] (共有シークレットを使用したJWT) を [Token type] (トークンタイプ) として選択します。

  7. [共有シークレットに署名するためのパラメータ] で、[シークレットのタイプ] を選択します。既存の AWS Secrets Manager 共有シークレット、または新しい共有シークレットを使用できます。

    新しい共有シークレットを作成するには、[New] (新規) を選択し、次に、以下のステップを実行します。

    1. [New AWS Secrets Manager secret] (新規 シークレット) で、[Secret name] (シークレット名) を指定します。プレフィックス AmazonKendra- は、パブリックキーを保存すると追加されます。

    2. [Key ID] (キー ID) を指定します。キー ID は、トークンの JSON ウェブ署名をセキュア化するために使用されたキーを示すヒントです。

    3. トークンに署名 [Algorithm] (アルゴリズム) を選択します。これは、ID トークンの保護に使用される暗号化アルゴリズムです。RSA の詳細については、RSA Cryptography を参照してください。

    4. base64 URL でエンコードされたシークレットを入力して、[共有シークレット] を指定します。また、[シークレットの生成] を選択して、自分のシークレットを生成できます。シークレットが base64 URL でエンコードされていることを確認する必要があります。

    5. (オプション) 共有シークレットが有効になるタイミングを指定します。シークレットの有効開始日、有効期限、またはその両方を指定できます。シークレットは、指定された時間間隔の間、有効です。

    6. [Save secret] (シークレットの保存) を選択して新しいシークレットを保存します。

  8. (オプション) [詳細設定]:

    1. [Username] (ユーザーネーム) を指定して ACL チェックで使用します。

    2. 1 つ以上の [Groups] (グループ) を指定して、ACL チェックで使用します。

    3. トークン発行者を検証する [Issuer] (発行者) を指定します。

    4. [クレーム ID] を指定します。JWT のオーディエンスと一致する正規表現を指定する必要があります。

  9. [Provisioning details] (プロビジョニングの詳細) ページで、[Developer edition] (デベロッパーエディション) を選択します。

  10. [Create] (作成) を選択してインデックスを作成します。

  11. インデックスが作成されるまで待ちます。Amazon Kendra はインデックスのハードウェアをプロビジョニングします。この演算には時間がかかる場合があります。

CLI

JWT トークンは、AWS Secrets Manager の内部の共有シークレットで使用できます。シークレットは、base64 URL でエンコードされている必要があります。Secrets Manager ARN が必要で、Amazon Kendra ロールは Secrets Manager リソースで GetSecretValue へのアクセス許可を持っている必要があります。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 のデフォルト値は「ユーザー」です。GroupAttributeField のデフォルト値は「グループ」です。

次に、入力ファイルを使用して、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 ロールは Secrets Manager リソースで GetSecretValue へのアクセス許可を持っている必要があります。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' )