

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

# DAX 存取控制
<a name="DAX.access-control"></a>

DynamoDB Accelerator (DAX) 可與 DynamoDB 一起使用，為您的應用程式無縫新增快取層。但是，DAX 和 DynamoDB 具有不同的存取控制機制。這兩個服務都使用 AWS Identity and Access Management (IAM) 來實作各自的安全政策，但 DAX 和 DynamoDB 的安全模型不同。

*我們強烈建議您了解兩種安全模型*，以便為使用 DAX 的應用程式實作合適的安全措施。

本節說明 DAX 提供的存取控制機制，並提供範例 IAM 政策。您可以使用此政策來為您的需求量身打造。

使用 DynamoDB，您可以建立限制使用者在個別 DynamoDB 資源上可執行動作的 IAM 政策。例如，您可以建立使用者角色，只允許使用者對特定 DynamoDB 資料表執行唯讀動作。(如需詳細資訊，請參閱「[Amazon DynamoDB 的 Identity and Access Management](security-iam.md)」。) 相較之下，DAX 安全模型著重在叢集安全，以及叢集代替您執行 DynamoDB API 動作的能力。

**警告**  
若您目前使用 IAM 角色及政策限制對 DynamoDB 資料表資料的存取，使用 DAX 可以**推翻**這些政策。例如，使用者可透過 DAX 存取 DynamoDB 資料表，但無法藉由直接存取 DynamoDB 來明確存取相同的資料表。如需詳細資訊，請參閱[Amazon DynamoDB 的 Identity and Access Management](security-iam.md)。  
DAX 不會強制對 DynamoDB 上的資料執行使用者層級隔離。相反的，使用者會在存取該叢集時，繼承 DAX 叢集 IAM 政策的許可。因此，透過 DAX 存取 DynamoDB 資料表時，唯一有效的存取控制便是 DAX 叢集 IAM 政策的許可。其他任何許可都不會獲得承認。  
若您需要隔離，我們建議您建立其他 DAX 叢集，並為每個叢集劃定 IAM 政策的範圍。例如，您可以建立多個 DAX 叢集，然後只允許每個叢集存取單一資料表。

## DAX 的 IAM 服務角色
<a name="DAX.access-control.iam-service-role"></a>

建立 DAX 叢集時，您必須為叢集與 IAM 角色建立關聯。這稱為叢集的*服務角色*。

假設您想要建立名為 *DAXCluster01* 的新 DAX 叢集。您可以建立名為 *DAXServiceRole* 的服務角色，然後將該角色與 *DAXCluster01* 建立關聯。*DAXServiceRole* 的政策可定義 *DAXCluster01* 代替與 *DAXCluster01* 互動之使用者執行的 DynamoDB 動作。

建立服務角色時，您必須指定 *DAXServiceRole* 與 DAX 服務本身的信任關係。信任關聯會判斷可取得角色及使用其許可的實體。以下為 *DAXServiceRole* 的信任關係文件範例：

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Service": "dax.amazonaws.com"
            },
            "Action": "sts:AssumeRole"
        }
    ]
}
```

------

此信任關係允許 DAX 叢集取得 *DAXServiceRole*，並代替您執行 DynamoDB API 呼叫。

允許的 DynamoDB API 動作會在 IAM 政策文件中說明。您可以將此文件連接到 *DAXServiceRole*。以下為範例政策文件。

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

****  

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

------

此政策允許 DAX 在 DynamoDB 資料表上執行必要 DynamoDB API 動作。DAX 需要 `dynamodb:DescribeTable` 動作才能維護資料表的相關中繼資料，其他則是在表內項目上執行的讀取與寫入動作。該資料表名為 `Books`，位於 us-west-2 區域，由 AWS 帳戶 ID `123456789012` 擁有。

**注意**  
DAX 支援透過機制在跨服務存取期間防止發生混淆代理人問題。如需詳細資訊，請參閱《*IAM 使用者指南*》中的[混淆代理問題](https://docs.aws.amazon.com/IAM/latest/UserGuide/confused-deputy.html)。

## 允許 DAX 叢集存取的 IAM 政策
<a name="DAX.access-control.iam-allow-dax-cluster-access"></a>

建立 DAX 叢集後，您需要授予使用者許可，讓使用者能夠存取 DAX 叢集。

例如，假設您希望將存取 *DAXCluster01* 的許可授予名為 Alice 的使用者。您可先建立 IAM 政策 (*AliceAccessPolicy*)，藉此定義收件人可以存取的 DAX 叢集和 DAX API 動作。您接著便會藉由將此政策連接到使用者 Alice，來授予存取。

下列政策文件會給予收件人 *DAXCluster01* 的完整存取。

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Action": [
                "dax:*"
            ],
            "Effect": "Allow",
            "Resource": [
                "arn:aws:dax:us-west-2:123456789012:cache/DAXCluster01"
            ]
        }
    ]
}
```

------

政策文件允許 DAX 叢集的存取，但並未授予任何 DynamoDB 許可。(DynamoDB 許可會由 DAX 服務角色授予。)

針對使用者 Alice，您首先要使用先前顯示的政策文件建立 `AliceAccessPolicy`。您接著會將政策連接到 Alice。

**注意**  
除了將政策連接到使用者之外，您也可以將政策連接到 IAM 角色。透過這種方式，所有取得該角色的使用者都會擁有您在政策中定義的許可。

使用者政策結合 DAX 服務角色，會判斷收件人可透過 DAX 存取的 DynamoDB 資源和 API 動作。

## 案例研究：存取 DynamoDB 和 DAX
<a name="DAX.access-control.case-study"></a>

下列案例可以幫助您進一步了解用於 DAX 的 IAM 政策。(本節剩餘的部分將參考這個案例)。以下圖表顯示案例的高層級概觀。

![\[使用 DAX 的 IAM 政策情境高階概觀。\]](http://docs.aws.amazon.com/zh_tw/amazondynamodb/latest/developerguide/images/dax-access-control-scenario.png)


在此案例中，有下列實體：
+ 使用者 (Bob)。
+ IAM 角色 (`BobUserRole`)。Bob 會在執行時期取得此角色。
+ IAM 政策 (`BobAccessPolicy`)。此政策會連接到 `BobUserRole`。`BobAccessPolicy` 會定義 `BobUserRole` 允許存取的 DynamoDB 和 DAX 資源。
+ DAX 叢集 (`DAXCluster01`)。
+ IAM 服務角色 (`DAXServiceRole`)。此角色允許 `DAXCluster01` 存取 DynamoDB。
+ IAM 政策 (`DAXAccessPolicy`)。此政策會連接到 `DAXServiceRole`。`DAXAccessPolicy` 會定義 `DAXCluster01` 允許存取的 DynamoDB API 和資源。
+ DynamoDB 資料表 (`Books`)。

`BobAccessPolicy` 和 `DAXAccessPolicy` 中的政策陳述式組合會決定 Bob 可以如何使用 `Books` 資料表。例如，Bob 可能可以直接 (使用 DynamoDB 端點)、間接 (使用 DAX 叢集) 或同時使用這兩種方式存取 `Books`。Bob 也可能可以從 `Books` 讀取資料、寫入資料到 `Books`，或同時具有這兩種許可。

## 存取 DynamoDB，但不可使用 DAX 存取
<a name="DAX.access-control.ddb-yes-dax-no"></a>

![\[概述可直接存取資料表但使用 DAX 叢集封鎖間接存取的 IAM 政策。\]](http://docs.aws.amazon.com/zh_tw/amazondynamodb/latest/developerguide/images/dax-access-control-ddb-only.png)


您可以允許直接存取 DynamoDB 資料表，同時防止透過 DAX 叢集間接進行存取。如需直接存取 DynamoDB，`BobUserRole` 的許可是由 `BobAccessPolicy` (連接到角色) 決定。

### DynamoDB 的唯讀存取 (僅限)
<a name="DAX.access-control.ddb-yes-dax-no.ddb-read-only"></a>

*Bob* 可以使用 `BobUserRole` 存取 DynamoDB。連接到此角色 (`BobAccessPolicy`) 的 IAM 政策會判斷 `BobUserRole` 可存取的 DynamoDB 資料表，以及 `BobUserRole` 可調用的 API。

考慮下列 `BobAccessPolicy` 的政策文件。

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

****  

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

------

當此文件連接到 `BobAccessPolicy` 時，它會允許 `BobUserRole` 存取 DynamoDB 端點，並對 `Books` 資料表執行唯讀操作。

DAX 沒有出現在此政策中，因此透過 DAX 進行存取會遭到拒絕。

### DynamoDB 的讀取/寫入存取 (僅限)
<a name="DAX.access-control.ddb-yes-dax-no.ddb-read-write"></a>

若 `BobUserRole` 需要 DynamoDB 的讀寫存取，將適用以下政策。

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

****  

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

------

同樣的，DAX 沒有出現在此政策中，因此透過 DAX 進行存取會遭到拒絕。

## 存取 DynamoDB 和 DAX
<a name="DAX.access-control.ddb-yes-dax-yes"></a>

![\[授予 DynamoDB 資料表和 DAX 叢集存取權限的 IAM 政策。\]](http://docs.aws.amazon.com/zh_tw/amazondynamodb/latest/developerguide/images/dax-access-control-ddb-and-dax.png)


若要允許存取 DAX 叢集，您必須在 IAM 政策中包含 DAX 專屬的動作。

下列 DAX 專屬動作會對應到他們在 DynamoDB API 中名稱相似的動作：
+ `dax:GetItem`
+ `dax:BatchGetItem`
+ `dax:Query`
+ `dax:Scan`
+ `dax:PutItem`
+ `dax:UpdateItem`
+ `dax:DeleteItem`
+ `dax:BatchWriteItem`
+ `dax:ConditionCheckItem`

這同樣適用於 `dax:EnclosingOperation` 條件金鑰。

### DynamoDB 的唯讀存取及 DAX 的唯讀存取
<a name="DAX.access-control.ddb-yes-dax-yes.ddb-read-only-dax-read-only"></a>

假設 Bob 需要透過 DynamoDB 及 DAX 對 `Books` 資料表進行唯讀存取。以下政策 (連接到 `BobUserRole`) 會授予這項存取。

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

****  

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

------

政策具有 DAX 存取的陳述式 (`DAXAccessStmt`) 及另一個 DynamoDBaccess 的陳述式 (`DynamoDBAccessStmt`)。這些陳述式會允許 Bob 向 `DAXCluster01` 傳送 `GetItem`、`BatchGetItem`、`Query` 及 `Scan` 請求。

但是，`DAXCluster01` 的服務角色也需要對 DynamoDB 中 `Books` 資料表的唯讀存取。以下連接到 `DAXServiceRole` 的 IAM 政策會滿足這項需求。

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

****  

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

------

### 讀寫存取 DynamoDB 及使用 DAX 進行唯讀存取
<a name="DAX.access-control.ddb-yes-dax-yes.ddb-read-write-dax-read-only"></a>

針對給定的使用者角色，您可以提供 DynamoDB 資料表的讀寫存取，同時也允許透過 DAX 進行唯讀存取。

針對 Bob，`BobUserRole` 的 IAM 政策需要允許對 `Books` 資料表進行 DynamoDB 讀取及寫入動作，同時也支援透過 `DAXCluster01` 進行唯讀動作。

以下 `BobUserRole` 的範例政策文件會授予這項存取。

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

****  

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

------

此外，`DAXServiceRole` 將需要允許 `DAXCluster01` 對 `Books` 資料表執行唯讀動作的 IAM 政策。

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

****  

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

------

### 讀寫存取 DynamoDB 及讀寫存取 DAX
<a name="DAX.access-control.ddb-yes-dax-yes.ddb-read-write-dax-read-write.title"></a>

現在假設 Bob 需要對 `Books` 資料表進行讀寫存取，無論是直接透過 DynamoDB，或間接透過 `DAXCluster01`。以下政策文件 (連接到 `BobAccessPolicy`) 會授予這項存取。

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

****  

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

------

此外，`DAXServiceRole` 將需要允許 `DAXCluster01` 對 `Books` 資料表執行讀寫動作的 IAM 政策。

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

****  

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

------

## 透過 DAX 存取 DynamoDB，但不直接存取 DynamoDB
<a name="DAX.access-control.ddb-no-dax-yes.ddb-read-write-dax-read-write"></a>

 在此案例中，Bob 可透過 DAX 存取 `Books` 資料表，但無法直接存取 DynamoDB 中的 `Books` 資料表。因此，當 Bob 取得 DAX 的存取時，他也同時會取得透過其他方式皆無法取得的 DynamoDB 資料表的存取。當您為 DAX 服務角色設定 IAM 政策時，請記得任何透過使用者存取政策取得 DAX 叢集存取的使用者，都會取得在該政策中指定資料表的存取。在此情況下，`BobAccessPolicy` 可以存取 `DAXAccessPolicy` 中指定的資料表。

![\[使用者在不直接存取 DynamoDB 的情況下，透過 DAX 叢集存取資料表的情境。\]](http://docs.aws.amazon.com/zh_tw/amazondynamodb/latest/developerguide/images/dax-access-control-dax-only.png)


若您目前使用 IAM 角色及政策限制對 DynamoDB 資料表和資料的存取，使用 DAX 可以推翻這些政策。在下列政策中，Bob 可透過 DAX 存取 DynamoDB 資料表，但無法明確的直接存取 DynamoDB 中相同的資料表。

 以下連接到 `BobUserRole` 的政策文件 (`BobAccessPolicy`) 會授予這項存取。

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

****  

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

------

在此存取政策中，沒有任何可直接存取 DynamoDB 的許可。

搭配 `BobAccessPolicy`，下列 `DAXAccessPolicy` 可讓 `BobUserRole` 存取 DynamoDB 資料表 `Books`，即使 `BobUserRole` 無法直接存取 `Books` 資料表。

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

****  

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

------

如同此範例中所示，當您為使用者存取政策及 DAX 叢集存取政策設定存取控制時，您必須完全了解端點對端點存取，以確保觀察到最低權限原則。您也必須確保給予使用者存取 DAX 叢集不會推翻先前建立的存取控制政策。