Amazon Web Services ブログ

AWS IAM アウトバウンド ID フェデレーションを使用して、外部サービスへのアクセスを簡素化

複数のクラウドプロバイダーにまたがるアプリケーションや、外部サービスと統合するアプリケーションを構築する場合、デベロッパーは、認証情報をセキュアに管理するという永続的な課題に直面します。従来のアプローチでは、API キーやパスワードなどの長期的な認証情報を保存する必要があり、セキュリティリスクと運用上のオーバーヘッドが生じていました。

2025 年 11 月 19 日、AWS Identity and Access Management (IAM) アウトバウンド ID フェデレーションという新機能を発表しました。この機能を使用すると、お客様は、長期的な認証情報を保存することなく、Amazon Web Services (AWS) ID を外部サービスに安全にフェデレーションできます。今後は、有効期間の短い JSON Web Token (JWT) を使用して、幅広いサードパーティープロバイダー、Software as a Service (SaaS) プラットフォーム、セルフホスト型アプリケーションで AWS ワークロードを認証できるようになります。

この特徴量により、IAM ロールやユーザーなどの IAM プリンシパルは、AWS ID をアサートする暗号署名された JWT を取得できます。サードパーティープロバイダー、SaaS プラットフォーム、オンプレミスアプリケーションなどの外部サービスは、トークンの署名を検証することでトークンの信頼性を検証できます。検証が成功すると、外部サービスにセキュアにアクセスできます。

仕組み
IAM アウトバウンド ID フェデレーションでは、お客様の AWS IAM 認証情報を、有効期間の短い JWT に交換します。これにより、長期的な認証情報に関連するセキュリティリスクを軽減しながら、一貫した認証パターンを実現できます。

AWS で実行されているアプリケーションが外部サービスとインタラクションする必要があるシナリオを、順を追って見ていきましょう。外部サービスの API またはリソースにアクセスするために、アプリケーションは、AWS Security Token Service (AWS STS) の `GetWebIdentityToken` API を呼び出して JWT を取得します。

次の図は、このフローを示しています:

  1. AWS で実行されているアプリケーションは、GetWebIdentityToken API を呼び出して AWS STS からのトークンをリクエストします。アプリケーションは、基盤となるプラットフォーム (Amazon EC2 インスタンスプロファイル、AWS Lambda 実行ロール、または他の AWS コンピューティングサービスなど) から取得した既存の AWS 認証情報を使用して、この API コールを認証します。
  2. AWS STS は、アプリケーションの ID をアサートする、暗号署名された JSON Web Token (JWT) を返します。
  3. アプリケーションは、認証のために JWT を外部サービスに送信します。
  4. 外部サービスは、JSON Web Key Set (JWKS) エンドポイントから検証キーを取得し、トークンの信頼性を検証します。
  5. 外部サービスは、これらの検証キーを使用して JWT の署名を検証し、トークンが本物であり、AWS によって発行されたものであることを確認します。
  6. 検証が成功すると、外部サービスは JWT を自身の認証情報と交換します。その後、アプリケーションは、これらの認証情報を使用して、目的の操作を実行できます。

AWS IAM アウトバウンド ID フェデレーションのセットアップ
この特徴量を使用するには、自分の AWS アカウントのためにアウトバウンド ID フェデレーションを有効にする必要があります。IAM に移動し、左側のナビゲーションペインで [アクセス管理] の下にある [アカウント設定] を選択します。

この特徴量を有効にすると、AWS は AWS アカウントのために一意の発行者 URL を生成します。この URL は、/.well-known/openid-configuration/.well-known/jwks.json にある OpenID Connect (OIDC) 検出エンドポイントをホストします。OpenID Connect (OIDC) 検出エンドポイントには、トークンの検証に必要なキーとメタデータが含まれています。

次に、IAM 許可を設定する必要があります。トークンをリクエストするには、IAM プリンシパル (ロールまたはユーザー) に sts:GetWebIdentityToken 許可が付与されている必要があります。

例えば、次の ID ポリシーは STS GetWebIdentityToken API に対するアクセスを指定し、IAM プリンシパルがトークンを生成できるようにします。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "sts:GetWebIdentityToken",
      "Resource": "*",
    }
  ]
}

この段階で、AWS アカウントによって発行されたトークンを信頼して受け入れるように外部サービスを設定する必要があります。具体的なステップはサービスによって異なりますが、一般的には次のステップが含まれます:

  1. AWS アカウントの発行者 URL を、信頼された ID プロバイダーとして登録する
  2. 検証するクレーム (オーディエンス、サブジェクトパターン) を設定する
  3. トークンクレームを外部サービスの許可にマッピングする

始めましょう
では、クライアント側のトークン生成とサーバー側の検証プロセスの両方を示す例を、順を追って見ていきましょう。

まず、STS GetWebIdentityToken API を呼び出して、AWS ID をアサートする JWT を取得します。API を呼び出すときに、対象オーディエンス、署名アルゴリズム、トークンの有効期間をリクエストパラメータとして指定できます。

  • Audience: JWT の `aud` クレームに、トークンの受信者 (例: “my-app”) が明らかになるように入力します
  • DurationSeconds: トークンの有効期間 (秒)。範囲は 60 秒 (1 分) から 3600 秒 (1 時間) で、デフォルトは 600 秒 (5 分) です
  • SigningAlgorithm: ES384 (P-384 と SHA-384 を使用した ECDSA) または RS256 (SHA-256 を使用した RSA) のいずれかを選択します
  • Tags (オプション): トークン内でカスタムクレームとして表示される key-value ペアの配列。これを使用することで、外部サービスがきめ細かなアクセス制御を実装できるようにするための追加コンテキストを含めることができます

AWS SDK for Python (Boto3) を使用して ID トークンを取得する例を次に示します。これは、AWS コマンドラインインターフェイス (AWS CLI) を使用して実行することもできます。


import boto3

sts_client = boto3.client('sts')
response = sts_client.get_web_identity_token(
    Audience=['my-app'],
    SigningAlgorithm='ES384',  # または 'RS256'
    DurationSeconds=300
)
jwt_token = response['IdentityToken']
print(jwt_token)

これにより、任意の JWT パーサーを使用して検査できる署名付き JWT が返されます。

{
eyJraWQiOiJFQzM4NF8wIiwidHlwIjoiSldUIiwiYWxnIjoiRVMzODQifQ.hey<REDACTED FOR BREVITY>...

このトークンは、JWT Debugger などの任意の JWT パーサーを使用してデコードできます。トークンのヘッダーには、ES384 (ECDSA) で署名されていることが示されています。


{
  "kid": "EC384_0",
  "typ": "JWT",
  "alg": "ES384"
}

また、ペイロードには、標準の OIDC クレームと AWS 固有のメタデータが含まれています。標準の OIDC クレームには、サブジェクト (“sub”)、オーディエンス (“aud”)、発行者 (“iss”) などが含まれます。

{
  "aud": "my-app",
  "sub": "arn:aws:iam::ACCOUNT_ID:role/MyAppRole",
  "https://sts.amazonaws.com/": {
    "aws_account": "ACCOUNT_ID",
    "source_region": "us-east-1",
    "principal_id": "arn:aws:iam::ACCOUNT_ID:role/MyAppRole"
  },
  "iss": "https://abc12345-def4-5678-90ab-cdef12345678.tokens.sts.global.api.aws",
  "exp": 1759786941,
  "iat": 1759786041,
  "jti": "5488e298-0a47-4c5b-80d7-6b4ab8a4cede"
}

また、AWS STS は、ID 固有のクレーム (アカウント ID、組織 ID、プリンシパルタグなど) とセッションコンテキストでトークンをエンリッチ化します。これらのクレームは、トークンリクエストの発信元であるコンピューティング環境とセッションに関する情報を提供します。AWS STS は、リクエスト元のプリンシパルのセッションコンテキストに基づいて、該当する場合にこれらのクレームを自動的に含めます。リクエストタグを API コールに渡すことで、トークンにカスタムクレームを追加することもできます。JWT で提供されるクレームの詳細については、ドキュメントページにアクセスしてください。

iss (発行者) クレームに注意してください。これは、信頼された AWS アカウントからトークンが発行されたことを検証するために外部サービスが使用する、アカウント固有の発行者 URL です。外部サービスは、発行者 URL の /.well-known/jwks.json エンドポイントでホストされているパブリック JSON Web Key Set (JWKS) エンドポイントで使用可能な AWS の検証キーを使用して署名を検証することで、JWT を検証できます。

では、外部サービスがこの ID トークンをどのように処理するのかを見てみましょう。

外部サービスが AWS トークンを検証するために使用できる Python の例のスニペットを次に示します:


import json
import jwt
import requests
from jwt import PyJWKClient

# 信頼された発行者リスト – EnableOutboundFederation API レスポンスから取得されます
TRUSTED_ISSUERS = [
    "https://EXAMPLE.tokens.sts.global.api.aws",
    # 信頼された AWS アカウント発行者の URL をここに追加します
    # EnableOutboundFederation API レスポンスから取得されます
]

def verify_aws_jwt(token, expected_audience=None):
    """Verify an AWS IAM outbound identity federation JWT"""
    try:
        # トークンから発行者を取得します
        unverified_payload = jwt.decode(token, options={"verify_signature": False})
        issuer = unverified_payload.get('iss')

 	# 発行者が信頼されていることを検証します
        if not TRUSTED_ISSUERS or issuer not in TRUSTED_ISSUERS:
            raise ValueError(f"Untrusted issuer: {issuer}")

        # PyJWKClient を使用して AWS から JWKS を取得します
        jwks_client = PyJWKClient(f"{issuer}/.well-known/jwks.json")
        signing_key = jwks_client.get_signing_key_from_jwt(token)

        # トークンの署名とクレームを検証します
        decoded_token = jwt.decode(
            token,
            signing_key.key,
            algorithms=["ES384", "RS256"],
            audience=expected_audience,
            issuer=issuer
        )
        return decoded_token
    except Exception as e:
        print(f"Token verification failed: {e}")
        return None

IAM ポリシーを使用したトークン生成へのアクセス制御
IAM プリンシパル (ロールやユーザーなど) が外部サービスでの認証用のトークンをリクエストするには、IAM ポリシーで sts:GetWebIdentityToken 許可が付与されている必要があります。AWS アカウント管理者は、ID ポリシー、サービスコントロールポリシー (SCP)、リソースコントロールポリシー (RCP)、仮想プライベートクラウドエンドポイント (VPCE) ポリシーなど、関連するすべての AWS ポリシータイプでこの許可を設定することで、アカウント内のどの IAM プリンシパルがトークンを生成できるのかを制御できます。

さらに、管理者は、新しい条件キーを使用して、署名アルゴリズム (sts:SigningAlgorithm)、許可されるトークンオーディエンス (sts:IdentityTokenAudience)、およびトークンの最大有効期間 (sts:DurationSeconds) を指定できます。条件キーの詳細については、「IAM および STS 条件キー」のドキュメントページにアクセスしてください。

知っておくべき追加情報
このリリースに関する重要な詳細を次に示します:

  • ご利用いただけるリージョン – AWS IAM アウトバウンド ID フェデレーションは、すべての AWS 商用リージョンAWS GovCloud (米国) リージョン、および中国リージョンで追加料金なしでご利用いただけます。
  • 料金 – この特徴量は追加料金なしでご利用いただけます。

AWS IAM アウトバウンド ID フェデレーションの使用を開始するには、AWS IAM コンソールにアクセスし、AWS アカウントでこの特徴量を有効にしてください。詳細については、「AWS ID と外部サービスのフェデレーション」ドキュメントページにアクセスしてください。

構築がうまくいきますように!
– Donnie

原文はこちらです。