

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 使用访问控制列表对用户进行身份验证 () ACLs
<a name="clusters.acls"></a>

您可以使用访问控制列表 (ACLs) 对用户进行身份验证。

ACLs 使您能够通过对用户进行分组来控制集群访问权限。这些访问控制列表旨在作为一种集群访问组织方式。

使用 ACLs，您可以创建用户并使用访问字符串为其分配特定权限，如下一节所述。您可以将用户分配到与特定角色（管理员、人力资源）一致的访问控制列表，然后将这些访问控制列表部署到一个或多个 MemoryDB 集群。这样，您可以在使用相同 MemoryDB 集群的客户端之间建立安全边界，并阻止客户端彼此访问数据。

ACLs 旨在支持在 Redis OSS 6 中引入 [ACL](https://valkey.io/docs/topics/acl/)。 ACLs 与 MemoryDB 集群一起使用时，存在一些限制：
+ 不能在访问字符串中指定密码。您可以通过[CreateUser](https://docs.aws.amazon.com/memorydb/latest/APIReference/API_CreateUser.html)或[UpdateUser](https://docs.aws.amazon.com/memorydb/latest/APIReference/API_UpdateUser.html)呼叫来设置密码。
+ 对于用户权利，您可以将 `on` 和 `off` 作为访问字符串的一部分进行传递。如果两者在访问字符串中都未指定，则将为用户分配 `off` 并且用户没有访问集群的权限。
+ 您不能使用已禁止命令。如果您指定了已禁止命令，则会引发异常。有关此类命令列表，请参阅 [受限命令](restrictedcommands.md)。
+ 您不能将 `reset` 命令作为访问字符串的一部分。您可以使用 API 参数指定密码，MemoryDB 会管理这些密码。因此，您不能使用 `reset`，因为此命令会移除用户的所有密码。
+ Redis OSS 6 引入了 [ACL LIST](https://valkey.io/commands/acl-list) 命令。此命令将返回用户列表以及应用于各用户的 ACL 规则。MemoryDB 支持 `ACL LIST` 命令，但不像 Redis OSS 那样支持密码哈希。使用 MemoryDB，您可以使用该[DescribeUsers](https://docs.aws.amazon.com/memorydb/latest/APIReference/API_DescribeUsers.html)操作来获取类似的信息，包括访问字符串中包含的规则。但是，[DescribeUsers](https://docs.aws.amazon.com/memorydb/latest/APIReference/API_DescribeUsers.html)无法检索用户密码。

  MemoryDB 支持的其他只读命令包括 [ACL WHOAMI](https://valkey.io/commands/acl-whoami)、[ACL USERS](https://valkey.io/commands/acl-users) 和 [ACL CAT](https://valkey.io/commands/acl-cat)。MemoryDB 不支持任何其他基于写入的 ACL 命令。

下文将详细介绍如何 ACLs 与 MemoryDB 配合使用。

**Topics**
+ [使用访问字符串指定权限](#access-string)
+ [向量搜索功能](#access-vss)
+ [ACLs 向集群申请 MemoryDB](#rbac-using)

## 使用访问字符串指定权限
<a name="access-string"></a>

要指定对 MemoryDB 集群的权限，您可以使用或创建访问字符串并将其分配给用户。 AWS CLI AWS 管理控制台

根据定义，访问字符串是指应用于用户的、以空格分隔的规则列表。它们定义了用户可以执行的命令以及用户可以对其进行操作的密钥。要执行命令，用户必须有权访问正在执行的命令以及命令访问的所有密钥。规则从左到右累积应用，如果提供的字符串中存在冗余，则可以使用更简单的字符串代替提供的字符串。

有关 ACL 规则的语法的信息，请参阅 [ACL](https://valkey.io/topics/acl)。

在以下示例中，访问字符串表示具有所有可用密钥和命令访问权限的活动用户。

 `on ~* &* +@all`

访问字符串语法分解如下：
+ `on` – 用户是活动用户。
+ `~*` – 具有对所有可用密钥的访问权限。
+ `&*` – 具有对所有发布/订阅频道的访问权限。
+ `+@all` – 具有对所有可用命令的访问权限。

上述设置的限制性最小。您可以修改这些设置以使其更加安全。

在以下示例中，访问字符串表示一个用户，其访问权限限于对以“app::”键空间开头的键进行读取访问

`on ~app::* -@all +@read`

您可以通过列出用户有权访问的命令来进一步优化这些权限：

`+command1` – 用户对命令的访问被限制为 *`command1`*。

 `+@category` – 用户的访问被限制为某个类别的命令。

有关向用户分配访问字符串的信息，请参阅 [使用控制台和 CLI 创建用户和访问控制列表](#users-management)。

如果要将现有工作负载迁移到 MemoryDB，则可以通过调用 `ACL LIST`（不包括用户和任何哈希密码）来检索访问字符串。

## 向量搜索功能
<a name="access-vss"></a>

对于[向量搜索](vector-search.md)，所有搜索命令都属于该 `@search` 类别，而现有类别 `@read`、`@write`、`@fast` 和 `@slow` 则会更新为包括搜索命令。如果用户无权访问某个类别，那么该用户也无权访问该类别中的任何命令。例如，如果用户无权访问 `@search`，那么该用户也无法执行任何与搜索相关的命令。

下表指示搜索命令到相应类别的映射。


| VSS 命令 | @read | @write | @fast | @slow | 
| --- | --- | --- | --- | --- | 
| FT.CREATE |  | Y | Y |  | 
| FT.DROPINDEX |  | Y | Y |  | 
| FT.LIST | Y |  |  | Y | 
| FT.INFO | Y |  | Y |  | 
| FT.SEARCH | Y |  |  | Y | 
| FT.AGGREGATE | Y |  |  | Y | 
| FT.PROFILE | Y |  |  | Y | 
| FT.ALIASADD |  | Y | Y |  | 
| FT.ALIASDEL |  | Y | Y |  | 
| FT.ALIASUPDATE |  | Y | Y |  | 
| FT.\$1ALIASLIST | Y |  |  | Y | 
| FT.EXPLAIN | Y |  | Y |  | 
| FT.EXPLAINCLI | Y |  | Y |  | 
| FT.CONFIG | Y |  | Y |  | 

## ACLs 向集群申请 MemoryDB
<a name="rbac-using"></a>

要使用 MemoryDB ACLs，您需要执行以下步骤：

1. 创建一个或多个用户。

1. 创建 ACL 并将用户添加到此列表中。

1. 将 ACL 分配到集群。

下方详细地说明了这些步骤。

**Topics**
+ [使用控制台和 CLI 创建用户和访问控制列表](#users-management)
+ [使用控制台和 CLI 管理访问控制列表](#user-groups)
+ [将访问控制列表分配到集群](#users-groups-to-clusterss)

### 使用控制台和 CLI 创建用户和访问控制列表
<a name="users-management"></a>

用户的用户信息是 ACLs 用户名，也可以是密码和访问字符串（可选）。访问字符串提供对密钥和命令的权限级别。用户名对于用户是唯一的，是传递给引擎的内容。

确保您提供的 ACL 符合用户组的预期目的。例如，如果您创建一个名为 `Administrators` 的 ACL，则添加到该组的任何用户都应将其访问字符串设置为对密钥和命令具有完全访问权限。对于 `e-commerce` ACL 中的用户，您可以将其访问字符串设置为只读访问。

MemoryDB 为每个账户和用户名 `"default"` 自动配置一个默认用户。它未与任何集群关联，除非明确添加到 ACL 中。您无法修改或删除该用户。该用户旨在与以前 Redis OSS 版本的默认行为兼容，并具有一个访问字符串，允许它调用所有命令并访问所有密钥。

将为每个包含默认用户的账户创建一个不可变“开放访问”ACL。这是默认用户可加入的唯一的 ACL。当您创建一个集群时，必须选择一个与该集群关联的 ACL。虽然您可以选择对默认用户应用“开放访问”ACL，但我们强烈建议为权限仅限于其业务需求的用户创建 ACL。

未启用 TLS 的集群必须使用“开放访问”ACL 提供开放身份验证。

ACLs 可以在没有用户的情况下创建。空 ACL 无权访问集群，只能与启动 TLS 的集群关联。

创建用户时，最多可以设置两个密码。修改密码时，将保持与集群之间的所有现有连接。

特别是，在用于 MemoryDB 时，请注意以下用户密码限制： ACLs 
+ 密码必须是 16-128 个可打印字符。
+ 不允许使用以下非字母数字字符：`,` `""` `/` `@`。

#### 使用控制台和 CLI 管理用户
<a name="users-console"></a>

##### 创建用户（控制台）
<a name="users.Createclusters.viewdetails"></a>

**在控制台上创建用户**

1. 登录 AWS 管理控制台 并打开 MemoryDB 控制台，网址为。[https://console.aws.amazon.com/memorydb/](https://console.aws.amazon.com/memorydb/)

1. 在左侧导航窗格中，选择**用户**。

1. 选择**创建用户**

1. 在**创建用户**页面上，输入**名称**。

   集群命名约束如下：
   + 必须包含 1 – 40 个字母数字字符或连字符。
   + 必须以字母开头。
   + 不能包含两个连续连字符。
   + 不能以连字符结束。

1. 在**密码**下，最多可以输入两个密码。

1. 在**访问字符串**下，输入访问字符串。访问字符串设置允许用户使用的密钥和命令的权限级别。

1. 对于**标签**，您可以选择应用标签来搜索和筛选用户或跟踪您的 AWS 费用。

1. 选择**创建**。

##### 使用创建用户 AWS CLI
<a name="users.Create.cli"></a>

**使用 CLI 创建用户**
+ 使用 [create-user](https://docs.aws.amazon.com/cli/latest/reference/memorydb/create-user.html) 命令可创建新的用户。

  对于 Linux、macOS 或 Unix：

  ```
  aws memorydb create-user \
    --user-name user-name-1 \
    --access-string "~objects:* ~items:* ~public:*" \
    --authentication-mode \
          Passwords="abc",Type=password
  ```

  对于 Windows：

  ```
  aws memorydb create-user ^
    --user-name user-name-1 ^
    --access-string "~objects:* ~items:* ~public:*" ^
    --authentication-mode \
          Passwords="abc",Type=password
  ```

##### 修改用户（控制台）
<a name="users.modifyclusters.viewdetails"></a>

**在控制台上修改用户**

1. 登录 AWS 管理控制台 并打开 MemoryDB 控制台，网址为。[https://console.aws.amazon.com/memorydb/](https://console.aws.amazon.com/memorydb/)

1. 在左侧导航窗格中，选择**用户**。

1. 选择要修改的用户旁边的单选按钮，然后选择**操作** -> **修改**

1. 如果要修改密码，请选择**修改密码**单选按钮。请注意，如设有两个密码，则修改其中之一时必须同时输入两个密码。

1. 如果要更新访问字符串，则请输入新的访问字符串。

1. 选择 **Modify**(修改)。

##### 使用修改用户 AWS CLI
<a name="users.modify.cli"></a>

**使用 CLI 修改用户**

1. 使用 [update-user](https://docs.aws.amazon.com/cli/latest/reference/memorydb/update-user.html) 命令修改用户。

1. 当修改用户时，与该用户关联的访问控制列表以及与 ACL 关联的任何集群将进行更新。将会保持所有现有连接。示例如下。

   对于 Linux、macOS 或 Unix：

   ```
   aws memorydb update-user \
     --user-name user-name-1 \
     --access-string "~objects:* ~items:* ~public:*"
   ```

   对于 Windows：

   ```
   aws memorydb update-user ^
     --user-name user-name-1 ^
     --access-string "~objects:* ~items:* ~public:*"
   ```

##### 查看用户详细信息（控制台）
<a name="users.viewclusters.viewdetails"></a>

**在控制台查看用户详细信息**

1. 登录 AWS 管理控制台 并打开 MemoryDB 控制台，网址为。[https://console.aws.amazon.com/memorydb/](https://console.aws.amazon.com/memorydb/)

1. 在左侧导航窗格中，选择**用户**。

1. 在**用户名**下选择用户或使用搜索框查找用户。

1. 在**用户设置**下，查看用户的访问字符串、密码数量、状态和 Amazon 资源名称（ARN）。

1. 在**访问控制列表（ACL）**下，查看用户所属的 ACL。

1. 在**标签**下，查看与用户关联的任何标签。

##### 使用查看用户详细信息 AWS CLI
<a name="user.view.cli"></a>

使用 [describe-users](https://docs.aws.amazon.com/cli/latest/reference/memorydb/describe-users.html) 命令查看用户的详细信息。

```
aws memorydb describe-users \
  --user-name my-user-name
```

##### 删除 用户（控制台）
<a name="users.deleteclusters"></a>

**在控制台上删除用户**

1. 登录 AWS 管理控制台 并打开 MemoryDB 控制台，网址为。[https://console.aws.amazon.com/memorydb/](https://console.aws.amazon.com/memorydb/)

1. 在左侧导航窗格中，选择**用户**。

1. 选择要修改的用户旁边的单选按钮，然后选择**操作** -> **删除**

1. 要进行确认，请在确认文本框中输入 `delete`，然后选择**确认**。

1. 要取消，请选择**取消**。

##### 使用删除用户 AWS CLI
<a name="users.delete.cli"></a>

**使用 CLI 删除用户**
+ 使用 [delete-user](https://docs.aws.amazon.com/cli/latest/reference/memorydb/delete-user.html) 命令删除用户。

  此账户将被删除并从其所属的任何访问控制列表中移除。示例如下：

  对于 Linux、macOS 或 Unix：

  ```
  aws memorydb delete-user \
    --user-name user-name-2
  ```

  对于 Windows：

  ```
  aws memorydb delete-user ^
    --user-name user-name-2
  ```

### 使用控制台和 CLI 管理访问控制列表
<a name="user-groups"></a>

您可以创建访问控制列表来组织和控制用户对一个或多个集群的访问，如下所示。

使用以下步骤通过控制台管理访问控制列表。

#### 创建访问控制列表（ACL）（控制台）
<a name="acl.createclusters.viewdetails"></a>

**使用控制台创建访问控制列表**

1. 登录 AWS 管理控制台 并打开 MemoryDB 控制台，网址为。[https://console.aws.amazon.com/memorydb/](https://console.aws.amazon.com/memorydb/)

1. 在左侧导航窗格中，选择**访问控制列表（ACL）**。

1. 选择**创建 ACL**。

1. 在**创建访问控制列表（ACL）**页面上，输入 ACL 名称。

   集群命名约束如下：
   + 必须包含 1 – 40 个字母数字字符或连字符。
   + 必须以字母开头。
   + 不能包含两个连续连字符。
   + 不能以连字符结束。

1. 在**选定用户**下，执行以下操作之一：

   1. 通过选择**创建用户**创建新用户

   1. 添加用户，方法是选择**管理**，再从**管理用户**对话框中选择用户，然后选择**选择**。

1. 对于**标签**，您可以选择应用标签来搜索和筛选您的费用 ACLs 或跟踪您的 AWS 费用。

1. 选择**创建**。

#### 使用创建访问控制列表 (ACL) AWS CLI
<a name="acl.create.cli"></a>

通过 CLI 使用以下过程创建访问控制列表。

**使用 CLI 创建新 ACL 并添加用户**
+ 使用 [create-acl](https://docs.aws.amazon.com/cli/latest/reference/memorydb/create-acl.html) 命令创建 ACL。

  对于 Linux、macOS 或 Unix：

  ```
  aws memorydb create-acl \
    --acl-name "new-acl-1" \
    --user-names "user-name-1" "user-name-2"
  ```

  对于 Windows：

  ```
  aws memorydb create-acl ^
    --acl-name "new-acl-1" ^
    --user-names "user-name-1" "user-name-2"
  ```

#### 修改访问控制列表（ACL）（控制台）
<a name="acl.modifyclusters.viewdetails"></a>

**使用控制台修改访问控制列表**

1. 登录 AWS 管理控制台 并打开 MemoryDB 控制台，网址为。[https://console.aws.amazon.com/memorydb/](https://console.aws.amazon.com/memorydb/)

1. 在左侧导航窗格中，选择**访问控制列表（ACL）**。

1. 选择要修改的 ACL，然后选择 **修改**

1. 在**修改**页面的**所选用户**下，执行下列操作之一：

   1. 通过选择**创建用户**添加到 ACL。

   1. 添加或移除用户，方法是选择**管理**，再从**管理用户**对话框中选择或取消选中用户，然后选择**选择**。

1. 在**创建访问控制列表（ACL）**页面上，输入 ACL 名称。

   集群命名约束如下：
   + 必须包含 1 – 40 个字母数字字符或连字符。
   + 必须以字母开头。
   + 不能包含两个连续连字符。
   + 不能以连字符结束。

1. 在**选定用户**下，执行以下操作之一：

   1. 通过选择**创建用户**创建新用户

   1. 添加用户，方法是选择**管理**，再从**管理用户**对话框中选择用户，然后选择**选择**。

1. 选择**修改**保存更改，或选择**取消**放弃更改。

#### 使用修改访问控制列表 (ACL) AWS CLI
<a name="acl.modify.acl"></a>

**使用 CLI 通过添加新用户或移除当前成员来修改 ACL**
+ 使用 [update-acl](https://docs.aws.amazon.com/cli/latest/reference/memorydb/update-acl.html) 命令修改 ACL。

  对于 Linux、macOS 或 Unix：

  ```
  aws memorydb update-acl --acl-name new-acl-1 \
  --user-names-to-add user-name-3 \
  --user-names-to-remove user-name-2
  ```

  对于 Windows：

  ```
  aws memorydb update-acl --acl-name new-acl-1 ^
  --user-names-to-add user-name-3 ^
  --user-names-to-remove user-name-2
  ```

**注意**  
此命令将结束属于从 ACL 中移除的用户的任何打开的连接。

#### 查看访问控制列表（ACL）详细信息（控制台）
<a name="acls.viewclusters.viewdetails"></a>

**在控制台上查看 ACL 详细信息**

1. 登录 AWS 管理控制台 并打开 MemoryDB 控制台，网址为。[https://console.aws.amazon.com/memorydb/](https://console.aws.amazon.com/memorydb/)

1. 在左侧导航窗格上，选择**访问控制列表（ACL）**。

1. 在 **ACL 名称**下选择 ACL 或使用搜索框查找 ACL。

1. 在**用户**下，查看与 ACL 关联的用户列表。

1. 在**关联集群**下，查看 ACL 所属的集群。

1. 在**标签**下，查看与 ACL 关联的任何标签。

#### 使用查看访问控制列表 (ACL) AWS CLI
<a name="acl.view.cli"></a>

使用 [describe-acls](https://docs.aws.amazon.com/cli/latest/reference/memorydb/describe-acls.html) 命令查看 ACL 详细信息。

```
aws memorydb describe-acls \
  --acl-name test-group
```

#### 删除访问控制列表（ACL）（控制台）
<a name="acl.deleteacl"></a>

**使用控制台删除访问控制列表**

1. 登录 AWS 管理控制台 并打开 MemoryDB 控制台，网址为。[https://console.aws.amazon.com/memorydb/](https://console.aws.amazon.com/memorydb/)

1. 在左侧导航窗格中，选择**访问控制列表（ACL）**。

1. 选择要修改的 ACL，然后选择**删除**

1. 在**删除**页面上，在确认框中输入 `delete`，并选择**删除**或**取消**，以避免删除 ACL。

将删除 ACL 本身，而不是属于该组的用户。

#### 使用删除访问控制列表 (ACL) AWS CLI
<a name="acl.delete.cli"></a>

**使用 CLI 删除 ACL**
+ 使用 [delete-acl](https://docs.aws.amazon.com/cli/latest/reference/memorydb/delete-acl.html) 命令删除 ACL。

  对于 Linux、macOS 或 Unix：

  ```
  aws memorydb delete-acl /
     --acl-name
  ```

  对于 Windows：

  ```
  aws memorydb delete-acl ^
     --acl-name
  ```

  上述示例将返回以下响应。

  ```
  aws memorydb delete-acl --acl-name "new-acl-1"
  {
      "ACLName": "new-acl-1",
      "Status": "deleting",
      "EngineVersion": "6.2",
      "UserNames": [
          "user-name-1", 
          "user-name-3"
      ],
      "clusters": [],
      "ARN":"arn:aws:memorydb:us-east-1:493071037918:acl/new-acl-1"
  }
  ```

### 将访问控制列表分配到集群
<a name="users-groups-to-clusterss"></a>

创建 ACL 并添加用户后，实施的最后一步 ACLs 是将 ACL 分配给集群。

#### 使用控制台将访问控制列表分配到集群
<a name="users-groups-to-clusters-con"></a>

要使用向集群添加 ACL AWS 管理控制台，请参阅[创建 MemoryDB 集群](getting-started.md#clusters.create)。

#### 为群集分配访问控制列表使用 AWS CLI
<a name="users-groups-to-clusters-CLI"></a>

 以下 AWS CLI 操作创建一个启用传输中加密 (TLS) 且**acl-name**参数值为的集群`my-acl-name`。用已存在的子网组替换子网组 `subnet-group`。

**关键参数**
+ **--engine-version** – 必须是 6.2。
+ **--tls-enabled** – 用于身份验证和关联 ACL。
+ **--acl-name** – 此值提供由具有集群指定访问权限的用户组成的访问控制列表。

对于 Linux、macOS 或 Unix：

```
aws memorydb create-cluster \
    --cluster-name "new-cluster" \
    --description "new-cluster" \
    --engine-version "6.2" \
    --node-type db.r6g.large \
    --tls-enabled \
    --acl-name "new-acl-1" \
    --subnet-group-name "subnet-group"
```

对于 Windows：

```
aws memorydb create-cluster ^
    --cluster-name "new-cluster" ^
    --cluster-description "new-cluster" ^
    --engine-version "6.2" ^
    --node-type db.r6g.large ^
    --tls-enabled ^
    --acl-name "new-acl-1" ^
    --subnet-group-name "subnet-group"
```

以下 AWS CLI 操作修改了启用传输中加密 (TLS) 且**acl-name**参数值`new-acl-2`为的集群。

对于 Linux、macOS 或 Unix：

```
aws memorydb update-cluster \
    --cluster-name cluster-1 \
    --acl-name "new-acl-2"
```

对于 Windows：

```
aws memorydb update-cluster ^
    --cluster-name cluster-1 ^
    --acl-name "new-acl-2"
```