

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

# AWS Identity and Access Management (IAM) 和 DynamoDB
<a name="identity-and-access-mgmt"></a>

 AWS Identity and Access Management 是一種 AWS 服務，可協助管理員安全地控制對 AWS 資源的存取。管理員可以控制透過驗證 (已登入) 和授權 (具有許可) 來使用 Amazon DynamoDB 和 DynamoDB Accelerator 資源的對象。您可以使用 IAM 來管理存取許可，並為 Amazon DynamoDB 和 DynamoDB Accelerator 實作安全政策。IAM 是一項服務 AWS ，您可以免費使用。

 

**Topics**
+ [Amazon DynamoDB 的 Identity and Access Management](security-iam.md)
+ [使用 IAM 政策條件進行精細定義存取控制](specifying-conditions.md)

# Amazon DynamoDB 的 Identity and Access Management
<a name="security-iam"></a>





AWS Identity and Access Management (IAM) 是一種 AWS 服務 ，可協助管理員安全地控制對 AWS 資源的存取。IAM 管理員可以控制誰能「完成身分驗證」(已登入) 和「獲得授權」(具有許可) 而得以使用 DynamoDB 資源。****IAM 是您可以免費使用 AWS 服務 的 。

**Topics**
+ [目標對象](#security_iam_audience)
+ [使用身分驗證](#security_iam_authentication)
+ [使用政策管理存取權](#security_iam_access-manage)
+ [Amazon DynamoDB 如何搭配 IAM 運作](security_iam_service-with-iam.md)
+ [Amazon DynamoDB 以身分為基礎的政策範例](security_iam_id-based-policy-examples.md)
+ [Amazon DynamoDB 身分識別和存取疑難排解](security_iam_troubleshoot.md)
+ [避免購買 DynamoDB 預留容量的 IAM 政策](iam-policy-prevent-purchase-reserved-capacity.md)

## 目標對象
<a name="security_iam_audience"></a>

使用方式 AWS Identity and Access Management (IAM) 會根據您的角色而有所不同：
+ **服務使用者** — 若無法存取某些功能，請向管理員申請所需許可 (請參閱 [Amazon DynamoDB 身分識別和存取疑難排解](security_iam_troubleshoot.md))
+ **服務管理員** — 負責設定使用者存取權並提交相關許可請求 (請參閱 [Amazon DynamoDB 如何搭配 IAM 運作](security_iam_service-with-iam.md))
+ **IAM 管理員** — 撰寫政策以管理存取控制 (請參閱 [Amazon DynamoDB 以身分為基礎的政策範例](security_iam_id-based-policy-examples.md))

## 使用身分驗證
<a name="security_iam_authentication"></a>

身分驗證是您 AWS 使用身分憑證登入 的方式。您必須以 AWS 帳戶根使用者、IAM 使用者或擔任 IAM 角色進行身分驗證。

您可以使用身分來源的登入資料，例如 AWS IAM Identity Center (IAM Identity Center)、單一登入身分驗證或 Google/Facebook 登入資料，以聯合身分的形式登入。如需有關登入的詳細資訊，請參閱《AWS 登入 使用者指南》**中的[如何登入您的 AWS 帳戶](https://docs.aws.amazon.com/signin/latest/userguide/how-to-sign-in.html)。

對於程式設計存取， AWS 提供 SDK 和 CLI 以密碼編譯方式簽署請求。如需詳細資訊，請參閱《IAM 使用者指南》**中的 [API 請求的AWS 第 4 版簽署程序](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_sigv.html)。

### AWS 帳戶 根使用者
<a name="security_iam_authentication-rootuser"></a>

 當您建立 時 AWS 帳戶，您會從一個名為 AWS 帳戶 *theroot 使用者的*登入身分開始，該身分可完整存取所有 AWS 服務 和 資源。強烈建議不要使用根使用者來執行日常任務。有關需要根使用者憑證的任務，請參閱《IAM 使用者指南》**中的[需要根使用者憑證的任務](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_root-user.html#root-user-tasks)。

### 聯合身分
<a name="security_iam_authentication-federated"></a>

最佳實務是要求人類使用者使用聯合身分提供者，以 AWS 服務 使用臨時憑證存取 。

*聯合身分*是來自您的企業目錄、Web 身分提供者的使用者，或使用來自身分來源的 AWS 服務 憑證存取 Directory Service 的使用者。聯合身分會擔任角色，而該角色會提供臨時憑證。

若需集中化管理存取權限，建議使用 AWS IAM Identity Center。如需詳細資訊，請參閱 *AWS IAM Identity Center 使用者指南*中的[什麼是 IAM Identity Center？](https://docs.aws.amazon.com/singlesignon/latest/userguide/what-is.html)。

### IAM 使用者和群組
<a name="security_iam_authentication-iamuser"></a>

*IAM 使用者*[https://docs.aws.amazon.com/IAM/latest/UserGuide/id_users.html](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_users.html)是一種身分具備單人或應用程式的特定許可權。建議以臨時憑證取代具備長期憑證的 IAM 使用者。如需詳細資訊，請參閱《*IAM 使用者指南*》中的[要求人類使用者使用聯合身分提供者來 AWS 使用臨時憑證存取](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html#bp-users-federation-idp) 。

[IAM 群組](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_groups.html)**會指定 IAM 使用者集合，使管理大量使用者的許可權更加輕鬆。如需詳細資訊，請參閱《IAM 使用者指南》**中的 [IAM 使用者的使用案例](https://docs.aws.amazon.com/IAM/latest/UserGuide/gs-identities-iam-users.html)。

### IAM 角色
<a name="security_iam_authentication-iamrole"></a>

*IAM 角色*[https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html)的身分具有特定許可權，其可以提供臨時憑證。您可以透過[從使用者切換到 IAM 角色 （主控台） ](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use_switch-role-console.html)或呼叫 AWS CLI 或 AWS API 操作來擔任角色。如需詳細資訊，請參閱《IAM 使用者指南》**中的[擔任角色的方法](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_manage-assume.html)。

IAM 角色適用於聯合身分使用者存取、臨時 IAM 使用者許可、跨帳戶存取權與跨服務存取，以及在 Amazon EC2 執行的應用程式。如需詳細資訊，請參閱《*IAM 使用者指南*》中的 [IAM 中的快帳戶資源存取](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies-cross-account-resource-access.html)。

## 使用政策管理存取權
<a name="security_iam_access-manage"></a>

您可以透過建立政策並將其連接到身分或資源 AWS 來控制 AWS 中的存取。政策定義與身分或資源相關聯的許可。當委託人提出請求時 AWS ， 會評估這些政策。大多數政策會以 JSON 文件 AWS 形式存放在 中。如需進一步了解 JSON 政策文件，請參閱《*IAM 使用者指南*》中的 [JSON 政策概觀](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html#access_policies-json)。

管理員會使用政策，透過定義哪些**主體**可在哪些**條件**下對哪些**資源**執行**動作**，以指定可存取的範圍。

預設情況下，使用者和角色沒有許可。IAM 管理員會建立 IAM 政策並將其新增至角色，供使用者後續擔任。IAM 政策定義動作的許可，無論採用何種方式執行。

### 身分型政策
<a name="security_iam_access-manage-id-based-policies"></a>

身分型政策是附加至身分 (使用者、使用者群組或角色) 的 JSON 許可政策文件。這類政策控制身分可對哪些資源執行哪些動作，以及適用的條件。如需了解如何建立身分型政策，請參閱《*IAM 使用者指南*》中的[透過客戶管理政策定義自訂 IAM 許可](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_create.html)。

身分型政策可分為*內嵌政策* (直接內嵌於單一身分) 與*受管政策* (可附加至多個身分的獨立政策)。如需了解如何在受管政策及內嵌政策之間做選擇，請參閱《IAM 使用者指南》**中的[在受管政策與內嵌政策之間選擇](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies-choosing-managed-or-inline.html)。

### 資源型政策
<a name="security_iam_access-manage-resource-based-policies"></a>

資源型政策是附加到資源的 JSON 政策文件。範例包括 IAM *角色信任政策*與 Amazon S3 *儲存貯體政策*。在支援資源型政策的服務中，服務管理員可以使用它們來控制對特定資源的存取權限。您必須在資源型政策中[指定主體](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_principal.html)。

資源型政策是位於該服務中的內嵌政策。您無法在以資源為基礎的政策中使用來自 IAM 的 AWS 受管政策。

### 其他政策類型
<a name="security_iam_access-manage-other-policies"></a>

AWS 支援其他政策類型，可設定更多常見政策類型授予的最大許可：
+ **許可界限** — 設定身分型政策可授與 IAM 實體的最大許可。如需詳細資訊，請參閱《 IAM 使用者指南》**中的 [IAM 實體許可界限](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_boundaries.html)。
+ **服務控制政策 (SCP)** — 為 AWS Organizations中的組織或組織單位指定最大許可。如需詳細資訊，請參閱《AWS Organizations 使用者指南》**中的[服務控制政策](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_policies_scps.html)。
+ **資源控制政策 (RCP)** — 設定您帳戶中資源可用許可的上限。如需詳細資訊，請參閱《AWS Organizations 使用者指南》**中的[資源控制政策 (RCP)](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_policies_rcps.html)。
+ **工作階段政策** — 在以程式設計方式為角色或聯合身分使用者建立臨時工作階段時，以參數形式傳遞的進階政策。如需詳細資訊，請參《*IAM 使用者指南*》中的[工作階段政策](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html#policies_session)。

### 多種政策類型
<a name="security_iam_access-manage-multiple-policies"></a>

當多種類型的政策適用於請求時，產生的許可會更複雜而無法理解。若要了解如何 AWS 在涉及多個政策類型時決定是否允許請求，請參閱《*IAM 使用者指南*》中的[政策評估邏輯](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_evaluation-logic.html)。

# Amazon DynamoDB 如何搭配 IAM 運作
<a name="security_iam_service-with-iam"></a>

在您使用 IAM 管理 DynamoDB 的存取權之前，請了解搭配 DynamoDB 使用的 IAM 功能有哪些。






| IAM 功能 | DynamoDB 支援 | 
| --- | --- | 
|  [身分型政策](#security_iam_service-with-iam-id-based-policies)  |   是  | 
|  [資源型政策](#security_iam_service-with-iam-resource-based-policies)  |   是  | 
|  [政策動作](#security_iam_service-with-iam-id-based-policies-actions)  |   是  | 
|  [政策資源](#security_iam_service-with-iam-id-based-policies-resources)  |   是  | 
|  [政策條件索引鍵](#security_iam_service-with-iam-id-based-policies-conditionkeys)  |   是  | 
|  [ACL](#security_iam_service-with-iam-acls)  |   否   | 
|  [ABAC (政策中的標籤)](#security_iam_service-with-iam-tags)  |   是  | 
|  [臨時憑證](#security_iam_service-with-iam-roles-tempcreds)  |   是  | 
|  [主體許可](#security_iam_service-with-iam-principal-permissions)  |   是  | 
|  [服務角色](#security_iam_service-with-iam-roles-service)  |   是  | 
|  [服務連結角色](#security_iam_service-with-iam-roles-service-linked)  |   是  | 

若要全面了解 DynamoDB 和其他 AWS 服務如何與大多數 IAM 功能搭配使用，請參閱《[AWS IAM 使用者指南》中的與 IAM 搭配使用的 服務](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_aws-services-that-work-with-iam.html)。 **

## 適用於 DynamoDB 的以身分為基礎的政策
<a name="security_iam_service-with-iam-id-based-policies"></a>

**支援身分型政策：**是

身分型政策是可以附加到身分 (例如 IAM 使用者、使用者群組或角色) 的 JSON 許可政策文件。這些政策可控制身分在何種條件下能對哪些資源執行哪些動作。如需了解如何建立身分型政策，請參閱《*IAM 使用者指南*》中的[透過客戶管理政策定義自訂 IAM 許可](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_create.html)。

使用 IAM 身分型政策，您可以指定允許或拒絕的動作和資源，以及在何種條件下允許或拒絕動作。如要了解您在 JSON 政策中使用的所有元素，請參閱《*IAM 使用者指南*》中的 [IAM JSON 政策元素參考](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements.html)。

### DynamoDB 以身分為基礎的政策範例
<a name="security_iam_service-with-iam-id-based-policies-examples"></a>



若要檢視 DynamoDB 以身分為基礎的政策範例，請參閱 [Amazon DynamoDB 以身分為基礎的政策範例](security_iam_id-based-policy-examples.md)。

## DynamoDB 內以資源為基礎的政策
<a name="security_iam_service-with-iam-resource-based-policies"></a>

**支援資源型政策：**是

資源型政策是附加到資源的 JSON 政策文件。資源型政策的最常見範例是 IAM *角色信任政策*和 Amazon S3 *儲存貯體政策*。在支援資源型政策的服務中，服務管理員可以使用它們來控制對特定資源的存取權限。對於附加政策的資源，政策會定義指定的主體可以對該資源執行的動作以及在何種條件下執行的動作。您必須在資源型政策中[指定主體](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_principal.html)。委託人可以包含帳戶、使用者、角色、聯合身分使用者或 AWS 服務。

如需啟用跨帳戶存取權，您可以在其他帳戶內指定所有帳戶或 IAM 實體作為資源型政策的主體。如需詳細資訊，請參閱《*IAM 使用者指南*》中的 [IAM 中的快帳戶資源存取](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies-cross-account-resource-access.html)。

## DynamoDB 的政策動作
<a name="security_iam_service-with-iam-id-based-policies-actions"></a>

**支援政策動作：**是

管理員可以使用 AWS JSON 政策來指定誰可以存取內容。也就是說，哪個**主體**在什麼**條件**下可以對什麼**資源**執行哪些**動作**。

JSON 政策的 `Action` 元素描述您可以用來允許或拒絕政策中存取的動作。政策會使用動作來授予執行相關聯動作的許可。



若要查看 DynamoDB 動作的清單，請參閱《*服務授權參考*》中的 [Amazon DynamoDB 定義的動作](https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazondynamodb.html#amazondynamodb-actions-as-permissions)。

DynamoDB 中的政策動作會在動作之前使用以下字首：

```
aws
```

若要在單一陳述式中指定多個動作，請用逗號分隔。

```
"Action": [
      "aws:action1",
      "aws:action2"
         ]
```





若要檢視 DynamoDB 以身分為基礎的政策範例，請參閱 [Amazon DynamoDB 以身分為基礎的政策範例](security_iam_id-based-policy-examples.md)。

## DynamoDB 的政策資源
<a name="security_iam_service-with-iam-id-based-policies-resources"></a>

**支援政策資源：**是

管理員可以使用 AWS JSON 政策來指定誰可以存取內容。也就是說，哪個**主體**在什麼**條件**下可以對什麼**資源**執行哪些**動作**。

`Resource` JSON 政策元素可指定要套用動作的物件。最佳實務是使用其 [Amazon Resource Name (ARN)](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference-arns.html) 來指定資源。若動作不支援資源層級許可，使用萬用字元 (\$1) 表示該陳述式適用於所有資源。

```
"Resource": "*"
```

若要查看 DynamoDB 資源類型清單及其 ARN，請參閱《*服務授權參考*》中的 [Amazon DynamoDB 定義的資源](https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazondynamodb.html#amazondynamodb-resources-for-iam-policies)。若要了解您可以使用哪些動作指定每個資源的 ARN，請參閱 [Amazon DynamoDB 定義的動作](https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazondynamodb.html#amazondynamodb-actions-as-permissions)。





若要檢視 DynamoDB 以身分為基礎的政策範例，請參閱 [Amazon DynamoDB 以身分為基礎的政策範例](security_iam_id-based-policy-examples.md)。

## DynamoDB 的政策條件索引鍵
<a name="security_iam_service-with-iam-id-based-policies-conditionkeys"></a>

**支援服務特定政策條件金鑰：**是

管理員可以使用 AWS JSON 政策來指定誰可以存取內容。也就是說，哪個**主體**在什麼**條件**下可以對什麼**資源**執行哪些**動作**。

`Condition` 元素會根據定義的條件，指定陳述式的執行時機。您可以建立使用[條件運算子](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html)的條件運算式 (例如等於或小於)，來比對政策中的條件和請求中的值。若要查看所有 AWS 全域條件索引鍵，請參閱《*IAM 使用者指南*》中的[AWS 全域條件內容索引鍵](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html)。

如要查看 DynamoDB 條件索引鍵的清單，請參閱《*服務授權參考*》中的 [Amazon DynamoDB 的條件索引鍵](https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazondynamodb.html#amazondynamodb-policy-keys)。若要了解您可以搭配哪些動作和資源使用條件索引鍵，請參閱 [Amazon DynamoDB 定義的動作](https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazondynamodb.html#amazondynamodb-actions-as-permissions)。

若要檢視 DynamoDB 以身分為基礎的政策範例，請參閱 [Amazon DynamoDB 以身分為基礎的政策範例](security_iam_id-based-policy-examples.md)。

## DynamoDB 中的存取控制清單 (ACL)
<a name="security_iam_service-with-iam-acls"></a>

**支援 ACL：**否 

存取控制清單 (ACL) 可控制哪些主體 (帳戶成員、使用者或角色) 擁有存取某資源的許可。ACL 類似於資源型政策，但它們不使用 JSON 政策文件格式。

## 搭配 DynamoDB 的屬性型存取控制 (ABAC)
<a name="security_iam_service-with-iam-tags"></a>

**支援 ABAC (政策中的標籤)：**是

屬性型存取控制 (ABAC) 是一種授權策略，依據稱為標籤的屬性來定義許可。您可以將標籤連接至 IAM 實體 AWS 和資源，然後設計 ABAC 政策，以便在主體的標籤符合資源上的標籤時允許操作。

如需根據標籤控制存取，請使用 `aws:ResourceTag/key-name`、`aws:RequestTag/key-name` 或 `aws:TagKeys` 條件索引鍵，在政策的[條件元素](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition.html)中，提供標籤資訊。

如果服務支援每個資源類型的全部三個條件金鑰，則對該服務而言，值為 **Yes**。如果服務僅支援某些資源類型的全部三個條件金鑰，則值為 **Partial**。

如需 ABAC 的詳細資訊，請參閱《*IAM 使用者指南*》中的[使用 ABAC 授權定義許可](https://docs.aws.amazon.com/IAM/latest/UserGuide/introduction_attribute-based-access-control.html)。如要查看含有設定 ABAC 步驟的教學課程，請參閱《*IAM 使用者指南*》中的[使用屬性型存取控制 (ABAC)](https://docs.aws.amazon.com/IAM/latest/UserGuide/tutorial_attribute-based-access-control.html)。

## 將臨時憑證與 DynamoDB 搭配使用
<a name="security_iam_service-with-iam-roles-tempcreds"></a>

**支援臨時憑證：**是

臨時登入資料提供 AWS 資源的短期存取權，當您使用聯合或切換角色時，會自動建立。 AWS 建議您動態產生臨時登入資料，而不是使用長期存取金鑰。如需詳細資訊，請參閱《*IAM 使用者指南*》中的 [IAM 中的臨時安全憑證](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp.html)與[可與 IAM 搭配運作的AWS 服務](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_aws-services-that-work-with-iam.html)。

## DynamoDB 的跨服務主體許可
<a name="security_iam_service-with-iam-principal-permissions"></a>

**支援轉寄存取工作階段 (FAS)：**是

 轉送存取工作階段 (FAS) 使用呼叫 的委託人許可 AWS 服務，並結合 AWS 服務 請求向下游服務提出請求。如需提出 FAS 請求時的政策詳細資訊，請參閱[轉發存取工作階段](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_forward_access_sessions.html)。

## DynamoDB 的服務角色
<a name="security_iam_service-with-iam-roles-service"></a>

**支援服務角色：**是

 服務角色是服務擔任的 [IAM 角色](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html)，可代您執行動作。IAM 管理員可以從 IAM 內建立、修改和刪除服務角色。如需詳細資訊，請參閱《*IAM 使用者指南*》中的[建立角色以委派許可權給 AWS 服務](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-service.html)。

**警告**  
變更服務角色的許可有可能會讓 DynamoDB 功能出現故障。只有 DynamoDB 提供指引時，才能編輯服務角色。

## DynamoDB 的服務連結角色
<a name="security_iam_service-with-iam-roles-service-linked"></a>

**支援服務連結角色：**是

 服務連結角色是連結至 的一種服務角色 AWS 服務。服務可以擔任代表您執行動作的角色。服務連結角色會出現在您的 中 AWS 帳戶 ，並由服務擁有。IAM 管理員可以檢視，但不能編輯服務連結角色的許可。

如需建立或管理服務連結角色的詳細資訊，請參閱[可搭配 IAM 運作的AWS 服務](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_aws-services-that-work-with-iam.html)。在資料表中尋找服務，其中包含**服務連結角色**欄中的 `Yes`。選擇**是**連結，以檢視該服務的服務連結角色文件。

### DynamoDB 支援的服務連結角色
<a name="security_iam_service-with-iam-roles-service-linked-supported-by-dynamodb"></a>

DynamoDB 支援下列服務連結角色。
+ DynamoDB 使用服務連結角色 **AWSServiceRoleForDynamoDBReplication** 來執行跨 AWS 區域的全域資料表複寫。如需 **AWSServiceRoleForDynamoDBReplication** 服務連結角色的詳細資訊，請參閱 [DynamoDB 全域資料表安全性](globaltables-security.md)。
+ DynamoDB Accelerator (DAX) 使用服務連結角色 **AWSServiceRoleForDAX** 來設定與維護 DAX 叢集。如需 **AWSServiceRoleForDAX** 服務連結角色的詳細資訊，請參閱 [使用 DAX 的服務連結 IAM 角色](using-service-linked-roles.md)。

除了這些 DynamoDB 服務連結角色外，DynamoDB 也會使用 Application Auto Scaling 服務自動管理佈建容量模式資料表的輸送量設定。Application Auto Scaling 服務會使用服務連結角色 **AWSServiceRoleForApplicationAutoScaling\$1DynamoDBTable**，以管理已啟用自動調整的 DynamoDB 資料表之輸送量設定。如需更多詳細資訊，請參閱 [Application Auto Scaling 的服務連結角色](https://docs.aws.amazon.com/autoscaling/application/userguide/application-auto-scaling-service-linked-roles.html)。

# Amazon DynamoDB 以身分為基礎的政策範例
<a name="security_iam_id-based-policy-examples"></a>

根據預設，使用者和角色不具備建立或修改 DynamoDB 資源的許可。若要授予使用者對其所需資源執行動作的許可，IAM 管理員可以建立 IAM 政策。

如需了解如何使用這些範例 JSON 政策文件建立 IAM 身分型政策，請參閱《*IAM 使用者指南*》中的[建立 IAM 政策 (主控台)](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_create-console.html)。

如需 DynamoDB 所定義之動作和資源類型的詳細資訊，包括每種資源類型的 ARN 格式，請參閱《*服務授權參考*》中 [Amazon DynamoDB 適用的動作、資源和條件索引鍵](https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazondynamodb.html)。

**Topics**
+ [政策最佳實務](#security_iam_service-with-iam-policy-best-practices)
+ [使用 DynamoDB 主控台](#security_iam_id-based-policy-examples-console)
+ [允許使用者檢視他們自己的許可](#security_iam_id-based-policy-examples-view-own-permissions)
+ [搭配 Amazon DynamoDB 使用身分型政策](using-identity-based-policies.md)

## 政策最佳實務
<a name="security_iam_service-with-iam-policy-best-practices"></a>

以身分為基礎的政策會判斷您帳戶中的某個人員是否可以建立、存取或刪除 DynamoDB 資源。這些動作可能會讓您的 AWS 帳戶產生費用。當您建立或編輯身分型政策時，請遵循下列準則及建議事項：
+ **開始使用 AWS 受管政策並邁向最低權限許可** – 若要開始將許可授予您的使用者和工作負載，請使用將許可授予許多常見使用案例的 *AWS 受管政策*。它們可在您的 中使用 AWS 帳戶。我們建議您定義特定於使用案例 AWS 的客戶受管政策，以進一步減少許可。如需更多資訊，請參閱《*IAM 使用者指南*》中的 [AWS 受管政策](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_managed-vs-inline.html#aws-managed-policies)或[任務職能的AWS 受管政策](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_job-functions.html)。
+ **套用最低權限許可** – 設定 IAM 政策的許可時，請僅授予執行任務所需的許可。為實現此目的，您可以定義在特定條件下可以對特定資源採取的動作，這也稱為*最低權限許可*。如需使用 IAM 套用許可的更多相關資訊，請參閱《*IAM 使用者指南*》中的 [IAM 中的政策和許可](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html)。
+ **使用 IAM 政策中的條件進一步限制存取權** – 您可以將條件新增至政策，以限制動作和資源的存取。例如，您可以撰寫政策條件，指定必須使用 SSL 傳送所有請求。如果透過特定 等使用服務動作 AWS 服務，您也可以使用條件來授予其存取權 CloudFormation。如需詳細資訊，請參閱《*IAM 使用者指南*》中的 [IAM JSON 政策元素：條件](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition.html)。
+ **使用 IAM Access Analyzer 驗證 IAM 政策，確保許可安全且可正常運作** – IAM Access Analyzer 驗證新政策和現有政策，確保這些政策遵從 IAM 政策語言 (JSON) 和 IAM 最佳實務。IAM Access Analyzer 提供 100 多項政策檢查及切實可行的建議，可協助您撰寫安全且實用的政策。如需詳細資訊，請參閱《*IAM 使用者指南*》中的[使用 IAM Access Analyzer 驗證政策](https://docs.aws.amazon.com/IAM/latest/UserGuide/access-analyzer-policy-validation.html)。
+ **需要多重要素驗證 (MFA)** – 如果您的案例需要 IAM 使用者或 中的根使用者 AWS 帳戶，請開啟 MFA 以提高安全性。如需在呼叫 API 操作時請求 MFA，請將 MFA 條件新增至您的政策。如需詳細資訊，請參閱《*IAM 使用者指南*》中的[透過 MFA 的安全 API 存取](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_mfa_configure-api-require.html)。

如需 IAM 中最佳實務的相關資訊，請參閱《*IAM 使用者指南*》中的 [IAM 安全最佳實務](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html)。

## 使用 DynamoDB 主控台
<a name="security_iam_id-based-policy-examples-console"></a>

若要存取 Amazon DynamoDB 主控台，您必須擁有最基本的一組許可。這些許可必須允許您列出和檢視 中 DynamoDB 資源的詳細資訊 AWS 帳戶。如果您建立比最基本必要許可更嚴格的身分型政策，則對於具有該政策的實體 (使用者或角色) 而言，主控台就無法如預期運作。

對於僅呼叫 AWS CLI 或 AWS API 的使用者，您不需要允許最低主控台許可。反之，只需允許存取符合他們嘗試執行之 API 操作的動作就可以了。

為了確保使用者和角色仍然可以使用 DynamoDB 主控台，請將 DynamoDB `ConsoleAccess`或 `ReadOnly` AWS 受管政策連接到實體。如需詳細資訊，請參閱《*IAM 使用者指南*》中的[新增許可到使用者](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_users_change-permissions.html#users_change_permissions-add-console)。

## 允許使用者檢視他們自己的許可
<a name="security_iam_id-based-policy-examples-view-own-permissions"></a>

此範例會示範如何建立政策，允許 IAM 使用者檢視附加到他們使用者身分的內嵌及受管政策。此政策包含在主控台或使用 或 AWS CLI AWS API 以程式設計方式完成此動作的許可。

```
{
    "Version": "2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "ViewOwnUserInfo",
            "Effect": "Allow",
            "Action": [
                "iam:GetUserPolicy",
                "iam:ListGroupsForUser",
                "iam:ListAttachedUserPolicies",
                "iam:ListUserPolicies",
                "iam:GetUser"
            ],
            "Resource": ["arn:aws:iam::*:user/${aws:username}"]
        },
        {
            "Sid": "NavigateInConsole",
            "Effect": "Allow",
            "Action": [
                "iam:GetGroupPolicy",
                "iam:GetPolicyVersion",
                "iam:GetPolicy",
                "iam:ListAttachedGroupPolicies",
                "iam:ListGroupPolicies",
                "iam:ListPolicyVersions",
                "iam:ListPolicies",
                "iam:ListUsers"
            ],
            "Resource": "*"
        }
    ]
}
```

# 搭配 Amazon DynamoDB 使用身分型政策
<a name="using-identity-based-policies"></a>

本主題涵蓋搭配 Amazon DynamoDB 使用身分型 AWS Identity and Access Management (IAM) 政策，並提供範例。這些範例會示範帳戶管理員如何將許可政策連接至 IAM 身分 (使用者、群組和角色)，並藉此授與許可，以取得在 Amazon DynamoDB 資源上執行操作的許可。

本主題中的各節涵蓋下列內容：
+ [使用 Amazon DynamoDB 主控台所需的 IAM 許可](#console-permissions)
+ [AWS Amazon DynamoDB 的受管 （預先定義） IAM 政策](#access-policy-examples-aws-managed)
+ [客戶管理政策範例](#access-policy-examples-for-sdk-cli)



以下是許可政策的範例。

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "DescribeQueryScanBooksTable",
            "Effect": "Allow",
            "Action": [
                "dynamodb:DescribeTable",
                "dynamodb:Query",
                "dynamodb:Scan"
            ],
            "Resource": "arn:aws:dynamodb:us-west-2:111122223333:table/Books"
        }
    ]
}
```

------

 上述政策有一個陳述式，可授予 `us-west-2` AWS 區域中資料表上三個 DynamoDB 動作 (`dynamodb:DescribeTable`、 `dynamodb:Query`和 `dynamodb:Scan`) 的許可，該動作由 指定的 AWS 帳戶所擁有`account-id`。`Resource` 值中的 *Amazon Resource Name (ARN)* 會指定許可適用的資料表。

## 使用 Amazon DynamoDB 主控台所需的 IAM 許可
<a name="console-permissions"></a>

若要使用 DynamoDB 主控台，使用者必須擁有一組最低許可，允許使用者使用其 AWS 帳戶的 DynamoDB 資源。除了這些 DynamoDB 許可之外，主控台還需要以下許可：
+ 顯示指標和圖形的 Amazon CloudWatch 許可。
+ AWS Data Pipeline 匯出和匯入 DynamoDB 資料的許可。
+  AWS Identity and Access Management 存取匯出和匯入所需角色的許可。
+ 只要觸發 CloudWatch 警示就通知您的 Amazon Simple Notification Service 許可。
+ AWS Lambda 處理 DynamoDB Streams 記錄的許可。

如果您建立比最基本必要許可更嚴格的 IAM 政策，則對於採取該 IAM 政策的使用者而言，主控台就無法如預期運作。為了確保這些使用者仍然可以使用 DynamoDB 主控台，也請將 `AmazonDynamoDBReadOnlyAccess` AWS 受管政策連接至使用者，如中所述[AWS Amazon DynamoDB 的受管 （預先定義） IAM 政策](#access-policy-examples-aws-managed)。

對於僅呼叫 AWS CLI 或 Amazon DynamoDB API 的使用者，您不需要允許最低主控台許可。

**注意**  
 若您參考 VPC 端點，您也需使用 IAM 動作 (dynamodb:DescribeEndpoints)，對請求的 IAM 主體授權 DescribeEndpoints API 呼叫。如需更多資訊，請參閱[端點所需的政策](inter-network-traffic-privacy.md#inter-network-traffic-DescribeEndpoints)。

## AWS Amazon DynamoDB 的受管 （預先定義） IAM 政策
<a name="access-policy-examples-aws-managed"></a>

AWS 提供由 建立和管理的獨立 IAM 政策，以解決一些常見的使用案例 AWS。這些 AWS 受管政策會授予常見使用案例的必要許可，讓您不必調查需要哪些許可。如需詳細資訊，請參閱《*IAM 使用者指南*》中的 [AWS 受管政策](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_managed-vs-inline.html#aws-managed-policies)。

下列 AWS 受管政策可連接至您帳戶中的使用者，其專屬於 DynamoDB，並依使用案例案例分組：
+ **AmazonDynamoDBReadOnlyAccess** – 透過 授予 DynamoDB 資源的唯讀存取權 AWS 管理主控台。
+ **AmazonDynamoDBFullAccess** – 透過 授予 DynamoDB 資源的完整存取權 AWS 管理主控台。

您可以登入 IAM 主控台並在其中搜尋特定政策，以檢閱這些 AWS 受管許可政策。

**重要**  
最佳實務是建立自訂 IAM 政策，授予[最低權限](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html#grant-least-privilege)給需要的使用者、角色或群組。

## 客戶管理政策範例
<a name="access-policy-examples-for-sdk-cli"></a>

在本節中，您可以找到授予各種 DynamoDB 動作許可之政策範例。當您使用 AWS SDKs或 時，這些政策即可運作 AWS CLI。在您使用主控台時，需要授予特定的其他許可給主控台。如需詳細資訊，請參閱[使用 Amazon DynamoDB 主控台所需的 IAM 許可](#console-permissions)。

**注意**  
下列所有政策範例都使用其中一個 AWS 區域，並包含虛構的帳戶 IDs 和資料表名稱。

範例：
+ [將許可授與資料表上所有 DynamoDB 動作的 IAM 政策](grant-permissions-to-any-action-on-table.md)
+ [用來授予 DynamoDB 資料表項目唯讀許可的 IAM 政策](read-only-permissions-on-table-items.md)
+ [授予特定 DynamoDB 資料表及其索引存取權限的 IAM 政策](iam-policy-specific-table-indexes.md)
+ [讀取、寫入、更新和刪除 DynamoDB 資料表存取權限的 IAM 政策](iam-policy-example-data-crud.md)
+ [在相同 AWS 帳戶中分隔 DynamoDB 環境的 IAM 政策](iam-policy-separate-environments.md)
+ [避免購買 DynamoDB 預留容量的 IAM 政策](iam-prevent-purchase-reserved-capacity.md)
+ [僅授予 DynamoDB 串流讀取存取權限的 IAM 政策 (不適用於資料表)](iam-policy-read-stream-only.md)
+ [允許 AWS Lambda 函數存取 DynamoDB 串流記錄的 IAM 政策](iam-policy-example-lamda-process-dynamodb-streams.md)
+ [允許對 DynamoDB Accelerator (DAX) 叢集進行讀取和寫入的 IAM 政策](iam-policy-example-read-write-dax-access.md)

 《IAM 使用者指南》包含[三個其他 DynamoDB 範例](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_examples.html)：
+ [Amazon DynamoDB：允許存取特定資料表](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_examples_dynamodb_specific-table.html)
+ [Amazon DynamoDB：允許存取特定資料欄](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_examples_dynamodb_columns.html)
+ [Amazon DynamoDB：允許根據 Amazon Cognito ID 對 DynamoDB 進行資料列層級存取](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_examples_dynamodb_rows.html)

# 將許可授與資料表上所有 DynamoDB 動作的 IAM 政策
<a name="grant-permissions-to-any-action-on-table"></a>

下列政策會對資料表上名為 `Books` 的*所有* DynamoDB 動作授予許可。中指定的資源 ARN `Resource`可識別特定 AWS 區域中的資料表。如果以萬用字元 (\$1) 代替 `Resource` ARN 中的資料表名稱 `Books`，則允許對帳戶中的*所有*資料表執行*所有* DynamoDB 動作。在此或任何 IAM 政策上使用萬用字元之前，請仔細考慮可能發生的安全性影響。

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "AllAPIActionsOnBooks",
            "Effect": "Allow",
            "Action": "dynamodb:*",
            "Resource": "arn:aws:dynamodb:us-west-2:123456789012:table/Books"
        }
    ]
}
```

------

**注意**  
這是使用萬用字元 (\$1) 允許*所有*動作的範例，包括管理、資料操作、監控和購買 DynamoDB 預留容量。反之，最佳實務是明確指定要授予的每個動作，以及只指定該使用者、角色或群組所需的動作。

# 用來授予 DynamoDB 資料表項目唯讀許可的 IAM 政策
<a name="read-only-permissions-on-table-items"></a>

下列許可政策只會授予 `GetItem`、`BatchGetItem`、`Scan`、`Query` 和 `ConditionCheckItem` DynamoDB 動作的許可，進而在 `Books` 資料表上設定唯讀存取權。

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "ReadOnlyAPIActionsOnBooks",
            "Effect": "Allow",
            "Action": [
                "dynamodb:GetItem",
                "dynamodb:BatchGetItem",
                "dynamodb:Scan",
                "dynamodb:Query",
                "dynamodb:ConditionCheckItem"
            ],
            "Resource": "arn:aws:dynamodb:us-west-2:123456789012:table/Books"
        }
    ]
}
```

------

# 授予特定 DynamoDB 資料表及其索引存取權限的 IAM 政策
<a name="iam-policy-specific-table-indexes"></a>

下列政策會針對名為 `Books` 的 DynamoDB 資料表上的資料修改動作和該表所有的索引授予許可。如需索引運作方式的詳細資訊，請參閱 [在 DynamoDB 中使用次要索引來改善資料存取](SecondaryIndexes.md)。

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "AccessTableAllIndexesOnBooks",
            "Effect": "Allow",
            "Action": [
              "dynamodb:PutItem",
              "dynamodb:UpdateItem",
              "dynamodb:DeleteItem",
              "dynamodb:BatchWriteItem",
              "dynamodb:GetItem",
              "dynamodb:BatchGetItem",
              "dynamodb:Scan",
              "dynamodb:Query",
              "dynamodb:ConditionCheckItem"
            ],
            "Resource": [
                "arn:aws:dynamodb:us-west-2:123456789012:table/Books",
                "arn:aws:dynamodb:us-west-2:123456789012:table/Books/index/*"
            ]
        }
    ]
}
```

------

# 讀取、寫入、更新和刪除 DynamoDB 資料表存取權限的 IAM 政策
<a name="iam-policy-example-data-crud"></a>

如果您需要允許應用程式建立、讀取、更新和刪除 Amazon DynamoDB 資料表、索引和串流中的資料，請使用此政策。視需要替換 AWS 區域名稱、您的帳戶 ID，以及資料表名稱或萬用字元 (\$1)。

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "DynamoDBIndexAndStreamAccess",
            "Effect": "Allow",
            "Action": [
                "dynamodb:GetShardIterator",
                "dynamodb:Scan",
                "dynamodb:Query",
                "dynamodb:DescribeStream",
                "dynamodb:GetRecords",
                "dynamodb:ListStreams"
            ],
            "Resource": [
                "arn:aws:dynamodb:us-west-2:123456789012:table/Books/index/*",
                "arn:aws:dynamodb:us-west-2:123456789012:table/Books/stream/*"
            ]
        },
        {
            "Sid": "DynamoDBTableAccess",
            "Effect": "Allow",
            "Action": [
                "dynamodb:BatchGetItem",
                "dynamodb:BatchWriteItem",
                "dynamodb:ConditionCheckItem",
                "dynamodb:PutItem",
                "dynamodb:DescribeTable",
                "dynamodb:DeleteItem",
                "dynamodb:GetItem",
                "dynamodb:Scan",
                "dynamodb:Query",
                "dynamodb:UpdateItem"
            ],
            "Resource": "arn:aws:dynamodb:us-west-2:123456789012:table/Books"
        },
        {
            "Sid": "DynamoDBDescribeLimitsAccess",
            "Effect": "Allow",
            "Action": "dynamodb:DescribeLimits",
            "Resource": [
                "arn:aws:dynamodb:us-west-2:123456789012:table/Books",
                "arn:aws:dynamodb:us-west-2:123456789012:table/Books/index/*"
            ]
        }
    ]
}
```

------

若要展開此政策以涵蓋此帳戶所有 AWS 區域中的所有 DynamoDB 資料表，請針對區域和資料表名稱使用萬用字元 (\$1)。例如：

```
"Resource":[
                "arn:aws:dynamodb:*:123456789012:table/*",
                "arn:aws:dynamodb:*:123456789012:table/*/index/*"
                ]
```

# 在相同 AWS 帳戶中分隔 DynamoDB 環境的 IAM 政策
<a name="iam-policy-separate-environments"></a>

假設您有不同的環境，且每個環境都會維護各自版本的資料表 (名為 `ProductCatalog`)。如果您在同一個 AWS 帳戶中建立兩個`ProductCatalog`資料表，由於許可的設定方式，在一個環境中工作可能會影響另一個環境。例如，在 AWS 帳戶層級設定並行控制平面操作數量的配額 （例如 `CreateTable`)。

因此，一個環境中的每個動作都會減少另一個環境中可用的操作數目。還有一種風險是，一個環境中的程式碼可能會在另一個環境中意外存取資料表。

**注意**  
若想區隔生產和測試工作負載來協助控制事件的潛在「爆炸範圍」，最佳實務是為測試和生產工作負載建立不同的 AWS 帳戶。如需詳細資訊，請參閱 [AWS 帳戶管理與區隔](https://docs.aws.amazon.com//wellarchitected/latest/security-pillar/aws-account-management-and-separation.html)。

進一步假設您有兩位開發人員 (Amit 和 Alice) 正在測試 `ProductCatalog` 資料表。您的開發人員可以共用相同的測試 AWS 帳戶，而不是每個需要個別 AWS 帳戶的開發人員。在此測試帳戶中，您可以建立相同資料表的複本以供每位開發人員處理 (例如 `Alice_ProductCatalog` 和 `Amit_ProductCatalog`)。在這種情況下，您可以在為測試環境建立的 AWS 帳戶中建立使用者 Alice 和 Amit。您接著可以將許可授予這些使用者，以對他們擁有的資料表執行 DynamoDB 動作。

若要授予這些 IAM 使用者許可，您可以執行下列其中一項：
+ 為每位使用者建立不同的政策，然後分別將每個政策連接至其使用者。例如，您可以將下列政策連接至使用者 Alice，允許她存取 `Alice_ProductCatalog` 資料表上的所有 DynamoDB 動作：

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

****  

  ```
  {
      "Version":"2012-10-17",		 	 	 
      "Statement": [
          {
              "Sid": "AllAPIActionsOnAliceTable",
              "Effect": "Allow",
              "Action": [
                "dynamodb:DeleteItem",
                "dynamodb:DescribeContributorInsights",
                "dynamodb:RestoreTableToPointInTime",
                "dynamodb:ListTagsOfResource",
                "dynamodb:CreateTableReplica",
                "dynamodb:UpdateContributorInsights",
                "dynamodb:CreateBackup",
                "dynamodb:DeleteTable",
                "dynamodb:UpdateTableReplicaAutoScaling",
                "dynamodb:UpdateContinuousBackups",
                "dynamodb:TagResource",
                "dynamodb:DescribeTable",
                "dynamodb:GetItem",
                "dynamodb:DescribeContinuousBackups",
                "dynamodb:BatchGetItem",
                "dynamodb:UpdateTimeToLive",
                "dynamodb:BatchWriteItem",
                "dynamodb:ConditionCheckItem",
                "dynamodb:UntagResource",
                "dynamodb:PutItem",
                "dynamodb:Scan",
                "dynamodb:Query",
                "dynamodb:UpdateItem",
                "dynamodb:DeleteTableReplica",
                "dynamodb:DescribeTimeToLive",
                "dynamodb:RestoreTableFromBackup",
                "dynamodb:UpdateTable",
                "dynamodb:DescribeTableReplicaAutoScaling",
                "dynamodb:GetShardIterator",
                "dynamodb:DescribeStream",
                "dynamodb:GetRecords",
                "dynamodb:DescribeLimits",
                "dynamodb:ListStreams"
              ],
              "Resource": "arn:aws:dynamodb:us-west-2:123456789012:table/Alice_ProductCatalog/*"
          }
      ]
  }
  ```

------

  然後，您可以為使用者 Amit 建立具有不同資源 (`Amit_ProductCatalog` 資料表) 的類似政策。
+ 您可以使用 IAM 政策變數來撰寫單一政策，並將它連接至群組，而不是將政策連接至個別使用者。您需要建立群組，而在此範例中，會將使用者 Alice 和 Amit 新增至群組。下列範例授予對 `${aws:username}_ProductCatalog` 資料表執行所有 DynamoDB 動作的許可。評估政策時，政策變數 `${aws:username}` 會取代為申請者的使用者名稱。例如，如果 Alice 傳送新增項目的請求，則只有在 Alice 將項目新增至 `Alice_ProductCatalog` 資料表時，才允許此動作。

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

****  

  ```
  {
      "Version":"2012-10-17",		 	 	 
      "Statement": [
          {
              "Sid": "ActionsOnUserSpecificTable",
              "Effect": "Allow",
              "Action": [
                "dynamodb:PutItem",
                "dynamodb:UpdateItem",
                "dynamodb:DeleteItem",
                "dynamodb:BatchWriteItem",
                "dynamodb:GetItem",
                "dynamodb:BatchGetItem",
                "dynamodb:Scan",
                "dynamodb:Query",
                "dynamodb:ConditionCheckItem"
              ],
              "Resource": "arn:aws:dynamodb:us-west-2:123456789012:table/${aws:username}_ProductCatalog"
          },
          {
              "Sid": "AdditionalPrivileges",
              "Effect": "Allow",
              "Action": [
                  "dynamodb:ListTables",
                  "dynamodb:DescribeTable",
                  "dynamodb:DescribeContributorInsights"
              ],
              "Resource": "arn:aws:dynamodb:us-west-2:123456789012:table/*"
          }
      ]
  }
  ```

------

**注意**  
使用 IAM 政策變數時，您必須在政策中明確地指定 `2012-10-17` 版本的 IAM 政策語言。IAM 政策語言 (`2008-10-17`) 的預設版本不支援政策變數。

您可以對資料表使用萬用字元 (\$1) 授予許可 (而不是如同一般作法將特定資料表識別為資源)，在這些資料表中，資料表名稱的前面會加上提出請求的使用者，如下範例所示。

```
"Resource":"arn:aws:dynamodb:us-west-2:123456789012:table/${aws:username}_*"
```

# 避免購買 DynamoDB 預留容量的 IAM 政策
<a name="iam-prevent-purchase-reserved-capacity"></a>

使用 Amazon DynamoDB 預留容量，您會支付一次性預付費用，並承諾在一段時間支付最低消費額，以大幅降低成本。您可以使用 AWS 管理主控台 檢視和購買預留容量。不過，您可能不希望組織中的所有使用者都可以購買預留容量。如需預留容量的詳細資訊，請參閱 [Amazon DynamoDB 定價](https://aws.amazon.com/dynamodb/pricing)。

DynamoDB 提供下列 API 操作，以控制對預留容量管理的存取：
+ `dynamodb:DescribeReservedCapacity`：傳回目前生效的預留容量購買。
+ `dynamodb:DescribeReservedCapacityOfferings`：傳回 AWS目前所提供之預留容量方案的詳細資訊。
+ `dynamodb:PurchaseReservedCapacityOfferings`：執行實際購買的預留容量。

 AWS 管理主控台 使用這些 API 動作來顯示預留容量資訊並進行購買。您無法從應用程式呼叫這些操作，因為只有從主控台才能加以存取。不過，您可以在 IAM 許可政策中允許或拒絕存取這些操作。

下列政策允許使用者使用 檢視預留容量購買和優惠 AWS 管理主控台 ，但拒絕新購買。

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "AllowReservedCapacityDescriptions",
            "Effect": "Allow",
            "Action": [
                "dynamodb:DescribeReservedCapacity",
                "dynamodb:DescribeReservedCapacityOfferings"
            ],
            "Resource": "arn:aws:dynamodb:us-west-2:123456789012:*"
        },
        {
            "Sid": "DenyReservedCapacityPurchases",
            "Effect": "Deny",
            "Action": "dynamodb:PurchaseReservedCapacityOfferings",
            "Resource": "arn:aws:dynamodb:us-west-2:123456789012:*"
        }
    ]
}
```

------

請注意，此政策使用萬用字元 (\$1) 來允許所有、和描述許可，以拒絕為所有人購買 DynamoDB 預留容量。

# 僅授予 DynamoDB 串流讀取存取權限的 IAM 政策 (不適用於資料表)
<a name="iam-policy-read-stream-only"></a>

當您為資料表啟用 DynamoDB Streams 時，會擷取資料表中每個資料項目的修改資訊。如需詳細資訊，請參閱 [DynamoDB Streams 的變更資料擷取](Streams.md)。

在部分情況下，建議您防止應用程式讀取 DynamoDB 資料表中的資料，但同時仍然允許存取該資料表的串流。例如，您可以 AWS Lambda 設定 在偵測到項目更新時輪詢串流和叫用 Lambda 函數，然後執行其他處理。

下列動作可用來控制對 DynamoDB Streams 的存取：
+ `dynamodb:DescribeStream`
+ `dynamodb:GetRecords`
+ `dynamodb:GetShardIterator`
+ `dynamodb:ListStreams`

下列範例政策會將存取名為 `GameScores` 之資料表上串流的許可授予使用者。ARN 中的萬用字元 (\$1) 可符合與該資料表建立關聯的任何串流。

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "AccessGameScoresStreamOnly",
            "Effect": "Allow",
            "Action": [
                "dynamodb:DescribeStream",
                "dynamodb:GetRecords",
                "dynamodb:GetShardIterator",
                "dynamodb:ListStreams"
            ],
            "Resource": "arn:aws:dynamodb:us-west-2:123456789012:table/GameScores/stream/*"
        }
    ]
}
```

------

請注意，此政策會授予存取 `GameScores` 資料表串流的權限，但不允許存取資料表本身。

# 允許 AWS Lambda 函數存取 DynamoDB 串流記錄的 IAM 政策
<a name="iam-policy-example-lamda-process-dynamodb-streams"></a>

如果您想要根據 DynamoDB 串流中的事件執行特定動作，您可以撰寫由這些事件觸發的 AWS Lambda 函數。這類 Lambda 函式需要從 DynamoDB Streams 讀取資料的許可。如需有關搭配使用 Lambda 和 DynamoDB Streams 的詳細資訊，請參閱 [DynamoDB 串流和 AWS Lambda 觸發](Streams.Lambda.md)。

若要將許可授予 Lambda，請使用與 Lambda 函式 IAM 角色相關聯的許可政策 (也稱為執行角色)。在您建立 Lambda 函式時，請指定此政策。

例如，您可以將下列許可政策與執行角色建立關聯，以授予執行所列 DynamoDB Streams 動作的 Lambda 許可。

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "APIAccessForDynamoDBStreams",
            "Effect": "Allow",
            "Action": [
                "dynamodb:GetRecords",
                "dynamodb:GetShardIterator",
                "dynamodb:DescribeStream",
                "dynamodb:ListStreams"
            ],
            "Resource": "arn:aws:dynamodb:us-west-2:123456789012:table/GameScores/stream/*"
        }
    ]
}
```

------

如需詳細資訊，請參閱《*AWS Lambda 開發人員指南*》中的 [AWS Lambda 許可](https://docs.aws.amazon.com/lambda/latest/dg/intro-permission-model.html)。

# 允許對 DynamoDB Accelerator (DAX) 叢集進行讀取和寫入的 IAM 政策
<a name="iam-policy-example-read-write-dax-access"></a>

以下政策允許對 DynamoDB Accelerator (DAX) 叢集 (而非相關聯的 DynamoDB 資料表)，執行讀取、寫入、更新和刪除。若要使用此政策，請取代 AWS 區域名稱、您的帳戶 ID 和 DAX 叢集的名稱。

**注意**  
此政策允許存取 DAX 叢集，但不允許存取相關聯的 DynamoDB 資料表。請確定您的 DAX 叢集具有正確政策，可代表您在 DynamoDB 資料表上執行這些相同操作。

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "AmazonDynamoDBDAXDataOperations",
            "Effect": "Allow",
            "Action": [
                "dax:GetItem",
                "dax:PutItem",
                "dax:ConditionCheckItem",
                "dax:BatchGetItem",
                "dax:BatchWriteItem",
                "dax:DeleteItem",
                "dax:Query",
                "dax:UpdateItem",
                "dax:Scan"
            ],
            "Resource": "arn:aws:dax:eu-west-1:123456789012:cache/MyDAXCluster"
        }
    ]
}
```

------

若要展開此政策以涵蓋帳戶所有 AWS 區域的 DAX 存取，請針對區域名稱使用萬用字元 (\$1)。

```
"Resource": "arn:aws:dax:*:123456789012:cache/MyDAXCluster"
```







# Amazon DynamoDB 身分識別和存取疑難排解
<a name="security_iam_troubleshoot"></a>

請使用以下資訊來協助您診斷和修正使用 DynamoDB 和 IAM 時發生的常見問題。

**Topics**
+ [我未獲授權，不得在 DynamoDB 中執行動作](#security_iam_troubleshoot-no-permissions)
+ [我未獲得執行 iam:PassRole 的授權](#security_iam_troubleshoot-passrole)
+ [我想要允許 以外的人員 AWS 帳戶 存取我的 DynamoDB 資源](#security_iam_troubleshoot-cross-account-access)

## 我未獲授權，不得在 DynamoDB 中執行動作
<a name="security_iam_troubleshoot-no-permissions"></a>

如果 AWS 管理主控台 告訴您無權執行 動作，則必須聯絡您的管理員尋求協助。您的管理員是為您提供使用者名稱和密碼的人員。

下列範例錯誤會在 `mateojackson` 使用者嘗試使用主控台檢視一個虛構 `my-example-widget` 資源的詳細資訊，但卻無虛構 `aws:GetWidget` 許可時發生。

```
User: arn:aws:iam::123456789012:user/mateojackson is not authorized to perform: aws:GetWidget on resource: my-example-widget
```

在此情況下，Mateo 會請求管理員更新他的政策，允許他使用 `my-example-widget` 動作存取 `aws:GetWidget` 資源。

## 我未獲得執行 iam:PassRole 的授權
<a name="security_iam_troubleshoot-passrole"></a>

如果您收到錯誤，告知您無權執行 `iam:PassRole` 動作，您的政策必須更新，允許您將角色傳遞給 DynamoDB。

有些 AWS 服務 可讓您將現有角色傳遞給該服務，而不是建立新的服務角色或服務連結角色。如需執行此作業，您必須擁有將角色傳遞至該服務的許可。

當名為 `marymajor` 的 IAM 使用者嘗試使用主控台在 DynamoDB 中執行動作時，發生下列範例錯誤。但是，動作請求服務具備服務角色授予的許可。Mary 沒有將角色傳遞給服務的許可。

```
User: arn:aws:iam::123456789012:user/marymajor is not authorized to perform: iam:PassRole
```

在這種情況下，Mary 的政策必須更新，允許她執行 `iam:PassRole` 動作。

如果您需要協助，請聯絡您的 AWS 管理員。您的管理員提供您的簽署憑證。

## 我想要允許 以外的人員 AWS 帳戶 存取我的 DynamoDB 資源
<a name="security_iam_troubleshoot-cross-account-access"></a>

您可以建立一個角色，讓其他帳戶中的使用者或您組織外部的人員存取您的資源。您可以指定要允許哪些信任物件取得該角色。針對支援基於資源的政策或存取控制清單 (ACL) 的服務，您可以使用那些政策來授予人員存取您的資源的許可。

如需進一步了解，請參閱以下內容：
+ 若要了解 DynamoDB 是否支援這些功能，請參閱 [Amazon DynamoDB 如何搭配 IAM 運作](security_iam_service-with-iam.md)。
+ 若要了解如何 AWS 帳戶 在您擁有的 資源間提供存取權，請參閱《[IAM 使用者指南》中的在您擁有 AWS 帳戶 的另一個 IAM 使用者中提供存取權](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_common-scenarios_aws-accounts.html)。 **
+ 若要了解如何將資源的存取權提供給第三方 AWS 帳戶，請參閱《*IAM 使用者指南*》中的[將存取權提供給第三方 AWS 帳戶 擁有](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_common-scenarios_third-party.html)。
+ 如需了解如何透過聯合身分提供存取權，請參閱《*IAM 使用者指南*》中的[將存取權提供給在外部進行身分驗證的使用者 (聯合身分)](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_common-scenarios_federated-users.html)。
+ 如需了解使用角色和資源型政策進行跨帳戶存取之間的差異，請參閱《*IAM 使用者指南*》中的 [IAM 中的跨帳戶資源存取](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies-cross-account-resource-access.html)。

# 避免購買 DynamoDB 預留容量的 IAM 政策
<a name="iam-policy-prevent-purchase-reserved-capacity"></a>

使用 Amazon DynamoDB 預留容量，您會支付一次性預付費用，並承諾在一段時間支付最低消費額，以大幅降低成本。您可以使用 AWS 管理主控台 檢視和購買預留容量。不過，您可能不希望組織中的所有使用者都可以購買預留容量。如需預留容量的詳細資訊，請參閱 [Amazon DynamoDB 定價](https://aws.amazon.com/dynamodb/pricing)。

DynamoDB 提供下列 API 操作，以控制對預留容量管理的存取：
+ `dynamodb:DescribeReservedCapacity`：傳回目前生效的預留容量購買。
+ `dynamodb:DescribeReservedCapacityOfferings`：傳回 AWS目前所提供之預留容量方案的詳細資訊。
+ `dynamodb:PurchaseReservedCapacityOfferings`：執行實際購買的預留容量。

 AWS 管理主控台 使用這些 API 動作來顯示預留容量資訊並進行購買。您無法從應用程式呼叫這些操作，因為只有從主控台才能加以存取。不過，您可以在 IAM 許可政策中允許或拒絕存取這些操作。

下列政策允許使用者使用 檢視預留容量購買和優惠 AWS 管理主控台 ，但拒絕新購買。

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "AllowReservedCapacityDescriptions",
            "Effect": "Allow",
            "Action": [
                "dynamodb:DescribeReservedCapacity",
                "dynamodb:DescribeReservedCapacityOfferings"
            ],
            "Resource": "arn:aws:dynamodb:us-west-2:123456789012:*"
        },
        {
            "Sid": "DenyReservedCapacityPurchases",
            "Effect": "Deny",
            "Action": "dynamodb:PurchaseReservedCapacityOfferings",
            "Resource": "arn:aws:dynamodb:us-west-2:123456789012:*"
        }
    ]
}
```

------

請注意，此政策使用萬用字元 (\$1) 來允許所有、和描述許可，以拒絕為所有人購買 DynamoDB 預留容量。

# 使用 IAM 政策條件進行精細定義存取控制
<a name="specifying-conditions"></a>

您在 DynamoDB 中授予許可時，可以指定條件，以決定許可政策的生效方式。

## 概觀
<a name="FGAC_DDB.Overview"></a>

在 DynamoDB 中，您可以選擇在使用 IAM 政策授予許可時指定條件 (請參閱 [Amazon DynamoDB 的 Identity and Access Management](security-iam.md))。例如，您可以：
+ 授予許可，允許使用者唯讀存取資料表或次要索引中的特定項目和屬性。
+ 授予許可，允許使用者根據該使用者的身分唯寫存取資料表中的特定屬性。

在 DynamoDB 中，您可以使用條件金鑰在 IAM 政策中指定條件，如下節中的使用案例所述。

### 許可使用案例
<a name="FGAC_DDB.OverviewUseCase"></a>

除了控制對 DynamoDB API 動作的存取之外，您也可以控制對個別資料項目和屬性的存取。例如，您可以執行下列動作：
+ 授予資料表的許可，但根據特定主索引鍵值來限制存取該資料表中的特定項目。範例可能是遊戲的社交聯網應用程式，而所有使用者的已儲存遊戲資料都會存放在單一資料表中，但使用者無法存取他們未擁有的資料項目，如下圖所示：  
![\[授予使用者資料表層級存取權，但限制特定資料項目存取的使用案例。\]](http://docs.aws.amazon.com/zh_tw/amazondynamodb/latest/developerguide/images/info-hiding-horizontal.png)
+ 隱藏資訊，讓使用者只能看到一部分的屬性。範例可能是根據使用者位置來顯示附近機場之航班資料的應用程式。航空公司名稱、到達和起飛時間，以及航班編號全部會顯示。不過，會隱藏駕駛員名稱或乘客數目這類屬性，如下圖所示：  
![\[僅向使用者顯示部分資料，但隱藏資料中的特定屬性。\]](http://docs.aws.amazon.com/zh_tw/amazondynamodb/latest/developerguide/images/info-hiding-vertical.png)

若要實作這類精細定義存取控制，您可以撰寫 IAM 許可政策，以指定條件來存取安全憑證和相關聯許可。您接著將政策套用至使用 IAM 主控台所建立的使用者、群組或角色。您的 IAM 政策可以限制對資料表中個別項目的存取、對這些項目中屬性的存取，或同時限制兩者的存取。

您可以選擇性地使用 Web 聯合身分來控制透過 Login with Amazon、Facebook 或 Google 進行身分驗證之使用者的存取。如需詳細資訊，請參閱 [使用 Web 聯合身分](WIF.md)。

您可以使用 IAM `Condition` 元素來實作精細定義存取控制政策。將 `Condition` 元素新增至許可政策，即可根據特定商業需求來允許或拒絕存取 DynamoDB 資料表和索引中的項目和屬性。

以下影片說明如何在 DynamoDB 中透過 IAM 政策條件實作精細存取控制。

[![AWS Videos](http://img.youtube.com/vi/https://www.youtube.com/embed/LbEmo_yulb0?si=VTSlNHVocAEYwhJi/0.jpg)](http://www.youtube.com/watch?v=https://www.youtube.com/embed/LbEmo_yulb0?si=VTSlNHVocAEYwhJi)


## 了解 DynamoDB 中的精細存取控制
<a name="FGAC_DDB.UnderstandingFineGrainedAccess"></a>

DynamoDB 中的精細存取控制可讓您在多個層級建立精確的許可界限：

1. **項目層級存取控制：**限制使用者只能存取包含特定金鑰值的項目，通常符合其身分或許可範圍。

1. **屬性層級存取控制：**限制使用者可以檢視或修改哪些屬性 （資料欄），可讓您保護敏感資訊，同時允許存取相同項目中的非敏感資料。

1. **操作特定的控制項：**根據正在執行的操作類型，套用不同的許可規則。

這些控制項是透過使用 DynamoDB 特定條件金鑰的 IAM 政策實作。

## 指定條件：使用條件金鑰
<a name="FGAC_DDB.ConditionKeys"></a>

AWS 為支援 IAM 進行存取控制的所有 AWS 服務提供一組預先定義的條件金鑰 (AWS全條件金鑰）。例如，您可以使用 `aws:SourceIp` 條件金鑰先檢查申請者的 IP 位址，再允許執行動作。如需詳細資訊和 AWS全局金鑰清單，請參閱《IAM 使用者指南》中的[可用條件金鑰](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements.html#AvailableKeys)。

以下是適用於 DynamoDB 的 DynamoDB 服務特定條件金鑰。

**`dynamodb:LeadingKeys`**  
代表資料表的第一個索引鍵屬性，換言之，即分割區索引鍵。索引鍵名稱 `LeadingKeys` 是複數，即使索引鍵與單一項目動作一起使用也是一樣。此外，在條件中使用 `ForAllValues` 時，您必須使用 `LeadingKeys` 修飾詞。

**`dynamodb:Select`**  
代表請求的 `Select` 參數。`Select` 可以是下列的任何值：  
+ `ALL_ATTRIBUTES`
+ `ALL_PROJECTED_ATTRIBUTES`
+ `SPECIFIC_ATTRIBUTES`
+ `COUNT`
雖然通常與查詢和掃描操作相關聯，但此條件索引鍵適用於傳回項目屬性的所有 DynamoDB 操作，且對於控制所有 API 動作的屬性存取至關重要。在此條件金鑰上使用 StringEqualsIfExists 或類似限制條件，會對套用此條件金鑰的操作施加限制，同時忽略不適用的操作。

**`dynamodb:Attributes`**  
代表請求存取*的最上層*屬性清單。如果請求或其包含的任何巢狀屬性是在請求參數中指定，則會由請求存取頂層屬性。例如，指定 `ProjectionExpression`的`GetItem`請求`"Name, Address.City"`，`dynamodb:Attributes`清單將包含 "Name" 和 "Address"。如果在精細存取控制政策中列舉 `Attributes` 參數，請考慮同時限制 `ReturnValues`和 `Select` 參數，以確保限制存取多個 API 動作中的指定屬性`Query`，例如 `GetItem`、 和 `Scan`。  
此條件只會根據請求中指定的屬性 （例如 ProjectionExpression) 進行評估，而不是回應中的屬性。如果請求中未提供 ProjectionExpression，無論政策中的任何屬性限制，都會傳回所有屬性。如需如何正確保護屬性存取的詳細資訊，請參閱以下「強制執行屬性型限制」一節。

**`dynamodb:ReturnValues`**  
代表請求的 `ReturnValues` 參數。根據 API 動作， `ReturnValues`可以是下列任何值：  
+ `ALL_OLD`
+ `UPDATED_OLD`
+ `ALL_NEW`
+ `UPDATED_NEW`
+ `NONE`

**`dynamodb:ReturnConsumedCapacity`**  
代表請求的 `ReturnConsumedCapacity` 參數。`ReturnConsumedCapacity` 可以是下列的一個值：  
+ `TOTAL`
+ `NONE`

**`dynamodb:FirstPartitionKeyValues`**  
代表資料表的第一個索引鍵屬性，也就是第一個分割區索引鍵。索引鍵名稱 `FirstPartitionKeyValues` 是複數，即使索引鍵與單一項目動作一起使用也是一樣。此外，在條件`FirstPartitionKeyValues`中使用 `ForAllValues` 時，您必須使用 修飾詞。 `FirstPartitionKeyValues`和 `LeadingKeys`可以使用可交換。

**`dynamodb:SecondPartitionKeyValues`**  
類似於 `dynamodb:FirstPartitionKeyValues`。代表資源的第二個分割區索引鍵。索引鍵名稱 `SecondPartitionKeyValues` 是複數，即使索引鍵與單一項目動作一起使用也是一樣。

**`dynamodb:ThirdPartitionKeyValues`**  
類似於 `dynamodb:FirstPartitionKeyValues`。代表資源的第三個分割區索引鍵。索引鍵名稱 `ThirdPartitionKeyValues` 是複數，即使索引鍵與單一項目動作一起使用也是一樣。

**`dynamodb:FourthPartitionKeyValues`**  
類似於 `dynamodb:FirstPartitionKeyValues`。代表資源的第四個分割區索引鍵。索引鍵名稱 `FourthPartitionKeyValues` 是複數，即使索引鍵與單一項目動作一起使用也是一樣。

### 確保強制執行屬性型限制
<a name="FGAC_DDB.EnsuringAttributeRestrictions"></a>

使用屬性型條件來限制對特定屬性的存取時，請務必了解這些條件的評估方式：
+ **屬性條件只會對請求中指定的屬性進行評估**，而不是對回應中的屬性進行評估。
+ **對於沒有 ProjectionExpression (GetItem、Query、Scan 等） 的讀取操作**，無論政策中的屬性限制為何，都會傳回所有屬性。 GetItem 為了防止暴露這種潛在的敏感資料，必須同時實作屬性條件 (`dynamodb:Attributes`) 和需要特定屬性的條件 (`dynamodb:Select`)。
+ **對於寫入操作** (PutItem、UpdateItem、DeleteItem)，ReturnValues 參數可以傳回完整項目，即使寫入操作本身符合您的政策，也可能會公開受限屬性。若要防止此暴露，請在政策中對 ReturnValues (`dynamodb:Attributes`) 實作屬性條件 (`dynamodb:ReturnValues`) 和限制。

### 限制使用者存取
<a name="FGAC_DDB.LimitingAccess"></a>

許多 IAM 許可政策可讓使用者只存取資料表中分割區索引鍵值符合使用者識別符的項目。例如，遊戲應用程式先前限制是使用此方式所存取，因此使用者只能存取與其使用者 ID 建立關聯的遊戲資料。IAM 替換變數 `${www.amazon.com:user_id}`、`${graph.facebook.com:id}` 和 `${accounts.google.com:sub}` 包含用於 Login with Amazon、Facebook 及 Google 的使用者識別符。若要了解應用程式如何登入其中一個身分提供者，並取得這些識別符，請參閱 [使用 Web 聯合身分](WIF.md)。

**重要**  
不支援使用精細存取控制來限制全域資料表的複寫。將精細存取控制的原則條件套用至用於全域資料表複寫的 DynamoDB [服務主體或服務連結角色](globaltables-security.md)，可能導致全域資料表內的複寫中斷。

**注意**  
下節中的每個範例都會將 `Effect` 子句設定為 `Allow`，而且只指定允許的動作、資源及參數。只允許存取 IAM 政策中明確列出的項目。  
在某些情況下，有可能會重新撰寫這些政策，讓它們成為拒絕類型 (即，將 `Effect` 子句設定為 `Deny`，並反轉政策中的所有邏輯)。不過，建議您避免在 DynamoDB 中使用以拒絕為基礎的原則，因為這類原則比以允許為基礎的原則更難正確撰寫。此外，DynamoDB API 的未來變更 (或現有 API 輸入的變更) 也可能會導致無效的拒絕類型政策。

### 範例政策：使用條件進行精細定義存取控制
<a name="FGAC_DDB.Examples"></a>

本節顯示數個政策，來實作 DynamoDB 資料表和索引上的精細定義存取控制。

**注意**  
所有範例都會使用 us-west-2 區域，並且包含虛構帳戶 ID。

#### 範例 1. 具有屬性限制的基本分割區金鑰型存取控制
<a name="FGAC_DDB.Examples.BasicPartitionKeyAccess"></a>

例如，試想有一個能讓玩家選取和玩各種不同遊戲的手機遊戲應用程式。應用程式使用名為 的 DynamoDB 資料表`GameScores`來追蹤高分和其他使用者資料。資料表中的每個項目都是依使用者 ID 和使用者所玩遊戲的名稱進行唯一識別。`GameScores` 資料表的主索引鍵包含分割區索引鍵 (`UserId`) 與排序索引鍵 (`GameTitle`)。使用者只可存取與其使用者 ID 建立關聯的遊戲資料。想要玩遊戲的使用者必須屬於名為 `GameRole` 且已連接安全政策的 IAM 角色。

若要管理應用程式中的使用者許可，您可以撰寫下列這類許可政策：

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

****  

```
{
   "Version":"2012-10-17",		 	 	 
   "Statement":[
      {
         "Sid":"AllowAccessToOnlyItemsMatchingUserID",
         "Effect":"Allow",
         "Action":[
            "dynamodb:GetItem",
            "dynamodb:BatchGetItem",
            "dynamodb:Query",
            "dynamodb:PutItem",
            "dynamodb:UpdateItem",
            "dynamodb:DeleteItem",
            "dynamodb:BatchWriteItem"
         ],
         "Resource":[
            "arn:aws:dynamodb:us-west-2:123456789012:table/GameScores"
         ],
         "Condition":{
            "ForAllValues:StringEquals":{
               "dynamodb:LeadingKeys":[
                  "${www.amazon.com:user_id}"
               ],
               "dynamodb:Attributes":[
                  "UserId",
                  "GameTitle",
                  "Wins",
                  "Losses",
                  "TopScore",
                  "TopScoreDateTime"
               ]
            },
            "StringEqualsIfExists":{
               "dynamodb:Select":"SPECIFIC_ATTRIBUTES"
            }
         }
      }
   ]
}
```

------

除了授予 `GameScores` 資料表 (`Action` 元素) 上特定 DynamoDB 動作 (`Resource` 元素) 的許可之外，`Condition` 元素還會使用 DynamoDB 特有的下列條件金鑰來限制許可，如下所示：
+ `dynamodb:LeadingKeys`：此條件金鑰可讓使用者只存取分割區索引鍵值符合其使用者 ID 的項目。此 ID `${www.amazon.com:user_id}` 是替換變數。如需替換變數的詳細資訊，請參閱 [使用 Web 聯合身分](WIF.md)。
+ `dynamodb:Attributes`：此條件金鑰會限制對所指定屬性的存取，因此只有許可政策中所列的動作才能傳回這些屬性的值。此外，`StringEqualsIfExists` 子句可以確保應用程式必須一律提供要處理的特定屬性清單，以及確保應用程式無法請求所有屬性。

評估 IAM 政策時，結果一律是 true (允許存取) 或 false (拒絕存取)。如果 `Condition` 元素的任一部分是 false，則整個政策會評估為 false，並拒絕存取。

**重要**  
如果您使用 `dynamodb:Attributes`，則必須指定政策中所列資料表和任何次要索引之所有主索引鍵和索引鍵屬性的名稱。否則，DynamoDB 無法使用這些索引鍵屬性來執行所請求的動作。

IAM 政策文件只能包含下列 Unicode 字元：水平定位字元 (U\$10009)、換行字元 (U\$1000A)、歸位字元 (U\$1000D)，以及 U\$10020 到 U\$100FF 範圍內的字元。

#### 範例 2：授予許可，以限制對具有特定分割區索引鍵值之項目的存取
<a name="FGAC_DDB.Examples.PartitionKeyValue"></a>

下列許可政策授予許可，以允許 `GamesScore` 資料表上的一組 DynamoDB 動作。它會使用 `dynamodb:LeadingKeys` 條件金鑰，只限制下列項目的使用者動作：其 `UserID` 主索引鍵值符合此應用程式之 Login with Amazon 唯一使用者 ID 的項目。

**重要**  
動作清單不包含 `Scan` 的許可，因為 `Scan` 會傳回所有項目，不論前導索引鍵為何。

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

****  

```
{
   "Version":"2012-10-17",		 	 	                    
   "Statement":[
      {
         "Sid":"FullAccessToUserItems",
         "Effect":"Allow",
         "Action":[
            "dynamodb:GetItem",
            "dynamodb:BatchGetItem",
            "dynamodb:Query",
            "dynamodb:PutItem",
            "dynamodb:UpdateItem",
            "dynamodb:DeleteItem",
            "dynamodb:BatchWriteItem"
         ],
         "Resource":[
            "arn:aws:dynamodb:us-west-2:123456789012:table/GameScores"
         ],
         "Condition":{
            "ForAllValues:StringEquals":{
               "dynamodb:LeadingKeys":[
                  "${www.amazon.com:user_id}"
               ]
            }
         }
      }
   ]
}
```

------

**注意**  
使用政策變數時，您必須在政策中明確指定 2012-10-17 版。存取政策語言的預設版本 2008-10-17，不支援政策變數。

若要實作唯讀存取權，您可以移除任何可修改資料的動作。在下列政策中，條件中只會包含提供唯讀存取權的動作。

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

****  

```
{
   "Version":"2012-10-17",		 	 	                    
   "Statement":[
      {
         "Sid":"ReadOnlyAccessToUserItems",
         "Effect":"Allow",
         "Action":[
            "dynamodb:GetItem",
            "dynamodb:BatchGetItem",
            "dynamodb:Query"
         ],
         "Resource":[
            "arn:aws:dynamodb:us-west-2:123456789012:table/GameScores"
         ],
         "Condition":{
            "ForAllValues:StringEquals":{
               "dynamodb:LeadingKeys":[
                  "${www.amazon.com:user_id}"
               ]
            }
         }
      }
   ]
}
```

------

**重要**  
如果您使用 `dynamodb:Attributes`，則必須指定政策中所列資料表和任何次要索引之所有主索引鍵和索引鍵屬性的名稱。否則，DynamoDB 無法使用這些金鑰屬性來執行所請求的動作。

#### 範例 3：授予許可，限制對資料表中特定屬性的存取
<a name="FGAC_DDB.Examples.SpecificAttributes"></a>

下列許可政策透過新增 `dynamodb:Attributes` 條件金鑰，來允許只存取資料表中的兩個特定屬性。在條件式寫入或掃描篩選條件中，可以讀取、寫入或評估這些屬性。

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

****  

```
{
   "Version":"2012-10-17",		 	 	                    
   "Statement":[
      {
         "Sid":"LimitAccessToSpecificAttributes",
         "Effect":"Allow",
         "Action":[
            "dynamodb:UpdateItem",
            "dynamodb:GetItem",
            "dynamodb:Query",
            "dynamodb:BatchGetItem",
            "dynamodb:Scan"
         ],
         "Resource":[
            "arn:aws:dynamodb:us-west-2:123456789012:table/GameScores"
         ],
         "Condition":{
            "ForAllValues:StringEquals":{
               "dynamodb:Attributes":[
                  "UserId",
                  "TopScore"
               ]
            },
            "StringEqualsIfExists":{
               "dynamodb:Select":"SPECIFIC_ATTRIBUTES",
               "dynamodb:ReturnValues":[
                  "NONE",
                  "UPDATED_OLD",
                  "UPDATED_NEW"
               ]
            }
         }
      }
   ]
}
```

------

**注意**  
政策會採用允許清單方式，以允許存取一組指定的屬性。您可以撰寫同等的政策，改為拒絕存取其他屬性。我們不建議使用此拒絕清單方式。使用者可以決定這些受拒絕的屬性，請遵循最低權限政策，如 Wikipedia (網址為 http://en.wikipedia.org/wiki/Principle\$1of\$1least\$1privilege) 中所述，並使用允許清單方式來列舉所有允許值，而不是指定拒絕屬性。

此政策不允許 `PutItem`、`DeleteItem` 或 `BatchWriteItem`。這些動作一律會取代整個先前項目，以允許使用者刪除不允許它們存取之屬性的先前值。

許可政策中的 `StringEqualsIfExists` 子句確保下列狀況：
+ 如果使用者指定 `Select` 參數，則其值必須是 `SPECIFIC_ATTRIBUTES`。此需求防止 API 動作傳回任何不允許的屬性，例如來自索引投影。
+ 如果使用者指定 `ReturnValues` 參數，則其值必須是 `NONE`、`UPDATED_OLD` 或 `UPDATED_NEW`。這是必要項目，因為 `UpdateItem` 動作也會執行隱含讀取操作來檢查項目在取代前是否存在，因此，請求時可以傳回先前的屬性值。以這種方式限制 `ReturnValues` 可確定使用者只能讀取或寫入允許的屬性。
+ `StringEqualsIfExists` 子句可確保在允許動作內容中，一個請求只能使用其中一個參數：`Select` 或 `ReturnValues`。

以下是此政策的某些變化：
+ 若只要允許讀取動作，您可以從允許動作清單中移除 `UpdateItem`。因為其餘動作不接受 `ReturnValues` 動作，所以您可以從條件中移除 `ReturnValues`。您也可以將 `StringEqualsIfExists` 變更為 `StringEquals`，因為 `Select` 參數一律會有值 (除非特別指定，否則為 `ALL_ATTRIBUTES`)。
+ 若只要允許寫入動作，您可以從允許動作清單中移除所有項目，但 `UpdateItem` 除外。因為 `UpdateItem` 未使用 `Select` 參數，所以您可以從條件中移除 `Select`。您也必須將 `StringEqualsIfExists` 變更為 `StringEquals`，因為 `ReturnValues` 參數一律會有值 (除非特別指定，否則為 `NONE`)。
+ 若要允許名稱符合某模式的所有屬性，請使用 `StringLike`，而非 `StringEquals`，並使用多字元模式相符萬用字元 (\$1)。

#### 範例 4：授予許可以防止更新特定屬性
<a name="FGAC_DDB.Examples.PreventUpdates"></a>

下列許可政策限制只更新 `dynamodb:Attributes` 條件金鑰所識別之特定屬性的使用者存取。`StringNotLike` 條件防止應用程式更新使用 `dynamodb:Attributes` 條件金鑰所指定的屬性。

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

****  

```
{
   "Version":"2012-10-17",		 	 	                    
   "Statement":[
      {
         "Sid":"PreventUpdatesOnCertainAttributes",
         "Effect":"Allow",
         "Action":[
            "dynamodb:UpdateItem"
         ],
         "Resource":"arn:aws:dynamodb:us-west-2:123456789012:table/GameScores",
         "Condition":{
            "ForAllValues:StringNotLike":{
               "dynamodb:Attributes":[
                  "FreeGamesAvailable",
                  "BossLevelUnlocked"
               ]
            },
            "StringEqualsIfExists":{
               "dynamodb:Select":"SPECIFIC_ATTRIBUTES",
               "dynamodb:ReturnValues":[
                  "NONE",
                  "UPDATED_OLD",
                  "UPDATED_NEW"
               ]
            }
         }
      }
   ]
}
```

------

注意下列事項：
+ `UpdateItem` 動作 (如同其他寫入動作) 需要項目的讀取存取，以便其傳回更新前後的值。在政策中，您會限制只存取特定屬性的動作，且這些屬性僅限於允許藉由指定 `dynamodb:ReturnValues` 條件金鑰來進行更新者。條件金鑰會限制請求中的 `ReturnValues`，只指定 `NONE`、`UPDATED_OLD` 或 `UPDATED_NEW`，而且未包含 `ALL_OLD` 或 `ALL_NEW`。
+ `StringEqualsIfExists` 運算子可確保如果 `dynamodb:Select`或 `dynamodb:ReturnValues` 存在於請求中，則必須符合指定的值。這可防止操作傳回完整項目。
+ 限制屬性更新時，您也應該控制可以傳回哪些資料，以防止受保護屬性的資訊洩露。
+ `PutItem` 和 `DeleteItem` 動作會取代整個項目，因此允許應用程式修改任何屬性。因此，限制應用程式只更新特定屬性時，您不應該授予這些 API 的許可。

#### 範例 5：授予僅查詢索引中投影屬性的許可
<a name="FGAC_DDB.Examples.QueryProjectedAttributes"></a>

下列許可政策使用 `dynamodb:Attributes` 條件金鑰，允許對次要索引 (`TopScoreDateTimeIndex`) 進行查詢。政策也會限制只請求已投影到索引之特定屬性的查詢。

若需要應用程式在查詢中指定屬性清單，政策也會指定 `dynamodb:Select` 條件金鑰需要 DynamoDB `Query` 動作的 `Select` 參數是 `SPECIFIC_ATTRIBUTES`。屬性清單限制為使用 `dynamodb:Attributes` 條件金鑰所提供的特定清單。

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

****  

```
{
   "Version":"2012-10-17",		 	 	                    
   "Statement":[
      {
         "Sid":"QueryOnlyProjectedIndexAttributes",
         "Effect":"Allow",
         "Action":[
            "dynamodb:Query"
         ],
         "Resource":[
            "arn:aws:dynamodb:us-west-2:123456789012:table/GameScores/index/TopScoreDateTimeIndex"
         ],
         "Condition":{
            "ForAllValues:StringEquals":{
               "dynamodb:Attributes":[
                  "TopScoreDateTime",
                  "GameTitle",
                  "Wins",
                  "Losses",
                  "Attempts"
               ]
            },
            "StringEquals":{
               "dynamodb:Select":"SPECIFIC_ATTRIBUTES"
            }
         }
      }
   ]
}
```

------

下列許可政策類似，但查詢必須請求所有已投影到索引的屬性。

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

****  

```
{
   "Version":"2012-10-17",		 	 	                    
   "Statement":[
      {
         "Sid":"QueryAllIndexAttributes",
         "Effect":"Allow",
         "Action":[
            "dynamodb:Query"
         ],
         "Resource":[
            "arn:aws:dynamodb:us-west-2:123456789012:table/GameScores/index/TopScoreDateTimeIndex"
         ],
         "Condition":{
            "StringEquals":{
               "dynamodb:Select":"ALL_PROJECTED_ATTRIBUTES"
            }
         }
      }
   ]
}
```

------

#### 範例 6：授予許可，以限制對特定屬性和分割區索引鍵值的存取
<a name="FGAC_DDB.Examples.AttributesAndKeyValues"></a>

下列許可政策允許資料表和資料表索引 (指定於 `Action` 元素) 的特定 DynamoDB 動作 (指定於 `Resource` 元素)。此政策使用 `dynamodb:LeadingKeys`條件索引鍵來限制許可，僅限分割區索引鍵值符合使用者 Facebook ID 的項目。

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

****  

```
{
   "Version":"2012-10-17",		 	 	                    
   "Statement":[
      {
         "Sid":"LimitAccessToCertainAttributesAndKeyValues",
         "Effect":"Allow",
         "Action":[
            "dynamodb:UpdateItem",
            "dynamodb:GetItem",
            "dynamodb:Query",
            "dynamodb:BatchGetItem"
         ],
         "Resource":[
            "arn:aws:dynamodb:us-west-2:123456789012:table/GameScores",
            "arn:aws:dynamodb:us-west-2:123456789012:table/GameScores/index/TopScoreDateTimeIndex"
         ],
         "Condition":{
            "ForAllValues:StringEquals":{
               "dynamodb:LeadingKeys":[
                  "${graph.facebook.com:id}"
               ],
               "dynamodb:Attributes":[
                  "attribute-A",
                  "attribute-B"
               ]
            },
            "StringEqualsIfExists":{
               "dynamodb:Select":"SPECIFIC_ATTRIBUTES",
               "dynamodb:ReturnValues":[
                  "NONE",
                  "UPDATED_OLD",
                  "UPDATED_NEW"
               ]
            }
         }
      }
   ]
}
```

------

注意下列事項：
+ 政策 (`UpdateItem`) 允許的寫入動作只能修改屬性 A 或屬性 B。
+ 因為政策允許 `UpdateItem`，所以應用程式可以插入新項目，而隱藏屬性在新項目中會是 Null。如果這些屬性投影到 `TopScoreDateTimeIndex`，則政策將有助於防止會致使從資料表擷取的查詢。
+ 應用程式無法讀取 `dynamodb:Attributes` 中所列屬性以外的任何屬性。在此政策下，應用程式必須將讀取請求中的 `Select` 參數設定為 `SPECIFIC_ATTRIBUTES`，而且只能請求列於允許清單上的屬性。對於寫入請求，應用程式無法將 `ReturnValues` 設定為 `ALL_OLD` 或 `ALL_NEW`，而且無法根據任何其他屬性來執行條件式寫入操作。

#### 範例 7：拒絕限制存取資料表中特定屬性的許可
<a name="FGAC_DDB.Examples.DenySpecificAttributes"></a>

下列政策拒絕存取敏感屬性，並確保無法透過省略投影表達式來略過此限制。它允許對`CustomerData`資料表的一般存取，同時明確拒絕對 `SSN`和 `CreditCardNumber` 屬性的存取。

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

****  

```
{
   "Version":"2012-10-17",		 	 	 
   "Statement":[
      {
         "Effect":"Allow",
         "Action":[
            "dynamodb:GetItem",
            "dynamodb:Query",
            "dynamodb:Scan"
         ],
         "Resource":"arn:aws:dynamodb:us-west-2:123456789012:table/CustomerData"
      },
      {
         "Effect":"Deny",
         "Action":[
            "dynamodb:GetItem",
            "dynamodb:Query",
            "dynamodb:Scan"
         ],
         "Resource":"arn:aws:dynamodb:us-west-2:123456789012:table/CustomerData",
         "Condition":{
            "ForAnyValue:StringEquals":{
               "dynamodb:Attributes":[
                  "SSN",
                  "CreditCardNumber"
               ]
            }
         }
      },
      {
         "Effect":"Deny",
         "Action":[
            "dynamodb:GetItem",
            "dynamodb:Query",
            "dynamodb:Scan"
         ],
         "Resource":"arn:aws:dynamodb:us-west-2:123456789012:table/CustomerData",
         "Condition":{
            "StringNotEqualsIfExists":{
               "dynamodb:Select":"SPECIFIC_ATTRIBUTES"
            }
         }
      }
   ]
}
```

------

## 相關主題
<a name="w2aac39c21c15c11"></a>
+  [Amazon DynamoDB 的 Identity and Access Management](security-iam.md) 
+ [DynamoDB API 許可：動作、資源和條件參考](api-permissions-reference.md)

# 使用 Web 聯合身分
<a name="WIF"></a>

如果您要撰寫以大量使用者為目標的應用程式，也可以選擇使用 *web 聯合身分*進行身分驗證和授權。Web 聯合身分讓您不再需要建立個別的使用者。反之，使用者可以登入身分提供者，然後從 AWS Security Token Service () 取得臨時安全登入資料AWS STS。然後，應用程式可以使用這些登入資料來存取 AWS 服務。

Web 聯合身分支援下列身分提供者：
+ 登入 Amazon
+ Facebook
+ Google

## Web 聯合身分的其他資源
<a name="WIF.AdditionalResources"></a>

下列資源可協助您進一步了解 Web 聯合身分：
+  AWS 開發人員部落格中的[使用 適用於 .NET 的 AWS SDK的 Web 聯合身分](https://aws.amazon.com/blogs/developer/web-identity-federation-using-the-aws-sdk-for-net)文章，會介紹如何使用 Facebook 的 Web 聯合身分。它包含 C\$1 中的程式碼片段，示範如何擔任具有 Web 身分的 IAM 角色，以及如何使用臨時安全登入資料來存取 AWS 資源。
+ [AWS Mobile SDK for iOS](https://aws.amazon.com/sdkforios/) 和 [適用於 Android 的 AWS Mobile SDK](https://aws.amazon.com/sdkforandroid/) 包含範例應用程式。這些應用程式所包含的程式碼示範如何調用身分提供者，接著示範如何使用這些供應商中的資訊來取得和使用暫時安全憑證。
+ 與[行動應用程式的 Web 聯合身分](https://aws.amazon.com/articles/4617974389850313)一文討論 Web 聯合身分，並顯示如何使用 Web 聯合身分存取 AWS 資源的範例。

## Web 聯合身分的範例政策
<a name="WIF.Example"></a>

若要顯示如何使用 DynamoDB 的 Web 聯合身分，請重新造訪 [使用 IAM 政策條件進行精細定義存取控制](specifying-conditions.md) 中介紹的 *GameScores* 資料表。以下是 *GameScores* 的主索引鍵。


****  

| 資料表名稱 | 主索引鍵類型 | 分割區索引鍵名稱和類型 | 排序索引鍵名稱和類型 | 
| --- | --- | --- | --- | 
| GameScores (UserId、GameTitle ...) | 複合 | 屬性名稱：UserId 類型：字串 | 屬性名稱：GameTitle 類型：字串 | 

現在假設手機遊戲應用程式使用此資料表，而且應用程式需要支援數千或甚至數百萬使用者。就此規模而言，會變得很難管理個別應用程式使用者，且很難保證每位使用者只能存取 *GameScores* 資料表中的個別資料。好消息是，許多使用者都擁有第三方身分提供者 (例如 Facebook、Google 或 Login with Amazon) 的帳戶。因此可以合理地運用其中一個提供者來進行身分驗證任務。

若要使用 Web 聯合身分來執行這個操作，則應用程式開發人員必須向身分提供者 (例如 Login with Amazon) 註冊應用程式，並取得唯一應用程式 ID。接下來，開發人員需要建立 IAM 角色。(在此範例中，此角色的名稱為 *GameRole*。) 此角色必須已連接 IAM 政策文件、指定應用程式可存取 *GameScores* 資料表的條件。

使用者想要玩遊戲時，會從遊戲應用程式登入其 Login with Amazon 帳戶。應用程式接著會呼叫 AWS Security Token Service (AWS STS)，提供 Login with Amazon 應用程式 ID 並在 *GameRole* 中請求成員資格。 AWS STS 會傳回臨時 AWS 登入資料給應用程式，並允許其存取 *GameScores* 資料表，但需遵循 *GameRole* 政策文件。

下圖顯示這些部分如何一起使用。

![\[遊戲應用程式的工作流程。應用程式使用 Amazon ID 和 AWS STS 來取得存取 DynamoDB 資料表的臨時登入資料。\]](http://docs.aws.amazon.com/zh_tw/amazondynamodb/latest/developerguide/images/wif-overview.png)


**Web 聯合身分概觀**

1. 應用程式會呼叫第三方身分提供者，以對使用者和應用程式進行身分驗證。身分提供者會將 Web 身分字符傳回給應用程式。

1. 應用程式會呼叫 AWS STS 並將 Web 身分字符做為輸入傳遞。 會 AWS STS 授權應用程式並提供其暫時 AWS 存取憑證。應用程式可以擔任 IAM 角色 (*GameRole*)，並根據角色的安全政策存取 AWS 資源。

1. 應用程式呼叫 DynamoDB 來存取 *GameScores* 資料表。因為應用程式已擔任 *GameRole*，所以受限於與該角色建立關聯的安全政策。政策文件會防止應用程式存取不屬於使用者的資料。

再說明一次，以下是顯示在 [使用 IAM 政策條件進行精細定義存取控制](specifying-conditions.md) 中的 *GameRole* 安全性政策：

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

****  

```
{
   "Version":"2012-10-17",		 	 	 
   "Statement":[
      {
         "Sid":"AllowAccessToOnlyItemsMatchingUserID",
         "Effect":"Allow",
         "Action":[
            "dynamodb:GetItem",
            "dynamodb:BatchGetItem",
            "dynamodb:Query",
            "dynamodb:PutItem",
            "dynamodb:UpdateItem",
            "dynamodb:DeleteItem",
            "dynamodb:BatchWriteItem"
         ],
         "Resource":[
            "arn:aws:dynamodb:us-west-2:123456789012:table/GameScores"
         ],
         "Condition":{
            "ForAllValues:StringEquals":{
               "dynamodb:LeadingKeys":[
                  "${www.amazon.com:user_id}"
               ],
               "dynamodb:Attributes":[
                  "UserId",
                  "GameTitle",
                  "Wins",
                  "Losses",
                  "TopScore",
                  "TopScoreDateTime"
               ]
            },
            "StringEqualsIfExists":{
               "dynamodb:Select":"SPECIFIC_ATTRIBUTES"
            }
         }
      }
   ]
}
```

------

`Condition` 子句決定 *GameScores* 在應用程式中可看到的項目。作法是比較 Login with Amazon ID 與 `UserId` 中的 `GameScores` 分割區索引鍵值。只有使用此政策中所列的其中一個 DynamoDB 動作才能處理屬於目前使用者的項目。但無法存取資料表中的其他項目。甚至，只能存取政策中所列的特定屬性。

# 準備使用 Web 聯合身分
<a name="WIF.PreparingForUse"></a>

如果您是應用程式開發人員，並想要針對應用程式使用 Web 聯合身分，請遵循下列步驟進行：

1. **向第三方身分提供者註冊為開發人員。**下列外部連結提供向所支援之身分提供者註冊的資訊：
   + [Login with Amazon 開發人員中心](http://login.amazon.com/)
   + Facebook 網站上的[註冊](https://business.facebook.com/business/loginpage)
   + 在 Google 網站上[使用 OAuth 2.0 存取 Google API](https://developers.google.com/accounts/docs/OAuth2)

1. **向身分提供者註冊應用程式。**當您這麼做時，提供者會將您應用程式的唯一 ID 提供給您。如果您想要應用程式使用多個身分提供者，則需要向每個供應商取得應用程式 ID。

1. **建立一或多個 IAM 角色。**每個應用程式的各個身分供應商都需要一個角色。例如，您可能會建立使用者使用 Login with Amazon 登入之應用程式可擔任的角色、使用者使用 Facebook 登入之相同應用程式可擔任的次要角色，以及使用者使用 Google 登入之應用程式可擔任的第三個角色。

   在建立角色程序期間，您需要將 IAM 政策連接至此角色。您的政策文件應該定義應用程式所需的 DynamoDB 資源，以及存取這些資源的許可。

如需詳細資訊，請參閱《*IAM 使用者指南*》中的[關於 Web 聯合身分](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers_oidc.html)。

**注意**  
或者 AWS Security Token Service，您可以使用 Amazon Cognito。Amazon Cognito 是管理行動應用程式臨時憑證的偏好服務。如需詳細資訊，請參閱《*Amazon Cognito 開發人員指南*》中的[取得憑證](https://docs.aws.amazon.com/cognito/latest/developerguide/getting-credentials.html)。

## 使用 DynamoDB 主控台產生 IAM 政策
<a name="WIF.PreparingForUse.DDBConsole"></a>

DynamoDB 主控台可協助您建立 IAM 政策，以與 Web 聯合身分搭配使用。若要執行此操作，您可以選擇 DynamoDB 資料表，並指定要包含在政策中的身分提供者、動作和屬性。DynamoDB 主控台接著會產生可連接至 IAM 角色的政策。

1. 登入 AWS 管理主控台 ，並在 https：//[https://console.aws.amazon.com/dynamodb/](https://console.aws.amazon.com/dynamodb/) 開啟 DynamoDB 主控台。

1.  在導覽窗格中，選擇 **Tables** (資料表)。

1.  在資料表清單中，選擇想要用於建立 IAM 政策的資料表。

1.  選取**動作**按鈕，然後選擇**建立存取控制政策**。

1.  選擇政策的身分提供者、動作和屬性。

    完成您要的設定後，選擇**產生政策**。即會出現產生的政策。

1.  選擇**請參閱文件**，然後遵循所需的步驟將產生的政策附加到 IAM 角色。

# 撰寫應用程式使用 Web 聯合身分
<a name="WIF.RunningYourApp"></a>

若要使用 Web 聯合身分，您的應用程式必須假設您建立的 IAM 角色。完成後，應用程式會遵守您連接到角色的存取政策。

在執行時期，如果您的應用程式使用 Web 聯合身分，則必須遵循下列步驟進行：

1. **使用第三方身分提供者進行身分驗證。**您的應用程式必須使用身分提供者所提供的介面來呼叫身分提供者。對使用者進行身分驗證的確切方式取決於供應商以及執行應用程式的平台。一般而言，如果使用者尚未登入，則身分供應商會負責顯示該供應商的登入頁面。

   身分提供者對使用者進行身分驗證之後，供應商會將 Web 身分字符傳回給應用程式。此字符的格式取決於供應商，但通常是極長的字元字串。

1. **取得臨時 AWS 安全登入資料。**若要執行此操作，您的應用程式會將 `AssumeRoleWithWebIdentity` 請求傳送至 AWS Security Token Service (AWS STS)。此請求包含以下項目：
   + 先前步驟中的 Web 身分字符
   + 來自身分提供者的應用程式 ID
   + 針對此應用程式的這個身分提供者所建立之 IAM 角色的 Amazon Resource Name (ARN)

   AWS STS 會傳回一組在特定時間後過期 AWS 的安全登入資料 （預設為 3，600 秒）。

   以下是 AWS STS中 `AssumeRoleWithWebIdentity` 動作的範例請求和回應。Web 身分字符取自 Login with Amazon 身分提供者。

   ```
   GET / HTTP/1.1
   Host: sts.amazonaws.com
   Content-Type: application/json; charset=utf-8
   URL: https://sts.amazonaws.com/?ProviderId=www.amazon.com
   &DurationSeconds=900&Action=AssumeRoleWithWebIdentity
   &Version=2011-06-15&RoleSessionName=web-identity-federation
   &RoleArn=arn:aws:iam::123456789012:role/GameRole
   &WebIdentityToken=Atza|IQEBLjAsAhQluyKqyBiYZ8-kclvGTYM81e...(remaining characters omitted)
   ```

   

   ```
   <AssumeRoleWithWebIdentityResponse
     xmlns="https://sts.amazonaws.com/doc/2011-06-15/">
     <AssumeRoleWithWebIdentityResult>
       <SubjectFromWebIdentityToken>amzn1.account.AGJZDKHJKAUUSW6C44CHPEXAMPLE</SubjectFromWebIdentityToken>
       <Credentials>
         <SessionToken>AQoDYXdzEMf//////////wEa8AP6nNDwcSLnf+cHupC...(remaining characters omitted)</SessionToken>
         <SecretAccessKey>8Jhi60+EWUUbbUShTEsjTxqQtM8UKvsM6XAjdA==</SecretAccessKey>
         <Expiration>2013-10-01T22:14:35Z</Expiration>
         <AccessKeyId>06198791C436IEXAMPLE</AccessKeyId>
       </Credentials>
       <AssumedRoleUser>
         <Arn>arn:aws:sts::123456789012:assumed-role/GameRole/web-identity-federation</Arn>
         <AssumedRoleId>AROAJU4SA2VW5SZRF2YMG:web-identity-federation</AssumedRoleId>
       </AssumedRoleUser>
     </AssumeRoleWithWebIdentityResult>
     <ResponseMetadata>
       <RequestId>c265ac8e-2ae4-11e3-8775-6969323a932d</RequestId>
     </ResponseMetadata>
   </AssumeRoleWithWebIdentityResponse>
   ```

1. **存取 AWS 資源。** AWS STS 的回應包含應用程式存取 DynamoDB 資源所需的資訊：
   + `AccessKeyID`、`SecretAccessKey` 和 `SessionToken` 欄位包含只適用於此使用者和此應用程式的安全憑證。
   + `Expiration` 欄位表示這些憑證的時間限制，在此時間之後就不再有效。
   + `AssumedRoleId` 欄位包含應用程式已擔任之工作階段特定 IAM 角色的名稱。應用程式會在此工作階段期間遵守 IAM 政策文件中的存取控制。
   + `SubjectFromWebIdentityToken` 欄位包含出現在此特定身分提供者的 IAM 政策變數中的唯一 ID。以下是所支援供應商的 IAM 政策變數，及其範例值：  
****    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/amazondynamodb/latest/developerguide/WIF.RunningYourApp.html)

如需使用這些政策變數的範例 IAM 政策，請參閱 [範例政策：使用條件進行精細定義存取控制](specifying-conditions.md#FGAC_DDB.Examples)。

如需如何 AWS STS 產生臨時存取登入資料的詳細資訊，請參閱《*IAM 使用者指南*》中的[請求臨時安全登入](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_request.html)資料。

# DynamoDB API 許可：動作、資源和條件參考
<a name="api-permissions-reference"></a>

當您設定 [Amazon DynamoDB 的 Identity and Access Management](security-iam.md) 並撰寫可連接至 IAM 身分 (身分類型政策) 的許可政策時，可以參考《*IAM 使用者指南*》中的 [Amazon DynamoDB 的動作、資源和條件金鑰](https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazondynamodb.html)。此頁面列出每個 DynamoDB API 操作、您可以授予執行動作許可的對應動作，以及您可以授予許可 AWS 的資源。您在政策的 `Action` 欄位中指定動作，然後在政策的 `Resource` 欄位中指定資源值。

您可以在 DynamoDB 政策中使用 AWS整個條件索引鍵來表達條件。如需 AWS全系列金鑰的完整清單，請參閱《[IAM 使用者指南》中的 IAM JSON 政策元素參考](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements.html#AvailableKeys)。 **

除了 AWS全局條件金鑰之外，DynamoDB 也有自己的特定金鑰，您可以在條件中使用。如需詳細資訊，請參閱[使用 IAM 政策條件進行精細定義存取控制](specifying-conditions.md)。

## 相關主題
<a name="w2aac39c21c15c15b9"></a>
+  [Amazon DynamoDB 的 Identity and Access Management](security-iam.md)
+ [使用 IAM 政策條件進行精細定義存取控制](specifying-conditions.md)