

# 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 可以创建 IAM 策略，限制用户可对各个 DynamoDB 资源执行的操作。例如，可以创建仅允许用户对特定 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 操作在附加到 *DAXServiceRole* 的 IAM 策略文档中介绍。下面是示例策略文档。

------
#### [ 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 操作。`dynamodb:DescribeTable` 操作是 DAX 维护表元数据所必需的，其他操作是对表的项目执行的读取和写入操作。该表 `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_cn/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>

![\[概述了 IAM 策略，该策略允许对表进行直接访问，但阻止使用 DAX 集群进行间接访问。\]](http://docs.aws.amazon.com/zh_cn/amazondynamodb/latest/developerguide/images/dax-access-control-ddb-only.png)


可以允许直接访问 DynamoDB 表，同时阻止使用 DAX 集群间接访问。要直接访问 DynamoDB，`BobAccessPolicy`（附加到角色）决定 `BobUserRole` 的权限。

### 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>

![\[IAM 策略，可授予对 DynamoDB 表和 DAX 集群的访问权限。\]](http://docs.aws.amazon.com/zh_cn/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 将 `GetItem`、`BatchGetItem`、`Query` 和 `Scan` 请求发送到 `DAXCluster01`。

但是，`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 需要直接通过 DynamoDB 或间接通过 `DAXCluster01` 对 `Books` 表进行读写访问。下面的策略文档（已附加到 `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_cn/amazondynamodb/latest/developerguide/images/dax-access-control-dax-only.png)


如果使用 IAM 角色和策略限制对 DynamoDB 表和数据的访问，那么使用 DAX 可以推翻这些策略。在下面的策略中，Bob 可通过 DAX 访问 DynamoDB 表，但对 DynamoDB 中的同一表没有显式直接访问权限。

 下面附加到 `BobAccessPolicy` 的策略文档 (`BobUserRole`) 将授予此访问权限。

------
#### [ 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 集群的访问权限不会推翻之前确立的访问控制策略。