

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

# Amazon Cognito 身分集區的安全最佳實務
<a name="identity-pools-security-best-practices"></a>

Amazon Cognito 身分集區為您的應用程式提供暫時 AWS 登入資料。 AWS 帳戶 通常同時包含應用程式使用者所需的資源，以及私有後端資源。組成 AWS 登入資料的 IAM 角色和政策可以授予任何這些資源的存取權。

身分集區組態的主要最佳實務是確保您的應用程式可以在沒有過多或非預期權限的情況下完成工作。為了防止安全設定錯誤，請在您要發佈至生產環境的每個應用程式啟動之前檢閱這些建議。

**Topics**
+ [IAM 組態最佳實務](#identity-pools-security-best-practices-iam)
+ [身分集區組態最佳實務](#identity-pools-security-best-practices-cib)

## IAM 組態最佳實務
<a name="identity-pools-security-best-practices-iam"></a>

當訪客或已驗證的使用者在您的應用程式中啟動需要身分集區憑證的工作階段時，您的應用程式會擷取 IAM 角色的臨時 AWS 憑證。登入資料可能適用於預設角色、身分集區組態中規則選擇的角色，或是應用程式選擇的自訂角色。透過指派給每個角色的許可，您的使用者即可存取您的 AWS 資源。

如需一般 IAM 最佳實務的詳細資訊，請參閱 AWS Identity and Access Management 《 使用者指南》中的 [IAM 最佳實務](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html)。

### 在 IAM 角色中使用信任政策條件
<a name="identity-pools-security-best-practices-iam-conditions"></a>

IAM 要求身分集區的角色至少有一個信任政策條件。例如，此條件可以將角色的範圍設定為僅已驗證的使用者。 AWS STS 也需要跨帳戶基本身分驗證請求有兩個特定條件： `cognito-identity.amazonaws.com:aud`和 `cognito-identity.amazonaws.com:amr`。最佳實務是在信任身分集區服務主體 的所有 IAM 角色中套用這兩個條件`cognito-identity.amazonaws.com`。
+ `cognito-identity.amazonaws.com:aud`：身分集區字符中的 *aud* 宣告必須符合信任的身分集區 ID。
+ `cognito-identity.amazonaws.com:amr`：身分集區權杖中的 *amr* 宣告必須*經過身分*驗證或*未經驗證*。使用此條件時，您只能將角色的存取權保留給未驗證的訪客，也可以保留給已驗證的使用者。您可以進一步精簡此條件的值，將角色限制為來自特定提供者的使用者，例如 `graph.facebook.com`。

下列範例角色信任政策會在下列條件下授予角色的存取權：

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "",
      "Effect": "Allow",
      "Principal": {
        "Federated": "cognito-identity.amazonaws.com"
      },
      "Action": "sts:AssumeRoleWithWebIdentity",
      "Condition": {
        "StringEquals": {
          "cognito-identity.amazonaws.com:aud": "us-east-1:a1b2c3d4-5678-90ab-cdef-EXAMPLE11111"
        },
        "ForAnyValue:StringLike": {
          "cognito-identity.amazonaws.com:amr": "authenticated"
        }
      }
    }
  ]
}
```

------

**與身分集區相關的元素**
+ `"Federated": "cognito-identity.amazonaws.com"`：使用者必須來自身分集區。
+ `"cognito-identity.amazonaws.com:aud": "us-east-1:a1b2c3d4-5678-90ab-cdef-example11111"`：使用者必須來自特定身分集區 `us-east-1:a1b2c3d4-5678-90ab-cdef-example11111`。
+ `"cognito-identity.amazonaws.com:amr": "authenticated"`：使用者必須經過身分驗證。訪客使用者無法擔任該角色。

### 套用最低權限許可
<a name="identity-pools-security-best-practices-iam-least-privilege"></a>

當您使用已驗證存取或訪客存取的 IAM 政策設定許可時，請僅授予執行特定任務所需的特定許可，或*最低權限*許可。下列範例 IAM 政策套用至角色時，會授予 Amazon S3 儲存貯體中單一影像檔案的唯讀存取權。

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Action": [
        "s3:GetObject"
      ],
      "Effect": "Allow",
      "Resource": ["arn:aws:s3:::mybucket/assets/my_picture.jpg"]
    }
  ]
}
```

------

## 身分集區組態最佳實務
<a name="identity-pools-security-best-practices-cib"></a>

身分集區有彈性的選項可產生 AWS 登入資料。當您的應用程式可以使用最安全的方法時，請勿採取設計捷徑。

### 了解訪客存取的影響
<a name="identity-pools-security-best-practices-cib-guest"></a>

未驗證的訪客存取允許使用者在登入 AWS 帳戶 之前從 擷取資料。知道您的身分集區 ID 的任何人都可以請求未經驗證的登入資料。您的身分集區 ID 不是機密資訊。當您啟用訪客存取時，您授予未經驗證工作階段的 AWS 許可可供所有人使用。

最佳實務是在使用者驗證後，才停用訪客存取並擷取必要的資源。如果您的應用程式在登入之前需要存取 資源，請採取下列預防措施。
+ 熟悉[未驗證角色的自動限制](iam-roles.md#access-policies-scope-down-services)。
+ 監控和調整未驗證 IAM 角色的許可，以符合應用程式的特定需求。
+ 授予特定資源的存取權。
+ 保護預設未驗證 IAM 角色的信任政策。
+ 只有當您確信會將 IAM 角色中的許可授予網際網路上的任何人時，才能啟用訪客存取。

### 預設使用增強型身分驗證
<a name="identity-pools-security-best-practices-cib-enhanced"></a>

透過基本 （傳統） 身分驗證，Amazon Cognito 會將 IAM 角色的選擇委派給您的應用程式。相反地，增強型流程會使用身分集區中的集中式邏輯來判斷 IAM 角色。它還透過設定 IAM 許可上限的[縮小範圍政策](iam-roles.md#access-policies-scope-down-services)，為未驗證的身分提供額外的安全性。增強型流程是開發人員工作量最低的最安全選擇。若要進一步了解這些選項，請參閱 [身分集區身分驗證流程](authentication-flow.md) 。

基本流程可以公開用戶端邏輯，這些邏輯會進入 AWS STS API 憑證請求的角色選擇和組合。增強型流程會隱藏身分集區自動化背後的邏輯和擔任角色請求。

當您設定基本身分驗證時，請將 [IAM 最佳實務](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html)套用至您的 IAM 角色及其許可。

### 安全地使用開發人員提供者
<a name="identity-pools-security-best-practices-cib-developer"></a>

開發人員驗證的身分是伺服器端應用程式的身分集區功能。身分集區進行開發人員身分驗證所需的唯一身分驗證證據是身分集區開發人員的 AWS 憑證。身分集區不會對您在此身分驗證流程中呈現的開發人員提供者識別符的有效性強制執行任何限制。

最佳實務是，僅在下列條件下實作開發人員提供者：
+ 若要建立使用開發人員驗證憑證的責任，請設計您的開發人員供應商名稱和識別符，以指示身分驗證來源。例如：`"Logins" : {"MyCorp provider" : "{{[provider application ID]}}"}`。
+ 避免長期使用者登入資料。將伺服器端用戶端設定為使用服務連結角色請求身分，例如 [EC2 執行個體描述](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use_switch-role-ec2_instance-profiles.html)檔和 [Lambda 執行角色](https://docs.aws.amazon.com/lambda/latest/dg/lambda-intro-execution-role.html)。
+ 避免在相同的身分集區中混合內部和外部信任來源。在不同的身分集區中新增您的開發人員提供者和單一登入 (SSO) 提供者。