

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

# 使用屬性進行存取控制
<a name="attributes-for-access-control"></a>

存取控制的屬性基於屬性型存取控制 (ABAC) 的 Amazon Cognito 身份集區實施。您可以使用 IAM 政策，根據使用者屬性，控制透過 Amazon Cognito 身分集區存取 AWS 資源。這些屬性可以向社交和公司身分提供者取得。您可以將供應商存取權杖和 ID 權杖或 SAML 聲明中的屬性，映射至可在 IAM 許可政策中參照的標籤。

您可以選擇預設映射 (default mappings)，或在 Amazon Cognito 身分集區中建立自己的自訂映射 (custom mappings)。預設對應可讓您根據固定的使用者屬性集，撰寫 IAM 政策。自訂對應可讓您選取 IAM 許可政策中參照的自訂使用者屬性集。Amazon Cognito 主控台的 **Attribute names (屬性名稱)** 映射至 **Tag key for principal (委託人的標籤索引鍵)**，這些標籤是 IAM 許可政策中參照的標籤。

舉例來說，假設您有具免費和付費會員資格的媒體串流服務。您可以將媒體檔案存放在 Amazon S3 中，並加上免費或付費標籤。您可以使用存取控制屬性，根據使用者成員資格等級 (屬於使用者描述檔)，允許存取免費和付費內容。您可以將成員資格屬性對應至標籤索引鍵，將委託人傳遞至 IAM 許可政策。如此一來，您就可以建立單一許可政策，並根據成員資格等級值和內容檔案的標籤，有條件地允許存取付費內容。

**Topics**
+ [透過 Amazon Cognito 身分集區使用屬性進行存取控制](#using-afac-with-cognito-identity-pools)
+ [使用屬性進行存取控制的政策範例](#using-attributes-for-access-control-policy-example)
+ [關閉以存取控制屬性 (主控台)](#disable-afac)
+ [預設供應商對應](#provider-mappings)

使用屬性控制存取權限有多個好處：
+ 使用存取控制屬性時，可提升管理許可的效率。您可以建立使用使用者屬性的基本許可政策，而不是為不同任務函數建立多個政策。
+ 每當為應用程式新增或移除資源或使用者時，您就不必更新政策。許可政策只會將存取權限授與具相符使用者屬性的使用者。例如，您可能需要根據使用者的職稱，控制特定 S3 儲存貯體的存取權限。在這種情況下，您可以建立許可政策，只允許已定義職稱內的使用者存取這些檔案。如需詳細資訊，請參閱 [IAM 教學課程：針對 ABAC 使用 SAML 工作階段標記](https://docs.aws.amazon.com/IAM/latest/UserGuide/tutorial_abac-saml.html)。
+ 屬性可以當作委託人標籤，傳遞至根據這些屬性值允許或拒絕許可的政策。

## 透過 Amazon Cognito 身分集區使用屬性進行存取控制
<a name="using-afac-with-cognito-identity-pools"></a>

在使用屬性進行存取控制之前，請確認您符合下列先決條件：
+ [AWS 帳戶](https://docs.aws.amazon.com/cognito/latest/developerguide/getting-started-with-identity-pools.html#aws-sign-up-identity-pools)
+ [使用者集區](https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-user-pool-as-user-directory.html)
+ ​[身分集區](https://docs.aws.amazon.com/cognito/latest/developerguide/getting-started-with-identity-pools.html#create-identity-pools)
+ [設定 SDK](getting-started-with-identity-pools.md#install-the-mobile-or-javascript-sdk)
+ [整合的身分提供者](https://docs.aws.amazon.com/cognito/latest/developerguide/getting-started-with-identity-pools.html##integrate-the-identity-providers)
+ [憑證](https://docs.aws.amazon.com/cognito/latest/developerguide/getting-started-with-identity-pools.html#get-credentials)

若要使用存取控制屬性，設定為來源資料集的 **宣告** 值，需設定為您所選的 **標籤金鑰**。Amazon Cognito 會將標籤金鑰和值套用至使用者的工作階段。您的 IAM 政策可以根據 `${aws:PrincipalTag/tagkey}` 條件評估使用者的存取權限。IAM 會根據政策評估使用者的標籤值。

您必須準備好 IAM 角色，這些角色的憑證將會傳遞給您的使用者。這些角色的信任政策必須允許 Amazon Cognito 為您的使用者擔任該角色。對於存取控制的屬性，您也必須允許 Amazon Cognito 將主體標籤套用至使用者的臨時工作階段。使用 [AssumeRoleWithWebIdentity](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRoleWithWebIdentity.html) 動作授予擔任角色的許可。使用[僅許可動作](https://docs.aws.amazon.com/service-authorization/latest/reference/list_awssecuritytokenservice.html#awssecuritytokenservice-actions-as-permissions) `sts:TagSession` 授予標記使用者工作階段的許可。如需詳細資訊，請參閱*《AWS Identity and Access Management 使用者指南》*中的[在  AWS Security Token Service 中傳遞工作階段標記](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_session-tags.html)。如需對 Amazon Cognito 服務主體 `cognito-identity.amazonaws.com` 授予 `sts:AssumeRoleWithWebIdentity` 和 `sts:TagSession` 許可的信任策略範例，請參閱 [使用屬性進行存取控制的政策範例](#using-attributes-for-access-control-policy-example)。

**若要在 Amazon Cognito 主控台中設定存取控制屬性**

1. 登入 [Amazon Cognito 主控台](https://console.aws.amazon.com/cognito/home)，然後選取 **身分池**。選取身分池。

1. 選擇 **使用者存取權** 索引標籤。

1. 找到 **身分提供者**。選擇您要編輯的身分提供者。如果您要新增一個新的 IdP，選取 **新增身分供應商**。

1. 若要變更 Amazon Cognito 向使用者驗證此提供者，發布憑證時指派的委託人標籤，請在 **存取控制屬性** 中選擇 **編輯**。

   1. 若不套用主要索引標籤，請選擇 **非作用中**。

   1. 若要根據 `sub` 和 `aud` 宣告套用主要索引標籤，請選擇 **使用預設對應**。

   1. 若要建立您自己的自訂屬性結構描述至主要索引標籤，請選擇 **使用自訂對應**。然後，輸入您要從每個 **宣告** 中獲取的 **標籤金鑰**，顯示於索引標籤當中。

1. 選取**儲存變更**。

## 使用屬性進行存取控制的政策範例
<a name="using-attributes-for-access-control-policy-example"></a>

考慮這個情況，公司法務部門員工須列出屬於部門的儲存貯體中所有檔案，並以安全等級加以分類。假設此員工向身分提供者取得的權杖包含下列宣告。

**宣告**

```
            { .
              .
            "sub" : "57e7b692-4f66-480d-98b8-45a6729b4c88",
            "department" : "legal",
            "clearance" : "confidential",
             .
             .
            }
```

這些屬性可以對應至標籤，並在 IAM 許可政策中參照為委託人標籤。您現在可以變更身分提供者端的使用者描述檔，管理存取權限。或者，您可以使用名稱或標籤變更資源端的屬性，而不變更政策本身。

下列許可政策會執行兩項作業：
+ 允許列出存取所有以符合使用者部門名稱的字首結尾的 S3 儲存貯體。
+ 只要檔案的許可標籤符合使用者的許可屬性，就允許讀取存取這些儲存貯體中的檔案。

**許可政策**

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

****  

```
   {
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "s3:List*",
            "Resource": "arn:aws:s3:::*-${aws:PrincipalTag/department}"
        },
        {
            "Effect": "Allow",
            "Action": "s3:GetObject*",
            "Resource": "arn:aws:s3:::*-${aws:PrincipalTag/department}/*",
            "Condition": {
                "StringEquals": {
                    "s3:ExistingObjectTag/clearance": "${aws:PrincipalTag/clearance}"
                }
            }
        }
    ]
}
```

------

信任政策決定誰可擔任此角色。信任關係政策允許使用 `sts:AssumeRoleWithWebIdentity` 和 `sts:TagSession` 允許存取。這會新增條件，將政策限制於您建立的身分池，並確保適用於已驗證的角色。

**信任政策**

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Federated": "cognito-identity.amazonaws.com"
      },
      "Action": [
        "sts:AssumeRoleWithWebIdentity",
        "sts:TagSession"
      ],
      "Condition": {
        "StringEquals": {
          "cognito-identity.amazonaws.com:aud": "IDENTITY-POOL-ID"
        },
        "ForAnyValue:StringLike": {
          "cognito-identity.amazonaws.com:amr": "authenticated"
        }
      }
    }
  ]
}
```

------

## 關閉以存取控制屬性 (主控台)
<a name="disable-afac"></a>

按照此程序停用以存取控制屬性。

**若要在主控台中停止用存取控制屬性**

1. 登入 [Amazon Cognito 主控台](https://console.aws.amazon.com/cognito/home)，然後選取 **身分池**。選取身分池。

1. 選擇 **使用者存取權** 索引標籤。

1. 找到 **身分提供者**。選擇您要編輯的身分提供者。

1. 在 **存取控制屬性** 中選擇 **編輯**。

1. 若不套用主要索引標籤，請選擇 **非作用中**。

1. 選取**儲存變更**。

## 預設供應商對應
<a name="provider-mappings"></a>

下表為 Amazon Cognito 支援的身分驗證供應商預設對應資訊。


| 供應商 | 權杖類型 | 委託人標籤值 | 範例 | 
| --- | --- | --- | --- | 
|  Amazon Cognito 使用者集區  |  ID 權杖  |  aud(client ID) 和 sub(user ID)  |  "6jk8ltokc7ac9es6jrtg9q572f"、"57e7b692-4f66-480d-98b8-45a6729b4c88"  | 
|  Facebook  |  存取權杖  |  aud(app\$1id)、sub(user\$1id)  |  "492844718097981"、"112177216992379"  | 
|  Google  |  ID 權杖  |  aud(client ID) 和 sub(user ID)  |  "620493171733-eebk7c0hcp5lj3e1tlqp1gntt3k0rncv.apps.googleusercontent.com"、"109220063452404746097"  | 
|  SAML  |  聲明  |  "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier"、"http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name"  |  "auth0\$15e28d196f8f55a0eaaa95de3"、"user123@gmail.com"  | 
|  Apple  |  ID 權杖  |  aud(client ID) 和 sub (user ID)  |  "com.amazonaws.ec2-54-80-172-243.compute-1.client"、"001968.a6ca34e9c1e742458a26cf8005854be9.0733"  | 
|  Amazon  |  存取權杖  |  aud (Client ID on Amzn Dev Ac)、user\$1id(user ID)  |  "amzn1.application-oa2-client.9d70d9382d3446108aaee3dd763a0fa6"、"amzn1.account.AGHNIFJQMFSBG3G6XCPVB35ORQAA"  | 
|  標準 OIDC 供應商  |  ID 權杖和存取權杖  |  aud (as client\$1id)、sub (as user ID)  |  "620493171733-eebk7c0hcp5lj3e1tlqp1gntt3k0rncv.apps.googleusercontent.com"、"109220063452404746097"  | 
|  Twitter  |  存取權杖  |  aud (app ID; app Secret)、sub (user ID)  |  "DfwifTtKEX1FiIBRnOTlR0CFK;Xgj5xb8xIrIVCPjXgLIdkW7fXmwcJJrFvnoK9gwZkLexo1y5z1"、"1269003884292222976"  | 
|  DevAuth  |  Map  |  不適用  |  "tag1"、"tag2"  | 

**注意**  
**Tag Key for Principal (委託人的標籤索引鍵)** 和 **Attribute (屬性)** 名稱會自動填入預設屬性對應選項。您無法變更預設對應。