為 OpenID Connect 聯合身分建立角色 (主控台) - AWS Identity and Access Management

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

為 OpenID Connect 聯合身分建立角色 (主控台)

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

建立適用於 OIDC 的角色的先決條件

您必須先完成以下先決條件步驟,然後才能建立用於 OIDC 聯合身分的角色。

若要準備建立用於 OIDC 聯合身分的角色
  1. 使用一或多個提供聯合 OIDC 身分的服務進行註冊。如果您建立的應用程式需要存取您的 AWS 資源,您還需要在應用程式設定提供者資訊。當您這麼做時,提供者會將應用程式唯一的 ID 提供給您的應用程式或對象。(不同的提供者可能使用不同的術語來表達此程序。本指南則使用術語設定來表示向提供者識別您應用程式的程序)。您可以在每個提供者設定多個應用程式,或在單一應用程式設定多個提供者。檢視有關使用身分提供者的相關資訊,如下所示:

  2. 從 IdP 收到必要資訊後,請在 IAM 中建立 IdP。如需詳細資訊,請參閱在 IAM 中建立 OpenID Connect (OIDC) 身分提供者

    重要

    如果您正在使用來自 Google、Facebook 或 Amazon Cognito 的 OIDC IdP,請勿在 AWS Management Console 中建立單獨的 IAM IdP。這些 OIDC 身分提供者已內建於 AWS,並且可供您使用。略過此步驟,並在接下來的步驟中使用您的 IdP 建立新角色。

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

    對於 Web 身分提供者,我們建議您使用 Amazon Cognito 來管理身分。在這種情況下,請使用類似於這個範例的信任政策。

    { "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 提供者,請使用您在 步驟 2 中建立的 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 角色的 Amazon Cognito 身分集區。這些角色的信任政策必須接受 cognito-identity.amazonaws.com 服務主體,且必須包含 aud 條件索引鍵,以限制來自您預期身分集區的使用者擔任角色。如果不符合此條件,信任 Amazon Cognito 身分集區的政策會產生意外身分集區中的使用者可能擔任該角色的風險。如需詳細資訊,請參閱 Amazon Cognito Developer Guide 中的 Trust policies for IAM roles in Basic (Classic) authentication

      建立類似以下其中一個範例的條件元素,其取決於您使用的 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。

    { "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。

    { "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。

    { "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。

    { "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 建立角色

完成先決條件後,您可在 IAM 建立角色。下列程序介紹如何在 AWS Management Console中建立用於 OIDC 聯合身分的角色。若要從 AWS CLI 或 AWS API 建立角色,請參閱針對第三方身分提供者建立角色 (聯合身分)的程序。

重要

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

若要為 OIDC 聯合身分建立 IAM 角色
  1. 簽署 AWS Management Console,並開啟位於 https://console.aws.amazon.com/iam/ 的 IAM 主控台。

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

  3. 選擇 Web 身分作為信任的實體類型,然後選取下一步

  4. 針對 Identity provider (身分提供者),選擇您角色的身分提供者:

    • 如果要為個別 Web 身分提供者建立角色,請選擇 Login with AmazonFacebookGoogle

      注意

      您必須為想要支援的每個身分提供者建立單獨的角色。

    • 如果想要為 Amazon Cognito 建立進階案例角色,請選擇 Amazon Cognito

      注意

      只有在處理進階案例時,必須手動建立與 Amazon Cognito 一起使用的角色。否則,Amazon Cognito 可以為您建立角色。如需 Amazon Cognito 的詳細資訊,請參閱《Amazon Cognito 開發人員指南》中的身分集區 (聯合身分) 外部身分提供者

    • 如果您想要為 GitHub Actions 建立角色,您必須先將 GitHub OIDC 提供者新增至 IAM。將 GitHub OIDC 提供者新增至 IAM 之後,請選擇 token.actions.githubusercontent.com

      注意

      如需有關如何設定 AWS 以便信任 GitHub 的 OIDC 提供者作為聯合身分的資訊,請參閱 GitHub 文件 - 在 Amazon Web Services 中設定 OpenID Connect。若要針對與 GitHub 的 IAM IdP 相關聯的角色限制存取權,最佳實務的相關資訊請見本頁的設定 GitHub OIDC 身分提供者的角色

    • 如果想要為 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 將拒絕授權請求。

  5. 輸入您的應用程式的識別碼。識別碼的標籤會因所選擇的提供者而改變:

    • 如果您要為 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 組織名稱中使用萬用字元 (* 和 ?)。

      • (選用) 針對 GitHub 儲存庫,輸入 GitHub 儲存庫名稱。如果您不指定值,則會預設為萬用字元 (*)。

      • (選用) 針對 GitHub 分支,輸入 GitHub 分支名稱。如果您不指定值,則會預設為萬用字元 (*)。

    • 如果您想要為 HashiCorp Cloud Platform (HCP) Terraform 建立角色,請輸入下列詳細資訊:

      • 針對 Audience (對象),選擇 aws.workload.identity

      • 針對組織,輸入組織名稱。您可以為所有組織指定萬用字元 (*)。

      • 針對專案,輸入專案名稱。您可以為所有專案指定萬用字元 (*)。

      • 針對工作區,輸入工作區名稱。您可以為所有工作區指定萬用字元 (*)。

      • 針對執行階段,輸入執行階段名稱。您可以為所有執行階段指定萬用字元 (*)。

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

  7. 檢閱您的 OIDC 資訊,然後選擇下一步

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

  9. (選用) 設定許可界限。這是進階功能。

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

  10. 選擇 Next (下一步)。

  11. Role name (角色名稱) 中,輸入角色名稱。角色名稱在您的 AWS 帳戶 內必須是獨一無二的。它們不區分大小寫。例如,您無法建立名為 PRODROLEprodrole 的角色。因為有其他 AWS 資源可能會參照角色,所以您無法在建立角色之後編輯角色名稱。

  12. (選用) 在 Description (說明) 中,輸入新角色的說明。

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

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

  15. 檢閱角色,然後選擇 Create role (建立角色)。

設定 GitHub OIDC 身分提供者的角色

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

如果您在動作工作流程或 OIDC 政策中使用 GitHub 環境,我們強烈建議將保護規則新增至環境,以提升安全性。使用部署分支和標籤來限制哪些分支和標籤可以部署至環境。如需有關使用保護規則設定環境的詳細資訊,請參閱 GitHub 的 Using environments for deployment 文章中的 Deployment branches and tags

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

重要

如果您不將條件索引鍵 token.actions.githubusercontent.com:sub 限制為特定組織或儲存庫,則來自您控制範圍以外的組織或儲存庫的 GitHub 動作可在您的 AWS 帳戶中擔任與 GitHub IAM IdP 關聯的角色。

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

{ "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 聯合的可用金鑰