アウトバウンド ID フェデレーションの開始方法 - AWS Identity and Access Management

アウトバウンド ID フェデレーションの開始方法

このガイドでは、AWS アカウントでアウトバウンド ID フェデレーションを有効にし、最初の JSON ウェブトークン (JWT) を取得する方法について解説します (GetWebIdentityToken API を使用)。この機能を有効にして、外部サービスとの信頼関係を設定し、IAM のアクセス許可を設定し、AWS CLI または AWS SDK for Python (Boto3) を使用してトークンをリクエストします。

前提条件

開始する前に、以下を確認してください。

  • 最新バージョンの AWS CLI または Python 3.8 (以降) と Boto3 をインストール済み (AWS SDK の例の場合)

  • 信頼関係を設定できる外部サービスアカウント (外部クラウドプロバイダー、SaaS プロバイダー、テストアプリケーションなど)

注記
  • GetWebIdentityToken API は STS Global エンドポイントでは使用できません。

  • GetWebIdentityToken API によって生成された JSON ウェブトークン (JWT) は、AWS への (AssumeRoleWithWebIdentity API を介した) OpenID Connect (OIDC) フェデレーションには使用できません。

アカウントでアウトバウンド ID フェデレーションを有効にする

トークンをリクエストする前に、アウトバウンド ID フェデレーションを有効にする必要があります。この機能を有効にするには AWS マネジメントコンソールを使用します。EnableOutboundWebIdentityFederation API を使用してプログラムで有効にすることもできます。

AWS CLI の使用

aws iam enable-outbound-web-identity-federation

AWS SDK for Python の使用

import boto3 # Create IAM client iam_client = boto3.client('iam') # Enable outbound identity federation response = iam_client.enable_outbound_web_identity_federation() print(f"Feature enabled. Issuer URL: {response['IssuerUrl']}") print(f"Status: {response['Status']}")

AWS コンソールの使用

IAM に移動し、左側のナビゲーションメニューの [アクセス管理] のセクションで [アカウント設定] を選択します。

この機能を有効にしたら、お使いのアカウントに固有の発行者 URL を書き留めます。この URL は、外部サービスで信頼関係を設定するときに使用します。発行者 URL は、必要に応じて GetOutboundWebIdentityFederationInfo API を使用して取得することもできます。

外部サービスで信頼関係を設定する

AWS アカウントが発行したトークンを信頼して受け入れるように、外部サービスを設定します。具体的なステップはサービスによって異なりますが、一般的に以下の手順が含まれます。

  • AWS アカウントの発行者 URL を信頼できる ID プロバイダーとして登録する

  • 検証するクレームを設定する (対象者、サブジェクトパターン)

  • トークンクレームを外部サービスのアクセス許可にマッピングする

詳しい設定手順については、外部サービスドキュメントを参照してください。

IAM 許可を設定する

GetWebIdentityToken API を呼び出すためのアクセス許可を付与する IAM ポリシーを作成し、このポリシーをトークンの生成に必要な IAM ロールにアタッチします。

以下のポリシー例では、特定の制限があるトークン生成へのアクセスを許可します。ここでは、対象者として「https://api.example.com」に対してのみトークンのリクエストを許可し、トークンの最大有効期間は 5 分 (300 秒) とします。トークンプロパティを適用する際に使用できる条件キーの一覧については、「IAM および AWS STS の条件コンテキストキー」を参照してください。

IAM ポリシーの例

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "sts:GetWebIdentityToken", "Resource": "*", "Condition": { "ForAnyValue:StringEquals": { "sts:IdentityTokenAudience": "https://api.example.com" }, "NumericLessThanEquals": { "sts:DurationSeconds": 300 } } } ] }

最初の JSON ウェブトークン (JWT) をリクエストする

JSON ウェブトークンは GetWebIdentityToken API を使用することでリクエストできます。API を呼び出すときは、次のパラメータを指定できます。

  • Audience (必須) トークンの意図された受信者。この値は、JWT に「aud」クレームを入力します。外部サービスは、このクレームを検証してトークンが自分たちの意図したものであることを確認します。

  • SigningAlgorithm (必須): トークンの署名に使用される暗号化アルゴリズム。有効な値は ES384 と RS256 です。セキュリティとパフォーマンスを最適化するときは ES384 を使用し、ECDSA をサポートしていないシステムとの互換性を高めるときは RS256 を使用します。

  • DurationSeconds (オプション): 秒単位で表示されるトークンの有効期間。有効な値の範囲は 60 ~ 3600 です。デフォルトは300(5分)です。セキュリティ強化のため、トークンの有効期間は短く設定することが推奨されます。

  • Tags (オプション): トークンにカスタムクレームとして含めるキーと値のペアのリスト。外部サービスは、これらのクレームを使って承認をきめ細かく行うことができます。

API は次のフィールドを返します。

  • IdentityToken: base64url でエンコードされた文字列として署名された JWT。外部サービスに対するリクエストにはこのトークンを含めます。

  • Expiration: トークンの有効期限を示す Unix UTC タイムスタンプ。

AWS CLI の使用

aws sts get-web-identity-token \ --audience "https://api.example.com" \ --signing-algorithm ES384 \ --duration-seconds 300 \ --tags Key=team,Value=data-engineering \ Key=environment,Value=production \ Key=cost-center,Value=analytics

AWS SDK for Python の使用

import boto3 sts_client = boto3.client('sts') response = sts_client.get_web_identity_token( Audience=['https://api.example.com'], DurationSeconds=300, SigningAlgorithm='RS256', Tags=[ {'Key': 'team', 'Value': 'data-engineering'}, {'Key': 'environment', 'Value': 'production'}, {'Key': 'cost-center', 'Value': 'analytics'} ] ) token = response['WebIdentityToken']

また、JWT をデコードし、PyJWT、Python–jose for Python、Nimbus JOSE+JWT for Java などの標準の JWT ライブラリ、または jwt.io などのデバッガーを使用して、その内容を調べることもできます。トークンに含まれるクレームの詳細については、「トークンクレームについて」を参照してください。

トークンを外部サービスで使用する

トークンを受信したら、これを外部サービスへのリクエストに含めます。方法はサービスによって異なりますが、ほとんどのサービスは承認のヘッダーでトークンを受け入れています。外部サービスは、AWS ワークロードへのアクセスを許可する前に、発行者の周知のエンドポイントから JWKS キーを取得し、トークンの署名を検証し、主要なクレームを検証するトークン検証ロジックを実装する必要があります。

検証キーとメタデータを OpenID Connect (OIDC) エンドポイントから取得する

AWS アカウントの一意の発行者 URL は、OpenID Connect (OIDC) 検出エンドポイント (トークンの検証に必要な検証キーとメタデータを含む) をホストしています。

この OIDC 検出エンドポイント URL には、一部のプロバイダーがトークンの検証に使用するメタデータが含まれています。こちらは次の場所で入手できます。

{issuer_url}/.well-known/openid-configuration

JWKS (JSON ウェブキーセット) エンドポイントには、トークン署名の検証に使用されるキーが含まれています。こちらは次の場所で入手できます。

{issuer_url}/.well-known/jwks.json

curl を使用して JWKS を取得する

curl https://{issuer_url}/.well-known/jwks.json

レスポンス:

{ "keys": [ { "kty": "EC", "use": "sig", "kid": "key-id-1", "alg": "ES384", "crv": "P-384", "x": "base64-encoded-x-coordinate", "y": "base64-encoded-y-coordinate" }, { "kty": "RSA", "use": "sig", "kid": "key-id-2", "n": "base64-encoded-modulus", "e": "AQAB" } ] }

AWS SDK for Python の使用

import requests # Fetch Openid Configuration open_id_config_response = requests.get("https://{issuer_url}/.well-known/openid-configuration") open_id_config = open_id_config_response.json() # Fetch JWKS jwks_response = requests.get("https://{issuer_url}/.well-known/jwks.json") jwks = jwks_response.json()

これらのキーは、トークンを検証するたびに取得しなくても済むようにキャッシュすることが推奨されます。

主要なクレームの検証

  • Subject (sub): サブジェクトクレームに起こり得る IAM プリンシパル ARN パターンが含まれていることを検証します。

  • Expiration (exp): トークンの有効期限が切れていないことを確認します。JWT ライブラリは通常、これを自動的に処理します。

  • Audience (aud): 対象者がユーザーの期待値と一致することを検証します。これにより、他のサービス向けのトークンが自分のサービスで使用されることを防げます。

  • Issuer (iss): 発行者が信頼できる AWS アカウントと一致することを検証します。信頼できる発行者 URL のリストを管理します。

ユーザーは可能な限り、追加された AWS に固有のクレームを検証し、外部サービスにきめ細かいアクセスコントロールを実装する必要があります。例えば、org_id クレームを検証して AWS Organization 内の IAM プリンシパルへのアクセスを制限したり、principal_tags をチェックして属性ベースのアクセスコントロールを適用したり (本番環境または特定のチームのみを許可するなど)、lambda_source_function_arn や ec2_instance_source_vpc などのセッションコンテキストクレームを検証してコンピューティングリソースに基づいてアクセスを制限したりするなどです。トークンに含まれるクレームの一覧については、「トークンクレームについて」を参照してください。