開始使用傳出聯合身分 - AWS Identity and Access Management

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

開始使用傳出聯合身分

本指南說明如何為 AWS 您的帳戶啟用傳出聯合身分,並取得您的第一個 JSON Web Token (JWT) (使用 GetWebIdentityToken API)。您將啟用此功能、與外部服務建立信任關係、設定 IAM 許可,以及使用 AWS CLI 或 AWS SDK for Python (Boto3) 請求權杖。

先決條件

開始前,請確保您具備以下條件:

  • 已安裝最新版本的 AWS CLI 或 Python 3.8 (或更新版本) 和 Boto3 (適用於 AWS SDK 範例)

  • 外部服務帳戶,您可以在其中設定信任關係 (例如外部雲端提供者、SaaS 提供者或測試應用程式)

注意
  • GetWebIdentityToken API 無法在 STS 全域端點上使用。

  • GetWebIdentityToken API 產生的 JSON Web Token (JWTs) 無法用於 AWS (透過 AssumeRoleWithWebIdentity API) 的 OpenID Connect (OIDC) 聯合。

為您的帳戶啟用傳出聯合身分

您必須先啟用傳出聯合身分,才能請求字符。您可以使用 AWS 管理主控台或以程式設計方式使用 EnableOutboundWebIdentityFederation API 來啟用此功能。

使用 AWS CLI

aws iam enable-outbound-web-identity-federation

使用適用於 Python 的 AWS SDK

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。您也可以視需要使用 GetOutboundWebIdentityFederationInfo API 擷取此發行者 URL。

在外部服務中建立信任關係

設定外部服務以信任和接受 AWS 帳戶發行的字符。具體步驟因服務而異,但通常涉及:

  • 將 AWS 您的帳戶發行者 URL 註冊為信任的身分提供者

  • 設定要驗證的宣告 (對象、主體模式)

  • 將字符宣告映射至外部服務中的許可

如需詳細的組態指示,請參閱外部服務文件。

設定 IAM 許可

建立 IAM 政策,授予呼叫 GetWebIdentityToken API 的許可,並將政策連接到需要產生字符的 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 Web 權杖 (JWT)

您可以使用 GetWebIdentityToken API 請求 JSON Web 權杖。您可以在呼叫 API 時指定下列參數:

  • 對象 (必要):字符的預期收件人。此值會在 JWT 中填入「aud」宣告。外部服務會驗證此宣告,以確保權杖適用於它們。

  • SigningAlgorithm (必要):用於簽署字符的密碼編譯演算法。有效值為 ES384 和 RS256。使用 ES384 獲得最佳安全性和效能,或 RS256 與不支援 ECDSA 的系統具有更廣泛的相容性。

  • DurationSeconds (選用):字符生命週期,以秒為單位。有效值的範圍為 60 到 3600。預設值為 300 (5 分鐘)。我們建議較短的字符生命週期,以提高安全性。

  • 標籤 (選用):要做為自訂宣告包含在字符中的鍵值對清單。外部服務可以使用這些宣告進行精細授權。

API 會傳回下列欄位:

  • IdentityToken:簽署的 JWT 做為 base64url 編碼字串。在對外部服務的請求中包含此字符。

  • 過期:字符過期時的 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

使用適用於 Python 的 AWS SDK

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.io 等偵錯工具等標準 JWT 程式庫來檢查其內容。如需字符中包含之宣告了解字符宣告的詳細資訊,請參閱 。

搭配外部服務使用字符

收到字符後,將其包含在外部服務的請求中。該方法因服務而異,但大多數服務接受授權標頭中的字符。外部服務應實作權杖驗證邏輯,從發行者的已知端點擷取 JWKS 金鑰、驗證權杖的簽章,並在授予 AWS 工作負載存取權之前驗證基本宣告。

從 OpenID Connect (OIDC) 端點擷取驗證金鑰和中繼資料

您 AWS 帳戶的唯一發行者 URL 託管 OpenID Connect (OIDC) 探索端點,其中包含權杖驗證所需的驗證金鑰和中繼資料。

OIDC 探索端點 URL 包含一些提供者用來驗證字符的中繼資料。可在以下位置取得:

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

JWKS (JSON Web 金鑰集) 端點包含用於驗證字符簽章的金鑰。可在以下位置取得:

{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" } ] }

使用適用於 Python 的 AWS SDK

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()

我們建議您快取這些金鑰,以避免在每次權杖驗證時擷取它們。

基本宣告驗證

  • 主旨 (sub):確認主旨宣告包含預期的 IAM 主體 ARN 模式。

  • 過期 (exp):確保字符尚未過期。JWT 程式庫通常會自動處理。

  • 對象 (aud):驗證對象是否符合您的預期值。這可防止其他 服務的字符與您的 搭配使用。

  • 發行者 (iss):確認發行者符合您信任 AWS 的帳戶 (s)。維護信任的發行者 URLs清單。

您應該盡可能驗證額外的 AWS特定宣告,以在外部服務中實作精細存取控制。例如,驗證 org_id 宣告以限制對 AWS 組織中 IAM 主體的存取、檢查 principal_tags 以強制執行屬性型存取控制 (例如僅允許生產環境或特定團隊),或驗證工作階段內容宣告,例如 lambda_source_function_arn 或 ec2_instance_source_vpc,以根據運算資源限制存取。如需字符中包含的完整聲明清單,請參閱了解字符宣告