

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

# 開始使用傳出聯合身分
<a name="id_roles_providers_outbound_getting_started"></a>

本指南說明如何為 AWS 您的帳戶啟用傳出聯合身分，並取得您的第一個 JSON Web Token (JWT) （使用 [GetWebIdentityToken](https://docs.aws.amazon.com/STS/latest/APIReference/API_GetWebIdentityToken.html) API)。您將啟用此功能、與外部服務建立信任關係、設定 IAM 許可，以及使用 AWS CLI 或 AWS SDK for Python (Boto3) 請求權杖。

## 先決條件
<a name="outbound-federation-prerequisites"></a>

開始前，請確保您具備以下條件：
+ 已安裝最新版本的 AWS CLI 或 Python 3.8 （或更新版本） 和 Boto3 （適用於 AWS SDK 範例）
+ 您可以在其中設定信任關係的外部服務帳戶 （例如外部雲端提供者、SaaS 提供者或測試應用程式）

**注意**  
此 `GetWebIdentityToken` API 無法在 STS 全域端點上使用。
`GetWebIdentityToken` API 產生的 JSON Web 權杖 (JWTs) 無法用於 AWS （透過 [AssumeRoleWithWebIdentity](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRoleWithWebIdentity.html) API) 的 OpenID Connect (OIDC) 聯合。

## 為您的帳戶啟用傳出聯合身分
<a name="enable-outbound-federation"></a>

您必須先啟用傳出聯合身分，才能請求字符。您可以使用 AWS 管理主控台或以程式設計方式使用 [EnableOutboundWebIdentityFederation](https://docs.aws.amazon.com/IAM/latest/APIReference/API_EnableOutboundWebIdentityFederation.html) API 來啟用此功能。

### 使用 AWS CLI
<a name="enable-using-cli"></a>

```
aws iam enable-outbound-web-identity-federation
```

### 使用適用於 Python 的 AWS SDK
<a name="enable-using-sdk"></a>

```
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 主控台
<a name="enable-using-console"></a>

導覽至 IAM，然後在左側導覽功能表的**存取管理**區段下選取**帳戶設定** 

![存取管理區段下方左側導覽中反白顯示的帳戶設定選單項目。](http://docs.aws.amazon.com/zh_tw/IAM/latest/UserGuide/images/outbound-screen-1.png)


啟用此功能後，請記下您的帳戶特定發行者 URL。在外部服務中設定信任關係時，您將使用此 URL。您也可以視需要使用 [GetOutboundWebIdentityFederationInfo](https://docs.aws.amazon.com/IAM/latest/APIReference/API_GetOutboundWebIdentityFederationInfo.html) API 擷取此發行者 URL。

![輸出聯合身分界面顯示已啟用狀態與停用按鈕和字符發行者 URL。](http://docs.aws.amazon.com/zh_tw/IAM/latest/UserGuide/images/outbound-screen-2.png)


## 在外部服務中建立信任關係
<a name="establish-trust-relationship"></a>

設定外部服務以信任和接受 AWS 帳戶發行的字符。具體步驟因服務而異，但通常涉及：
+ 將 AWS 您的帳戶發行者 URL 註冊為信任的身分提供者
+ 設定要驗證的宣告 （對象、主體模式）
+ 將字符宣告映射至外部服務中的許可

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

## 設定 IAM 許可
<a name="configure-iam-permissions"></a>

建立 IAM 政策，授予呼叫 [GetWebIdentityToken](https://docs.aws.amazon.com/STS/latest/APIReference/API_GetWebIdentityToken.html) API 的許可，並將政策連接到需要產生字符的 IAM 角色。

此範例政策授予具有特定限制的權杖產生存取權。它只允許以「https://api.example.com」為對象請求權杖，並強制執行權杖生命週期上限為 5 分鐘 (300 秒）。如需可用來強制執行權杖屬性的條件金鑰[IAM 和 AWS STS 條件內容索引鍵](reference_policies_iam-condition-keys.md)清單，請參閱 。

### IAM 政策範例
<a name="example-iam-policy"></a>

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

## 請求您的第一個 JSON Web 權杖 (JWT)
<a name="request-first-jwt"></a>

您可以使用 [GetWebIdentityToken](https://docs.aws.amazon.com/STS/latest/APIReference/API_GetWebIdentityToken.html) API 請求 JSON Web 權杖。您可以在呼叫 API 時指定下列參數：
+ **對象 （必要）：**字符的預期收件人。此值會在 JWT 中填入「aud」宣告。外部服務會驗證此宣告，以確保權杖適用於它們。
+ **SigningAlgorithm （必要）：**用於簽署字符的密碼編譯演算法。有效值為 ES384 和 RS256。使用 ES384 獲得最佳安全性和效能，或 RS256 與不支援 ECDSA 的系統具有更廣泛的相容性。
+ **DurationSeconds （選用）：**字符生命週期，以秒為單位。有效值的範圍為 60 到 3600。預設值為 300 (5 分鐘)。我們建議較短的字符生命週期，以提高安全性。
+ **標籤 （選用）：**要做為自訂宣告包含在字符中的鍵值對清單。外部服務可以使用這些宣告進行精細授權。

API 會傳回下列欄位：
+ **IdentityToken：**已簽署的 JWT 做為 base64url 編碼字串。在對外部服務的請求中包含此字符。
+ **過期：**字符過期時的 UTC 時間戳記。

### 使用 AWS CLI
<a name="using-aws-cli"></a>

```
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
<a name="using-aws-sdk-python"></a>

```
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 程式庫來檢查其內容。如需字符中包含之宣告[了解字符宣告](id_roles_providers_outbound_token_claims.md)的詳細資訊，請參閱 。

## 將字符與外部服務搭配使用
<a name="use-token-with-external-service"></a>

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

## 從 OpenID Connect (OIDC) 端點擷取驗證金鑰和中繼資料
<a name="fetch-verification-keys"></a>

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

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

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

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

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

### 使用 curl 擷取 JWKS
<a name="fetch-jwks-curl"></a>

```
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
<a name="fetch-using-sdk"></a>

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

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

### 基本宣告驗證
<a name="essential-claim-validations"></a>
+ **主旨 (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，以根據運算資源限制存取。如需[字符中包含的完整聲明清單，請參閱了解字符宣告](id_roles_providers_outbound_token_claims.md)。