

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

# 為 OpenID Connect 聯合身分建立角色 (主控台)
<a name="id_roles_create_for-idp_oidc"></a>

您可以使用 OpenID Connect (OIDC) 聯合身分提供者，而不是在您的 中建立 AWS Identity and Access Management 使用者 AWS 帳戶。使用身分提供者 (IdP)，您可以在 外部管理您的使用者身分， AWS 並授予這些外部使用者身分存取 AWS 您帳戶中資源的許可。如需有關聯合身分與 IdP 的詳細資訊，請參閱 [身分提供者和聯合身分 AWS](id_roles_providers.md)。

## 建立適用於 OIDC 的角色的先決條件
<a name="idp_oidc_Prerequisites"></a>

您必須先完成以下先決條件步驟，然後才能建立用於 OIDC 聯合身分的角色。<a name="oidc-prereqs"></a>

**若要準備建立用於 OIDC 聯合身分的角色**

1. 使用一或多個提供聯合 OIDC 身分的服務進行註冊。如果您要建立需要存取 AWS 資源的應用程式，您也可以使用提供者資訊來設定應用程式。當您這麼做時，提供者會將應用程式唯一的 ID 提供給您的應用程式或對象。(不同的提供者可能使用不同的術語來表達此程序。本指南則使用術語*設定*來表示向提供者識別您應用程式的程序)。您可以在每個提供者設定多個應用程式，或在單一應用程式設定多個提供者。檢視有關使用身分提供者的相關資訊，如下所示：
   + [Login with Amazon 開發人員中心](https://login.amazon.com/)
   + Facebook 開發人員網站上的[新增 Facebook 登入到您的應用程式或網站](https://developers.facebook.com/docs/facebook-login/v2.1)。
   + Google 開發人員網站上的[登入時使用 OAuth 2.0 (OpenID Connect)](https://developers.google.com/accounts/docs/OAuth2Login)。

1. <a name="idpoidcstep2"></a>從 IdP 收到必要資訊後，請在 IAM 中建立 IdP。如需詳細資訊，請參閱[在 IAM 中建立 OpenID Connect (OIDC) 身分提供者](id_roles_providers_create_oidc.md)。
**重要**  
如果您正在使用來自 Google、Facebook 或 Amazon Cognito 的 OIDC IdP，請勿在 AWS 管理主控台中建立單獨的 IAM IdP。這些 OIDC 身分提供者已內建於 AWS ，可供您使用。略過此步驟，並在接下來的步驟中使用您的 IdP 建立新角色。

1. 為已進行 IdP 身分驗證的使用者要擔任的角色準備政策。正如任何角色一樣，手機應用程式的角色含有兩項政策。其中一項是信任政策，其指定擔任該角色的對象。另一項政策是許可政策，其指定行動應用程式被允許或拒絕存取的 AWS 動作和資源。

   對於 Web 身分提供者，我們建議您使用 [Amazon Cognito](https://aws.amazon.com/cognito/) 來管理身分。在這種情況下，請使用類似於這個範例的信任政策。

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": {
           "Effect": "Allow",
           "Principal": {"Federated": "cognito-identity.amazonaws.com"},
           "Action": "sts:AssumeRoleWithWebIdentity",
           "Condition": {
               "StringEquals": {"cognito-identity.amazonaws.com:aud": "us-east-2:12345678-abcd-abcd-abcd-123456"},
               "ForAnyValue:StringLike": {"cognito-identity.amazonaws.com:amr": "unauthenticated"}
           }
       }
   }
   ```

------

   以 Amazon Cognito 指派給您的身分集區 ID 取代 `us-east-2:12345678-abcd-abcd-abcd-123456`。

   如果您手動設定 OIDC IdP，當您建立信任政策，您必須使用三個值，以確保只有您的應用程式可擔任該角色：
   + 對於 `Action` 元素，可使用 `sts:AssumeRoleWithWebIdentity` 動作。
   + 如需 `Principal` 元素，請使用字串 `{"Federated":providerUrl/providerArn}`。
     + 對於一些常見的 OIDC IdP，`providerUrl` 為 URL。以下範例包含多個方式，為部分常見 idP 指定主體：

       `"Principal":{"Federated":"cognito-identity.amazonaws.com"}`

       `"Principal":{"Federated":"www.amazon.com"}`

       `"Principal":{"Federated":"graph.facebook.com"}`

       `"Principal":{"Federated":"accounts.google.com"}`
     + 對於其他的 OIDC 提供者，請使用您在 [Step 2](#idpoidcstep2) 中建立的 OIDC 身分提供者的 Amazon Resource Name (ARN)，如以下範例所示：

       `"Principal":{"Federated":"arn:aws:iam::123456789012:oidc-provider/server.example.com"}`
   + 對於 `Condition` 元素，可使用 `StringEquals` 條件來限制許可。測試身分集區 ID (對於 Amazon Cognito) 或應用程式 ID (對於其他提供者)。身分集區 ID 應與您透過 IdP 配置應用程式時所收到的應用程式 ID 一致。ID 之間的比對可確保請求來自您的應用程式。
**注意**  
Amazon Cognito 身分集區的 IAM 角色信任服務主體 `cognito-identity.amazonaws.com` 擔任該角色。此類型的角色必須包含至少一個條件索引鍵，以限制可擔任該角色的主體。  
其他考量事項適用於擔任[跨帳戶 IAM 角色](access_policies-cross-account-resource-access.md)的 Amazon Cognito 身分集區。這些角色的信任政策必須接受 `cognito-identity.amazonaws.com` 服務主體，且必須包含 `aud` 條件索引鍵，以限制來自您預期身分集區的使用者擔任角色。如果不符合此條件，信任 Amazon Cognito 身分集區的政策會產生意外身分集區中的使用者可能擔任該角色的風險。如需詳細資訊，請參閱 *Amazon Cognito Developer Guide* 中的 [Trust policies for IAM roles in Basic (Classic) authentication](https://docs.aws.amazon.com/cognito/latest/developerguide/iam-roles.html#trust-policies)。

     建立類似以下其中一個範例的條件元素，其取決於您使用的 IdP：

     `"Condition": {"StringEquals": {"cognito-identity.amazonaws.com:aud": "us-east:12345678-ffff-ffff-ffff-123456"}}`

     `"Condition": {"StringEquals": {"www.amazon.com:app_id": "amzn1.application-oa2-123456"}}`

     `"Condition": {"StringEquals": {"graph.facebook.com:app_id": "111222333444555"}}`

     `"Condition": {"StringEquals": {"accounts.google.com:aud": "66677788899900pro0"}}`

     對於 OIDC 提供者，請將 OIDC IdP 的完全合格 URL 與 `aud` 內容索引鍵一起使用，如以下範例所示：

     `"Condition": {"StringEquals": {"server.example.com:aud": "appid_from_oidc_idp"}}`
**注意**  
角色的信任政策中的主體的值是 IdP 特有的。OIDC 的角色只能指定一個主體。因此，如果行動應用程式允許使用者從多個 IdP 登入，則為您要支援的每個 IdP 建立不同的角色。分別為每個 IdP 建立信任政策。

   如果使用者使用行動應用程式從 Login with Amazon 登入，則以下範例信任政策適用。在範例中，*amzn1.application-oa2-123456* 代表使用 Login with Amazon 設定應用程式時 Amazon 指派的應用程式 ID。

------
#### [ JSON ]

****  

   ```
   {
         "Version":"2012-10-17",		 	 	 
         "Statement": [{
             "Sid": "RoleForLoginWithAmazon",
             "Effect": "Allow",
             "Principal": {"Federated": "www.amazon.com"},
             "Action": "sts:AssumeRoleWithWebIdentity",
             "Condition": {"StringEquals": {"www.amazon.com:app_id": "amzn1.application-oa2-123456"}}
         }]
     }
   ```

------

   如果使用者使用行動應用程式從 Facebook 登入，則以下範例信任政策適用。在本範例中，*111222333444555* 代表 Facebook 指派的應用程式 ID。

------
#### [ JSON ]

****  

   ```
   {
         "Version":"2012-10-17",		 	 	 
         "Statement": [{
             "Sid": "RoleForFacebook",
             "Effect": "Allow",
             "Principal": {"Federated": "graph.facebook.com"},
             "Action": "sts:AssumeRoleWithWebIdentity",
             "Condition": {"StringEquals": {"graph.facebook.com:app_id": "111222333444555"}}
         }]
     }
   ```

------

   如果使用者使用行動應用程式從 Google 登入，則以下範例信任政策適用。在本範例中，*666777888999000* 代表由 Google 指派的應用程式 ID。

------
#### [ JSON ]

****  

   ```
   {
         "Version":"2012-10-17",		 	 	 
         "Statement": [{
             "Sid": "RoleForGoogle",
             "Effect": "Allow",
             "Principal": {"Federated": "accounts.google.com"},
             "Action": "sts:AssumeRoleWithWebIdentity",
             "Condition": {"StringEquals": {"accounts.google.com:aud": "666777888999000"}}
         }]
     }
   ```

------

   如果使用者使用行動應用程式從 Amazon Cognito 登入，則以下範例信任政策適用。在此範例中，*us-east:12345678-ffff-ffff-ffff-123456* 代表 Amazon Cognito 指派的身分集區 ID。

------
#### [ JSON ]

****  

   ```
   {
         "Version":"2012-10-17",		 	 	 
         "Statement": [{
             "Sid": "RoleForCognito",
             "Effect": "Allow",
             "Principal": {"Federated": "cognito-identity.amazonaws.com"},
             "Action": "sts:AssumeRoleWithWebIdentity",
             "Condition": {"StringEquals": {"cognito-identity.amazonaws.com:aud": "us-east:12345678-ffff-ffff-ffff-123456"}}
         }]
     }
   ```

------

## 為 OIDC 建立角色
<a name="idp_oidc_Create"></a>

完成先決條件後，您可在 IAM 建立角色。對於已辨識的共用 OpenID Connect (OIDC) 身分提供者 (IdP)，IAM 需要明確評估 JSON Web 權杖 (JWT) 中稱為*身分提供者控制項*的特定宣告。如需有關具有*身分提供者控制項*之 OIDC IdP 的詳細資訊，請參閱[共用 OIDC 提供者的身分提供者控制項](id_roles_providers_oidc_secure-by-default.md)。

下列程序介紹如何在 AWS 管理主控台中建立用於 OIDC 聯合身分的角色。若要從 AWS CLI 或 AWS API 建立角色，請參閱 中的程序[為第三方身分提供者建立角色](id_roles_create_for-idp.md)。

**重要**  
如果您使用 Amazon Cognito，請使用 Amazon Cognito 主控台來設定角色。否則，請使用 IAM 主控台來為 OIDC 聯合身分建立角色。

**若要為 OIDC 聯合身分建立 IAM 角色**

1. 登入 AWS 管理主控台 ，並在 https：//[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) 開啟 IAM 主控台。

1. 在導覽窗格中，選擇 **Roles** (角色)，然後選擇 **Create role** (建立角色)。

1. 選擇 **Web 身分**作為信任的實體類型，然後選取**下一步**。

1. 針對 **Identity provider** (身分提供者)，選擇您角色的身分提供者：
   + 如果要為個別 Web 身分提供者建立角色，請選擇 **Login with Amazon**、**Facebook** 或 **Google**。
**注意**  
您必須為想要支援的每個身分提供者建立單獨的角色。
   + 如果想要為 Amazon Cognito 建立進階案例角色，請選擇 **Amazon Cognito**。
**注意**  
只有在處理進階案例時，必須手動建立與 Amazon Cognito 一起使用的角色。否則，Amazon Cognito 可以為您建立角色。如需 Amazon Cognito 的詳細資訊，請參閱《Amazon Cognito 開發人員指南》**中的[身分集區 (聯合身分) 外部身分提供者](https://docs.aws.amazon.com/cognito/latest/developerguide/external-identity-providers.html)。
   + 如果您想要為 GitHub Actions 建立角色，您必須先將 GitHub OIDC 提供者新增至 IAM。將 GitHub OIDC 提供者新增至 IAM 之後，請選擇 **token.actions.githubusercontent.com**。
**注意**  
如需如何設定 AWS 將 GitHub 的 OIDC 供應商信任為聯合身分的相關資訊，請參閱 [GitHub 文件 - 在 Amazon Web Services 中設定 OpenID Connect](https://docs.github.com/en/actions/deployment/security-hardening-your-deployments/configuring-openid-connect-in-amazon-web-services)。若要針對與 GitHub 的 IAM IdP 相關聯的角色限制存取權，最佳實務的相關資訊請見本頁的[設定 GitHub OIDC 身分提供者的角色](#idp_oidc_Create_GitHub)。
   + 如果想要為 HashiCorp Cloud Platform (HCP) Terraform 建立角色，您必須先將 Terraform OIDC 提供者新增至 IAM。將 Terraform OIDC 提供者新增至 IAM 之後，選擇 **app.terraform.io**。
**重要**  
HashiCorp Cloud Platform (HCP) Terraform OIDC 提供者的 IAM 角色必須在角色信任政策中評估 IAM 條件索引鍵 `app.terraform.io:sub`。此條件索引鍵會限制哪些 HCP Terraform 組織、專案、工作區或執行階段能夠擔任該角色。如果沒有此條件金鑰，您的信任政策會透過組織外部的身分授予對角色 AWS 和資源的存取權，這不符合最低權限原則。  
如果您為 AWS 帳戶中與 HCP Terraform OIDC 供應商相關聯的角色設定或修改角色信任政策，但未評估 IAM 條件金鑰 `app.terraform.io:sub`，您將會收到錯誤。此外，如果您的角色信任政策未評估此條件索引鍵， AWS STS 將拒絕授權請求。

1. 請求的資訊會根據所選擇的 OIDC 提供者而有所不同。
   + 輸入您的應用程式的識別碼。識別碼的標籤會因所選擇的提供者而改變：
     + 如果您要為 Login with Amazon 建立角色，請將應用程式 ID 輸入 **Application ID** (應用程式 ID) 方塊中。
     + 如果您要為 Facebook 建立角色，請將應用程式 ID 輸入 **Application ID** (應用程式 ID) 方塊中。
     + 如果您要為 Google 建立角色，請在 **Audience** (對象) 方塊中輸入對象名稱。
     + 如果您要為 Amazon Cognito 建立角色，請在 **Identity Pool ID** (身分集區 ID) 方塊中輸入您為 Amazon Cognito 應用程式建立的身分集區 ID。
   + 如果您想要為 GitHub Actions 建立角色，請輸入下列詳細資訊：
     + 針對 **Audience** (對象)，選擇 `sts.amazonaws.com`。
     + 針對 **GitHub 組織**，輸入 GitHub 組織名稱。GitHub 組織名稱是必要資訊，而且必須由包含破折號 (-) 的英數字元組成。您無法在 GitHub 組織名稱中使用萬用字元 (\$1 和 ?)。
     + (選用) 針對 **GitHub 儲存庫**，輸入 GitHub 儲存庫名稱。如果您不指定值，則會預設為萬用字元 (`*`)。
     + (選用) 針對 **GitHub 分支**，輸入 GitHub 分支名稱。如果您不指定值，則會預設為萬用字元 (`*`)。
   + 如果您想要為 HashiCorp Cloud Platform (HCP) Terraform 建立角色，請輸入下列詳細資訊：
     + 針對 **Audience** (對象)，選擇 `aws.workload.identity`。
     + 針對**組織**，輸入組織名稱。您可以為所有組織指定萬用字元 (`*`)。
     + 針對**專案**，輸入專案名稱。您可以為所有專案指定萬用字元 (`*`)。
     + 針對**工作區**，輸入工作區名稱。您可以為所有工作區指定萬用字元 (`*`)。
     + 針對**執行階段**，輸入執行階段名稱。您可以為所有執行階段指定萬用字元 (`*`)。

1. (選用) 針對**條件 (選用)**，選擇**新增條件**，以建立應用程式使用者在能夠使用角色所授予的許可之前所必須滿足的其他條件。例如，您可以新增僅針對特定 IAM 使用者 ID 授予 AWS 資源存取權的條件。您也可以在建立角色之後，將條件新增至信任政策。如需詳細資訊，請參閱[更新角色信任政策](id_roles_update-role-trust-policy.md)。

1. 檢閱您的 OIDC 資訊，然後選擇**下一步**。

1. IAM 包含您帳戶中 AWS 受管和客戶受管政策的清單。選取用於許可政策的政策，或者選擇 **Create policy** (建立政策) 以開啟新的瀏覽器標籤，並從頭建立新的政策。如需詳細資訊，請參閱[建立 IAM 政策](access_policies_create-console.md#access_policies_create-start)。在您建立政策後，關閉該標籤並返回您的原始標籤。選取您希望 OIDC 使用者具有的許可政策旁的核取方塊。如果您希望，您目前可以不選取政策，稍後再將政策連接到角色。角色預設沒有任何許可。

1. (選用) 設定[許可界限](access_policies_boundaries.md)。這是進階功能。

   開啟 **Permissions boundary** (許可界限) 區段，並選擇 **Use a permissions boundary to control the maximum role permissions** (使用許可界限來控制角色許可上限)。選取用於許可界限的政策。

1. 選擇**下一步**。

1. 在 **Role name** (角色名稱) 中，輸入角色名稱。角色名稱在您的 中必須是唯一的 AWS 帳戶。它們不區分大小寫。例如，您無法建立名為 **PRODROLE** 和 **prodrole** 的角色。由於其他 AWS 資源可能會參考角色，因此您無法在建立角色之後編輯角色的名稱。

1. (選用) 在 **Description** (說明) 中，輸入新角色的說明。

1. 如要編輯使用案例和角色許可，請在 **Step 1: Select trusted entities** (步驟 1：選取受信任的實體) 或者 **Step 2: Add permissions** (步驟 2：新增許可) 區段中選擇 **Edit** (編輯)。

1. (選用) 若要將中繼資料新增至角色，請附加標籤做為鍵/值對。如需有關在 IAM 中使用標籤的詳細資訊，請參閱 [AWS Identity and Access Management 資源的標籤](id_tags.md)。

1. 檢閱角色，然後選擇 **Create role** (建立角色)。

## 設定 GitHub OIDC 身分提供者的角色
<a name="idp_oidc_Create_GitHub"></a>

如果您使用 GitHub 做為 OpenID Connect (OIDC) 身分提供者 (IdP)，最佳實務是限制可擔任與 IAM IdP 相關聯角色的實體。當您在信任政策中包含條件陳述式時，可以將角色限制到特定 GitHub 組織、儲存庫或分支。您可以使用具有字符條件運算子的條件索引鍵 `token.actions.githubusercontent.com:sub` 來限制存取權。建議您將條件限制為一組特定的儲存庫或 GitHub 組織內的分支。如需如何設定 AWS 將 GitHub 的 OIDC 信任為聯合身分的相關資訊，請參閱 [GitHub 文件 - 在 Amazon Web Services 中設定 OpenID Connect](https://docs.github.com/en/actions/deployment/security-hardening-your-deployments/configuring-openid-connect-in-amazon-web-services)。

如果您在動作工作流程或 OIDC 政策中使用 GitHub 環境，我們強烈建議將保護規則新增至環境，以提升安全性。使用部署分支和標籤來限制哪些分支和索引標籤可以部署至環境。如需有關使用保護規則設定環境的詳細資訊，請參閱 GitHub 的 *Using environments for deployment* 文章中的 [Deployment branches and tags](https://docs.github.com/en/actions/deployment/targeting-different-environments/using-environments-for-deployment#deployment-branches-and-tags)。

當 GitHub 的 OIDC IdP 是您角色的受信任主體時，IAM 會檢查角色信任政策條件以驗證條件索引鍵 `token.actions.githubusercontent.com:sub` 確實存在，且其值不單是萬用字元 (\$1 和 ?) 或 null。IAM 會在建立或更新信任政策時執行此檢查。如果條件索引鍵 `token.actions.githubusercontent.com:sub` 不存在，或者鍵值不滿足上述值標準，請求將失敗且會傳回錯誤。

**重要**  
如果您未將條件金鑰限制`token.actions.githubusercontent.com:sub`為特定組織或儲存庫，則來自您控制範圍之外的組織或儲存庫的 GitHub 動作可以擔任與您 AWS 帳戶中的 GitHub IAM IdP 相關聯的角色。

下列範例信任政策會限制存取已定義的 GitHub 組織、儲存庫和分支。下列範例中，條件索引鍵 `token.actions.githubusercontent.com:sub` 值是 GitHub 所記錄的預設主旨值格式。

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Federated": "arn:aws:iam::012345678910:oidc-provider/token.actions.githubusercontent.com"
      },
      "Action": "sts:AssumeRoleWithWebIdentity",
      "Condition": {
        "StringEquals": {
          "token.actions.githubusercontent.com:aud": "sts.amazonaws.com",
          "token.actions.githubusercontent.com:sub": "repo:GitHubOrg/GitHubRepo:ref:refs/heads/GitHubBranch"
        }
      }
    }
  ]
}
```

------

下列範例條件會限制存取已定義的 GitHub 組織和儲存庫，但會授予對儲存庫內任何分支的存取權。

```
"Condition": {
  "StringEquals": {
          "token.actions.githubusercontent.com:aud": "sts.amazonaws.com"
  },
  "StringLike": {    
    "token.actions.githubusercontent.com:sub": "repo:GitHubOrg/GitHubRepo:*"
  }
}
```

下列範例條件會限制存取已定義的 GitHub 組織中的任何儲存庫或分支。我們建議您將條件索引鍵 `token.actions.githubusercontent.com:sub` 限制為特定值，此特定值可限制從您的 GitHub 組織內部存取 GitHub 動作。

```
"Condition": {
  "StringEquals": {
          "token.actions.githubusercontent.com:aud": "sts.amazonaws.com"
  },
  "StringLike": {    
    "token.actions.githubusercontent.com:sub": "repo:GitHubOrg/*"
  }
}
```

如需有關可用於政策中條件檢查的 OIDC 聯合身分索引鍵的詳細資訊，請參閱[AWS OIDC 聯合的可用金鑰](reference_policies_iam-condition-keys.md#condition-keys-wif)。