為 OpenID Connect 聯盟(控制台)創建角色 - AWS Identity and Access Management

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

為 OpenID Connect 聯盟(控制台)創建角色

您可以使用 OpenID Connect(OIDC)聯合身份提供程序,而不是在. AWS Identity and Access Management AWS 帳戶透過身分識別提供者 (IdP),您可以管理以外的使用者身分識別, AWS 並授與這些外部使用者身分識別權限,以存取您帳戶中的 AWS 資源。如需關於同盟的更多資訊 IdPs,請參閱身分提供者與聯合

為 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 動作和資源。

    對於網路版 IdPs,我們建議您使用 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 IdPs,providerUrl這是一個 URL。下列範例包含指定某些常用主體的方法 IdPs:

        "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 開發人員指南中基本 (傳統) 身份驗證中 IAM 角色的信任政策

      建立類似以下其中一個範例的條件元素,其取決於您使用的 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 登入,則以下範例信任政策適用。在此範例中,美國東部:12345678-ffff-ffff-ffff 123456 代表 Amazon Cognito 可指派的身分集區識別碼。

    { "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 建立角色。下列程序說明如何在中建立 OIDC 聯盟的角色。 AWS Management Console若要從 AWS CLI 或 AWS API 建立角色,請參閱中的程序針對第三方身分提供者建立角色 (聯合身分)

重要

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

若要為 OIDC 聯盟建立 IAM 角色
  1. 登入 AWS Management Console 並開啟身分與存取權管理主控台,網址為 https://console.aws.amazon.com/iam/

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

  3. 選擇 OIDC 角色類型

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

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

      注意

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

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

      注意

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

    • 如果您想要為 GitHub 動作建立角色,必須先將 GitHub OIDC 提供者新增至 IAM。將 GitHub OIDC 提供者新增至 IAM 之後,請選擇權杖。

      注意

      有關如何將信任的 OIDC 設定 AWS 為聯合身分 GitHub的詳細資訊,請參閱GitHub 文件-在 Amazon Web Services 中設定 OpenID Connect。如需限制與 IAM IdP 相關聯之角色存取權的最佳做法的資訊 GitHub,請參閱本頁設定 GitHub OIDC 身分識別提供者的角色上的。

  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 「動作」的角色,請輸入下列詳細資訊:

      • 針對 Audience (對象),選擇 sts.amazonaws.com

      • 若為GitHub 組織,請輸入您的 GitHub 組織名稱。 GitHub 組織名稱是必要的,且必須是包含破折號 (-) 的英數字元。您不能使用萬用字元 (* 和?) 在 GitHub 組織名稱中。

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

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

  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. 選擇下一步

  11. Role name (角色名稱) 中,輸入角色名稱。角色名稱在您的 AWS 帳戶. 它們不區分大小寫。例如,您無法建立名為 PRODROLEprodrole 的角色。由於其他 AWS 資源可能會參照該角色,因此您無法在建立角色之後編輯該角色的名稱。

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

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

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

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

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

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

如果您在動作工作流程或 OIDC 原則中使用環 GitHub 境,我們強烈建議您在環境中新增保護規則以提高安全性。使用部署分支和標籤來限制哪些分支和標籤可以部署到環境中。如需有關使用保護規則設定環境的詳細資訊,請參閱 < 使用部署環境 > 一文中 GitHub的部署分支和標籤

當 GitHub OIDC IdP 是您角色的受信任主體時,IAM 會檢查角色信任政策條件以驗證條件token.actions.githubusercontent.com:sub是否存在條件金鑰,且其值不僅是萬用字元 (* 和?) 或空。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 聯盟的可用金鑰