Verified Access でのユーザークレームの合格と署名の検証 - AWS 検証済みアクセス

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

Verified Access でのユーザークレームの合格と署名の検証

AWS Verified Access インスタンスがユーザーを正常に認証すると、IdP から受信したユーザークレームが Verified Access エンドポイントに送信されます。ユーザークレームは、アプリケーションが署名を検証し、クレームが Verified Access によって送信されたことを確認することができるように署名されます。このプロセス中に、次のHTTPヘッダーが追加されます。

x-amzn-ava-user-context

このヘッダーには、JSONウェブトークン (JWT) 形式のユーザークレームが含まれます。JWT 形式には、base64 でURLエンコードされたヘッダー、ペイロード、署名が含まれます。Verified Access は ES384 (ECDSA -SHA384 ハッシュアルゴリズムを使用した署名アルゴリズム) を使用してJWT署名を生成します。

アプリケーションはこれらのクレームをパーソナライズやその他のユーザー固有のエクスペリエンスに使用できます。アプリケーションデベロッパーは、使用前に ID プロバイダーから提供される各クレームの一意性と検証のレベルについて十分に理解しておく必要があります。一般に、sub クレームは、特定のユーザーを識別する最良の方法です。

例: OIDC ユーザークレームJWTの署名

次の例は、OIDCユーザークレームのヘッダーとペイロードが JWT 形式でどのように表示されるかを示しています。

ヘッダーの例:

{ "alg": "ES384", "kid": "12345678-1234-1234-1234-123456789012", "signer": "arn:aws:ec2:us-east-1:123456789012:verified-access-instance/vai-abc123xzy321a2b3c", "iss": "OIDC Issuer URL", "exp": "expiration" (120 secs) }

ペイロードの例:

{ "sub": "xyzsubject", "email": "xxx@amazon.com", "email_verified": true, "groups": [ "Engineering", "finance" ] }

例: IAM Identity Center ユーザークレームJWTの署名

次の例は、IAMIdentity Center ユーザークレームのヘッダーとペイロードが JWT 形式でどのように表示されるかを示しています。

注記

IAM Identity Center の場合、ユーザー情報のみがクレームに含まれます。

ヘッダーの例:

{ "alg": "ES384", "kid": "12345678-1234-1234-1234-123456789012", "signer": "arn:aws:ec2:us-east-1:123456789012:verified-access-instance/vai-abc123xzy321a2b3c", "iss": "arn:aws:ec2:us-east-1:123456789012:verified-access-trust-provider/vatp-abc123xzy321a2b3c", "exp": "expiration" (120 secs) }

ペイロードの例:

{ "user": { "user_id": "f478d4c8-a001-7064-6ea6-12423523", "user_name": "test-123", "email": { "address": "test@amazon.com", "verified": false } } }

パブリックキー

Verified Access インスタンスはユーザークレームを暗号化しないため、 を使用するように Verified Access エンドポイントを設定することをお勧めしますHTTPS。を使用するように Verified Access エンドポイントを設定する場合はHTTP、セキュリティグループを使用してエンドポイントへのトラフィックを制限してください。

セキュリティを確保するには、クレームに基づいて承認を行う前に署名を検証し、JWTヘッダーの signer フィールドに期待される Verified Access インスタンス が含まれていることを確認する必要がありますARN。

パブリックキーを取得するには、JWTヘッダーからキー ID を取得し、それを使用してエンドポイントからパブリックキーを検索します。

それぞれのエンドポイント AWS リージョン は次のとおりです。

https://public-keys.prod.verified-access.<region>.amazonaws.com/<key-id>

例: 取得とデコード JWT

次のコードは、Python 3.9 でキー ID、公開キー、およびペイロードを取得する方法を示しています。

import jwt import requests import base64 import json # Step 1: Validate the signer expected_verified_access_instance_arn = 'arn:aws:ec2:region-code:account-id:verified-access-instance/verified-access-instance-id' encoded_jwt = headers.dict['x-amzn-ava-user-context'] jwt_headers = encoded_jwt.split('.')[0] decoded_jwt_headers = base64.b64decode(jwt_headers) decoded_jwt_headers = decoded_jwt_headers.decode("utf-8") decoded_json = json.loads(decoded_jwt_headers) received_verified_access_instance_arn = decoded_json['signer'] assert expected_verified_access_instance_arn == received_verified_access_instance_arn, "Invalid Signer" # Step 2: Get the key id from JWT headers (the kid field) kid = decoded_json['kid'] # Step 3: Get the public key from regional endpoint url = 'https://public-keys.prod.verified-access.' + region + '.amazonaws.com/' + kid req = requests.get(url) pub_key = req.text # Step 4: Get the payload payload = jwt.decode(encoded_jwt, pub_key, algorithms=['ES384'])