共有シークレットで JSON ウェブトークン (JWT) を使用する
次の例は、インデックスを作成するときに、共有シークレットトークンを使用した JSON ウェブトークン (JWT) を使用してユーザーアクセスコントロールを行う方法を示しています。
- Console
-
-
[Create index] (インデックスの作成) を選択して、新しいインデックスの作成を開始します。
-
[Specify index details] (インデックスの詳細の指定) ページで、インデックスに名前と説明を付けます。
-
[IAM role] (IAM ロール) には、ロールを選択するか、または [Create a new role] (新規ロールの作成) を選択し、新しいロールを作成してロール名を指定します。IAM ロールには、プレフィックス「AmazonKendra-」が付いています。
-
その他のフィールドはすべてデフォルトのままにしておきます。[Next] (次へ) を選択します。
-
[Configure user access control] (ユーザーアクセスコントロールの設定) ページの、[Access control settings] (アクセスコントロールの設定) で、[Yes] (はい) を選択し、アクセス制御にトークンを使用します。
-
[Token configuration] (トークンの設定) で、[JWT with shared secret] (共有シークレットを使用したJWT) を [Token type] (トークンタイプ) として選択します。
-
[共有シークレットに署名するためのパラメータ] で、[シークレットのタイプ] を選択します。既存の AWS Secrets Manager 共有シークレット、または新しい共有シークレットを使用できます。
新しい共有シークレットを作成するには、[New] (新規) を選択し、次に、以下のステップを実行します。
-
[New AWS Secrets Manager secret] (新規 シークレット) で、[Secret name] (シークレット名) を指定します。プレフィックス
AmazonKendra-は、パブリックキーを保存すると追加されます。 -
[Key ID] (キー ID) を指定します。キー ID は、トークンの JSON ウェブ署名をセキュア化するために使用されたキーを示すヒントです。
-
トークンに署名 [Algorithm] (アルゴリズム) を選択します。これは、ID トークンの保護に使用される暗号化アルゴリズムです。RSA の詳細については、RSA Cryptography
を参照してください。 -
base64 URL でエンコードされたシークレットを入力して、[共有シークレット] を指定します。また、[シークレットの生成] を選択して、自分のシークレットを生成できます。シークレットが base64 URL でエンコードされていることを確認する必要があります。
-
(オプション) 共有シークレットが有効になるタイミングを指定します。シークレットの有効開始日、有効期限、またはその両方を指定できます。シークレットは、指定された時間間隔の間、有効です。
-
[Save secret] (シークレットの保存) を選択して新しいシークレットを保存します。
-
-
(オプション) [詳細設定]:
-
[Username] (ユーザーネーム) を指定して ACL チェックで使用します。
-
1 つ以上の [Groups] (グループ) を指定して、ACL チェックで使用します。
-
トークン発行者を検証する [Issuer] (発行者) を指定します。
-
[クレーム ID] を指定します。JWT のオーディエンスと一致する正規表現を指定する必要があります。
-
-
[Provisioning details] (プロビジョニングの詳細) ページで、[Developer edition] (デベロッパーエディション) を選択します。
-
[Create] (作成) を選択してインデックスを作成します。
-
インデックスが作成されるまで待ちます。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' )