使用访问控制列表(ACL)对用户进行身份验证 - 适用于 Redis 的 Amazon MemoryDB
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

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

使用访问控制列表(ACL)对用户进行身份验证

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

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

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

ACL 旨在支持在 Redis 6 中引入 Redis ACL。当通过 MemoryDB 集群使用 ACL 时,有一定限制:

  • 不能在访问字符串中指定密码。您可以使用 CreateUserUpdateUser 调用设置密码。

  • 对于用户权利,您可以将 onoff 作为访问字符串的一部分进行传递。如果两者在访问字符串中均未指定,则将为用户分配 off 并且用户没有访问集群的权限。

  • 您不能使用已禁止命令。如果您指定了已禁止命令,则会引发异常。有关此类命令列表,请参阅受限 Redis 命令

  • 您不能将 reset 命令作为访问字符串的一部分。您可以使用 API 参数指定密码,MemoryDB 会管理这些密码。因此,您不能使用 reset,因为此命令会移除用户的所有密码。

  • Redis 6 引入了 ACL LIST 命令。此命令将返回用户列表以及应用于各用户的 ACL 规则。MemoryDB 支持 ACL LIST 命令,但不像 Redis 那样支持哈希密码。通过 MemoryDB,您可以使用 DescribeUsers 操作来获取类似的信息,包括访问字符串中包含的规则。但是,DescribeUsers 不会检索用户密码。

    MemoryDB 支持的其他只读命令包括 ACL WHOAMIACL USERSACL CAT。MemoryDB 不支持任何其他基于写入的 ACL 命令。

下面将更详细地介绍如何通过 MemoryDB 使用 ACL。

使用访问字符串指定权限

要指定对 MemoryDB 集群的权限,请使用 Amazon CLI 或 Amazon Web Services Management Console 创建一个访问字符串并将其分配给一个用户。

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

有关 ACL 规则的语法的信息,请参阅 ACL

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

on ~* &* +@all

访问字符串语法分解如下:

  • on – 用户是活动用户。

  • ~* – 具有对所有可用密钥的访问权限。

  • +@all – 具有对所有可用命令的访问权限。

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

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

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

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

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

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

有关向用户分配访问字符串的信息,请参阅 使用控制台和 CLI 创建用户和访问控制列表

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

向量搜索功能

注意

此功能位于 MemoryDB for Redis 预览版中,可能会发生变化。

对于向量搜索,所有搜索命令都属于该 @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._ALIASLIST Y Y
FT.EXPLAIN Y Y
FT.EXPLAINCLI Y Y
FT.CONFIG Y Y

为 MemoryDB 集群应用 ACL

要使用 MemoryDB ACL,请执行以下步骤:

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

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

  3. 将 ACL 分配到集群。

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

使用控制台和 CLI 创建用户和访问控制列表

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

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

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

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

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

可以创建没有用户的 ACL。空 ACL 无权访问集群,只能与启动 TLS 的集群关联。

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

特别是,在使用 MemoryDB 的 ACL 时,请注意以下用户密码限制:

  • 密码必须是 16-128 个可打印字符。

  • 不允许使用以下非字母数字字符:, "" / @

使用控制台和 CLI 管理用户

在控制台上创建用户
  1. 登录到 Amazon Web Services Management Console 并打开 MemoryDB for Redis 控制台,网址:https://console.aws.amazon.com/memorydb/

  2. 在左侧导航窗格中,选择 Users(用户)。

  3. 选择创建用户

  4. Create user(创建用户)页面上,输入 Nameame(名称)。

    集群命名约束如下:

    • 必须包含 1 – 40 个字母数字字符或连字符。

    • 必须以字母开头。

    • 不能包含两个连续连字符。

    • 不能以连字符结束。

  5. Passwords(密码)下,最多可以输入两个密码。

  6. Access string(访问字符串)下,输入访问字符串。访问字符串设置允许用户使用的密钥和命令的权限级别。

  7. 对于 Tags(标签),请选择性地应用标签来搜索和筛选用户或跟踪 Amazon 成本。

  8. 选择创建

使用 CLI 创建用户
  • 使用 create-user 命令可创建新的用户。

    对于 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
在控制台上修改用户
  1. 登录到 Amazon Web Services Management Console 并打开 MemoryDB for Redis 控制台,网址:https://console.aws.amazon.com/memorydb/

  2. 在左侧导航窗格中,选择 Users(用户)。

  3. 选择要修改的用户旁边的单选按钮,然后选择 Actions(操作)-> Modify(修改)

  4. 如果要修改密码,请选择 Modify passwords(修改密码)单选按钮。请注意,如设有两个密码,则修改其中之一时必须同时输入两个密码。

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

  6. 选择 Modify(修改)。

使用 CLI 修改用户
  1. 使用 update-user 命令修改用户。

  2. 当修改用户时,与该用户关联的访问控制列表以及与 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:*"
在控制台查看用户详细信息
  1. 登录到 Amazon Web Services Management Console 并打开 MemoryDB for Redis 控制台,网址:https://console.aws.amazon.com/memorydb/

  2. 在左侧导航窗格中,选择 Users(用户)。

  3. User name(用户名)下选择用户或使用搜索框查找用户。

  4. 用户设置下,查看用户的访问字符串、密码数量、状态和 Amazon 资源名称(ARN)。

  5. 访问控制列表(ACL)下,查看用户所属的 ACL。

  6. Tags(标签)下,查看与用户关联的任何标签。

使用 describe-users 命令查看用户的详细信息。

aws memorydb describe-users \ --user-name my-user-name
在控制台上删除用户
  1. 登录到 Amazon Web Services Management Console 并打开 MemoryDB for Redis 控制台,网址:https://console.aws.amazon.com/memorydb/

  2. 在左侧导航窗格中,选择 Users(用户)。

  3. 选择要修改的用户旁边的单选按钮,然后选择 Actions(操作)-> Delete(删除)

  4. 要进行确认,请在确认文本框中输入 delete,然后选择 Confirm(确认)。

  5. 要取消,请选择 Cancel (取消)

使用 CLI 删除用户
  • 使用 delete-user 命令删除用户。

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

    对于 Linux、macOS 或 Unix:

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

    对于 Windows:

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

使用控制台和 CLI 管理访问控制列表

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

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

使用控制台创建访问控制列表
  1. 登录到 Amazon Web Services Management Console 并打开 MemoryDB for Redis 控制台,网址:https://console.aws.amazon.com/memorydb/

  2. 在左侧导航窗格中,选择 访问控制列表(ACL)

  3. 选择 Create ACL(创建 ACL)

  4. 创建访问控制列表(ACL)页面上,输入 ACL 名称。

    集群命名约束如下:

    • 必须包含 1 – 40 个字母数字字符或连字符。

    • 必须以字母开头。

    • 不能包含两个连续连字符。

    • 不能以连字符结束。

  5. Selected users(选定用户)下,执行以下操作之一:

    1. 通过选择 Create user(创建用户)创建新用户

    2. 添加用户,方法是选择Manage(管理),再从管理用户对话框中选择用户,然后选择 Choose(选择)。

  6. 对于 Tags(标签),请选择性地应用标签来搜索和筛选 ACLs 或跟踪 Amazon 成本。

  7. 选择创建

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

使用 CLI 创建新 ACL 并添加用户
  • 使用 create-acl 命令创建 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"
使用控制台修改访问控制列表
  1. 登录到 Amazon Web Services Management Console 并打开 MemoryDB for Redis 控制台,网址:https://console.aws.amazon.com/memorydb/

  2. 在左侧导航窗格中,选择 访问控制列表(ACL)

  3. 选择要修改的 ACL,然后选择 修改

  4. 修改 页面的 所选用户 下,执行下列操作之一:

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

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

  5. 创建访问控制列表(ACL)页面上,输入 ACL 名称。

    集群命名约束如下:

    • 必须包含 1 – 40 个字母数字字符或连字符。

    • 必须以字母开头。

    • 不能包含两个连续连字符。

    • 不能以连字符结束。

  6. Selected users(选定用户)下,执行以下操作之一:

    1. 通过选择 Create user(创建用户)创建新用户

    2. 添加用户,方法是选择Manage(管理),再从管理用户对话框中选择用户,然后选择 Choose(选择)。

  7. 选择 修改 保存更改,或选择 取消 放弃更改。

使用 CLI 通过添加新用户或移除当前成员来修改 ACL
  • 使用 update-acl 命令修改 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 详细信息
  1. 登录到 Amazon Web Services Management Console 并打开 MemoryDB for Redis 控制台,网址:https://console.aws.amazon.com/memorydb/

  2. 在左侧导航窗格上,选择 访问控制列表(ACL)

  3. ACL name( ACL 名称)下选择 ACL 或使用搜索框查找 ACL。

  4. Users(用户)下,查看与 ACL 关联的用户列表。

  5. Associated clusters(关联集群)下,查看 ACL 所属的集群。

  6. Tags(标签)下,查看与 ACL 关联的任何标签。

使用 describe-acls 命令查看 ACL 详细信息。

aws memorydb describe-acls \ --acl-name test-group
使用控制台删除访问控制列表
  1. 登录到 Amazon Web Services Management Console 并打开 MemoryDB for Redis 控制台,网址:https://console.aws.amazon.com/memorydb/

  2. 在左侧导航窗格中,选择 访问控制列表(ACL)

  3. 选择要修改的 ACL,然后选择 Delete(删除)

  4. Delete(删除)页面上,在确认框中输入 delete,并选择 Delete(删除)或 Cancel(取消),以避免删除 ACL。

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

使用 CLI 删除 ACL
  • 使用 delete-acl 命令删除 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" }

将访问控制列表分配到集群

创建 ACL 并添加用户后,将 ACL 分配给集群,这是实施 ACL 的最后步骤。

使用控制台将访问控制列表分配到集群

要使用 Amazon Web Services Management Console 向集群添加 ACL,请参阅 创建 MemoryDB 集群

使用 Amazon CLI 将访问控制列表分配到集群

以下 Amazon 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"

以下 Amazon 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"