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

建立 Web 身分的角色或 OpenID Connect 聯合身分 (主控台)

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

建立適用於 Web 身分或 OIDC 的角色的先決條件

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

準備建立用於 Web 聯合身分的角色

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

  2. 從 IdP 收到必要資訊後,請在 IAM 中建立 IdP。如需詳細資訊,請參閱 建立 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

    如果您手動設定 Web 身分 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 之間的比對可確保請求來自您的應用程式。建立類似以下其中一個範例的條件元素,其取決於您使用的 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 特有的。Web 身分或 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"}} }] }

建立 Web 身分或 OIDC 的角色

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

重要

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

為 Web 聯合身分建立 IAM 角色

  1. 登入 AWS Management Console,並開啟位於 https://console.aws.amazon.com/iam/ 的 IAM 主控台。

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

  3. 選擇 Web Identity (Web 身分) 角色類型。

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

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

      注意

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

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

      注意

      只有在處理進階案例時,必須手動建立與 Amazon Cognito 一起使用的角色。否則,Amazon Cognito 可以為您建立角色。如需有關 Amazon Cognito 的詳細資訊,請參閱《AWS Mobile SDK for iOS 開發人員指南》中的 Amazon Cognito 身分,以及《AWS Mobile SDK for Android 開發人員指南》中的 Amazon Cognito 身分

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

    • 如果您要為 Login with Amazon 建立角色,請將應用程式 ID 輸入 Application ID (應用程式 ID) 方塊中。

    • 如果您要為 Facebook 建立角色,請將應用程式 ID 輸入 Application ID (應用程式 ID) 方塊中。

    • 如果您要為 Google 建立角色,請在 Audience (對象) 方塊中輸入對象名稱。

    • 如果您要為 Amazon Cognito 建立角色,請在 Identity Pool ID (身分集區 ID) 方塊中輸入您為 Amazon Cognito 應用程式建立的身分集區 ID。

  6. (選用) 選擇 Condition (optional) (條件 (選用)),以建立應用程式使用者在能夠使用角色所授予的許可之前所必須滿足的其他條件。例如,您可以新增一個條件,僅授予特定 IAM 使用者 ID 存取 AWS 資源。

  7. 檢閱您的 Web 身分資訊,然後選擇 Next (下一步)。

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

  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 中使用標籤的詳細資訊,請參閱 標記 IAM 資源

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

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

如果您使用 GitHub 做為 OIDC IdP,最佳實務是限制可擔任與 IAM IdP 相關聯角色的實體。當您在信任政策中包含條件陳述式時,可以將角色限制到特定 GitHub 組織、儲存庫或分支。您可以使用條件金鑰 token.actions.githubusercontent.com:sub 來限制存取。建議您將條件限制為一組特定的儲存庫或分支。如果您未包含此條件,則來自您控制範圍以外的組織或儲存庫的 GitHub 動作可在 AWS 帳戶 中擔任與您的 GitHub IAM IdP 相關的角色。如需有關如何設定 AWS 以便信任 GitHub 的 OIDC 作為聯合身分的資訊,請參閱 GitHub 文件 - 在 Amazon Web Services 中設定 OpenID Connect

下列範例信任政策會限制存取已定義的 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": { "StringLike": { "token.actions.githubusercontent.com:aud": "sts.amazonaws.com", "token.actions.githubusercontent.com:sub": "repo:GitHubOrg/GitHubRepo:*" } }

下列範例條件會限制存取已定義的 GitHub 組織中的任何儲存庫或分支。對於使用 GitHub 作為 OIDC IdP 的角色,我們建議將此作為最低信任政策條件。

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

如需有關可用於政策中條件檢查的 Web 聯合身分索引鍵的詳細資訊,請參閱 AWS Web 聯合身分的可用索引鍵