基于角色的访问控制(RBAC) - ElastiCache 适用于 Redis 的 Amazon
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

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

基于角色的访问控制(RBAC)

在 Redis 6.0 及以上版本中,您可以使用称为基于角色的访问控制(RBAC)的功能,而无需使用使用 Redis AUTH 命令进行身份验证中描述的 Redis AUTH 命令进行用户身份验证。此外,只能通过 RBAC 控制对无服务器缓存的访问。

与 Redis AUTH(如果对客户端令牌进行身份验证,则所有经过身份验证的客户端都对缓存具有完全的访问权限)不同的是,RBAC 使您能够通过用户组控制缓存访问权限。这些用户组旨在作为一种管理对缓存的访问权限的方式。

通过 RBAC,您可以使用访问字符串创建用户并为其分配特定权限,如下所述。您可以将用户分配给与特定角色(管理员、人力资源)匹配的用户组,然后将这些用户部署到一个或多个 ElastiCache for Redis 缓存。这样,您可以在使用相同 Redis 缓存的客户端之间建立安全边界,并阻止客户端彼此访问数据。

RBAC 旨在支持在 Redis 6 中引入 Redis ACL。在将 RBAC 与 ElastiCache for Redis 缓存一起使用时,有一些限制:

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

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

  • 您不能使用已禁止和重命名的命令。如果您指定了已禁止的命令或重命名命令,则会引发异常。如果要对重命名的命令使用访问控制列表(ACL),请指定命令的原始名称(换句话说,该命令在重命名之前的名称)。

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

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

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

  • 以下限制适用:

    资源 允许的最大值
    每个用户组的用户数 100
    用户数 1000
    用户组数 100

下面将更详细地介绍如何通过 ElastiCache for Redis 使用 RBAC。

使用访问字符串指定权限

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

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

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

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

on ~* +@all

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

  • on – 用户是活动用户。

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

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

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

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

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

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

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

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

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

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

对于 Redis 版本 6.2 及更高版本,还支持以下访问字符串语法:

  • &* – 具有对所有可用频道的访问权限。

对于 Redis 版本 7.0 及更高版本,还支持以下访问字符串语法:

  • | - 可用于屏蔽子命令(例如 “-config|set”)。

  • %R~<pattern> - 添加指定的读取密钥模式。此行为与常规密钥模式类似,但仅授予读取与给定模式匹配的密钥的权限。有关更多信息,请参阅密钥权限

  • %W~<pattern> - 添加指定的写入密钥模式。此行为与常规密钥模式类似,但仅授予写入与给定模式匹配的密钥的权限。有关更多信息,请参阅密钥权限

  • %RW~<pattern> - ~<pattern> 的别名。

  • (<rule list>) - 创建一个新的选择器作为匹配规则的依据。选择器在获得用户权限后进行评估,并根据其定义顺序进行评估。如果命令与用户权限或任何选择器匹配,则允许使用。有关更多信息,请参阅 ACL selectors(ACL 选择器)。

  • clearselectors - 删除附加到用户的所有选择器。

将 RBAC 应用于 ElastiCache for Redis 的缓存

要使用 ElastiCache for Redis RBAC,请执行以下步骤:

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

  2. 创建用户组并将用户添加到该组中。

  3. 将用户组分配给已启用了传输中加密的缓存。

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

使用控制台和 CLI 创建用户和用户组

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

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

ElastiCache 使用用户 ID 和用户名 "default" 自动配置默认用户并将其添加到所有用户组。您无法修改或删除该用户。该用户旨在与以前 Redis 版本的默认行为兼容,并具有一个访问字符串,允许它调用所有命令并访问所有密钥。

要向缓存添加适当的访问控制,请将此默认用户替换为未启用的或使用强密码的新用户。要更改默认用户,请创建一个新用户,其用户名设置为 default。然后,您可以用其替换原始默认用户。

以下过程演示了如何用另一个具有已修改访问字符串的 default 用户替换原始 default 用户。

修改控制台上的默认用户
  1. 登录 Amazon Web Services Management Console 并打开 Amazon ElastiCache 控制台(https://console.aws.amazon.com/elasticache/)。

  2. 在导航窗格中,选择用户组管理

  3. 对于用户组 ID,选择要修改的 ID。确保选择的是链接,而不是复选框。

  4. 选择 Modify(修改)。

  5. 修改窗口中,选择管理,对于默认用户,选择您想要作为默认用户的用户。

  6. 选择选择

  7. 选择 Modify(修改)。执行此操作时,原始默认用户与缓存之间的任何现有连接将被终止。

使用 Amazon CLI 修改默认用户
  1. 使用以下命令,创建用户名为 default 的新用户。

    对于 Linux、macOS 或 Unix:

    aws elasticache create-user \ --user-id "new-default-user" \ --user-name "default" \ --engine "REDIS" \ --passwords "a-str0ng-pa))word" \ --access-string "off +get ~keys*"

    对于 Windows:

    aws elasticache create-user ^ --user-id "new-default-user" ^ --user-name "default" ^ --engine "REDIS" ^ --passwords "a-str0ng-pa))word" ^ --access-string "off +get ~keys*"
  2. 创建用户组并添加先前创建的用户。

    对于 Linux、macOS 或 Unix:

    aws elasticache create-user-group \ --user-group-id "new-group-2" \ --engine "REDIS" \ --user-ids "new-default-user"

    对于 Windows:

    aws elasticache create-user-group ^ --user-group-id "new-group-2" ^ --engine "REDIS" ^ --user-ids "new-default-user"
  3. 用新 default 用户替换原始 default 用户。

    对于 Linux、macOS 或 Unix:

    aws elasticache modify-user-group \ --user-group-id test-group \ --user-ids-to-add "new-default-user" \ --user-ids-to-remove "default"

    对于 Windows:

    aws elasticache modify-user-group ^ --user-group-id test-group ^ --user-ids-to-add "new-default-user" ^ --user-ids-to-remove "default"

    调用此修改操作时,原始默认用户与缓存之间的任何现有连接将被终止。

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

特别是,在使用 ElastiCache for Redis 的 RBAC 时,请注意以下用户密码限制:

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

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

使用控制台和 CLI 管理用户

使用以下过程在控制台上管理用户。

在控制台上管理用户
  1. 登录 Amazon Web Services Management Console 并打开 Amazon ElastiCache 控制台(https://console.aws.amazon.com/elasticache/)。

  2. 在 Amazon ElastiCache 控制面板上,选择用户管理。以下选项可用:

    • 创建用户 – 创建用户时,输入用户 ID、用户名、身份验证模式和访问字符串。访问字符串设置允许用户使用的密钥和命令的权限级别。

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

    • 修改用户 – 允许您更新用户的身份验证设置或更改其访问字符串。

    • 删除用户 – 将账户从它所属的任何用户组中移除。

按以下过程使用 Amazon CLI 管理用户。

使用 CLI 修改用户
  • 使用 modify-user 命令更新用户密码或者更改用户的访问权限。

    修改用户后,将更新与该用户关联的用户组以及与该用户组关联的任何缓存。将会保持所有现有连接。示例如下。

    对于 Linux、macOS 或 Unix:

    aws elasticache modify-user \ --user-id user-id-1 \ --access-string "~objects:* ~items:* ~public:*" \ --no-password-required

    对于 Windows:

    aws elasticache modify-user ^ --user-id user-id-1 ^ --access-string "~objects:* ~items:* ~public:*" ^ --no-password-required
注意

建议您不要使用 nopass 选项。如果您按此建议操作,我们建议将用户的权限设置为只读,且仅能访问一组有限的密钥。

使用 CLI 删除用户
  • 使用 delete-user 命令删除用户。此账户将被删除并从其所属的任何用户组中移除。以下是示例。

    对于 Linux、macOS 或 Unix:

    aws elasticache delete-user \ --user-id user-id-2

    对于 Windows:

    aws elasticache delete-user ^ --user-id user-id-2

要查看用户列表,请调用 describe-users 操作。

aws elasticache describe-users

使用控制台和 CLI 管理用户组

您可以创建用户组来组织和控制用户对一个或多个缓存的访问权限,如下所示。

使用控制台通过以下过程管理用户组。

使用控制台管理用户组
  1. 登录 Amazon Web Services Management Console 并打开 Amazon ElastiCache 控制台(https://console.aws.amazon.com/elasticache/)。

  2. 在 Amazon ElastiCache 控制面板上,选择用户组管理

    以下操作可用于创建新用户组:

    • 创建 – 创建用户组时,您可以添加用户,然后将用户组分配给缓存。例如,您可以为在缓存上具有管理角色的用户创建一个 Admin 用户组。

      重要

      创建用户组时,需要包括默认用户。

    • Add Users(添加用户)– 向用户组添加用户。

    • Remove Users(移除用户)– 从用户组中移除用户。当用户从用户组中移除时,他们与缓存之间的任何现有连接都将终止。

    • Delete(删除)– 使用此操作删除用户组。请注意,将删除用户组本身,而不是属于该组的用户。

    对于现有用户组,您可执行以下操作:

    • Add User(添加用户)– 将现有用户添加到用户组。

    • Delete Users(删除用户)– 从用户组中移除现有用户。

      注意

      用户将从用户组中移除,但不会从系统中删除。

使用 CLI 通过以下过程管理用户组。

使用 CLI 创建新用户组并添加用户
  • 使用 create-user-group 命令,如下所示:

    对于 Linux、macOS 或 Unix:

    aws elasticache create-user-group \ --user-group-id "new-group-1" \ --engine "REDIS" \ --user-ids user-id-1, user-id-2

    对于 Windows:

    aws elasticache create-user-group ^ --user-group-id "new-group-1" ^ --engine "REDIS" ^ --user-ids user-id-1, user-id-2
使用 CLI 通过添加新用户或移除当前成员来修改用户组
  • 使用 modify-user-group 命令,如下所示:

    对于 Linux、macOS 或 Unix:

    aws elasticache modify-user-group --user-group-id new-group-1 \ --user-ids-to-add user-id-3 \ --user-ids-to-remove user-id-2

    对于 Windows:

    aws elasticache modify-user-group --user-group-id new-group-1 ^ --user-ids-to-add userid-3 ^ --user-ids-to-removere user-id-2
注意

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

使用 CLI 删除用户组
  • 使用 delete-user-group 命令,如下所示:将删除用户组本身,而不是属于该组的用户。

    对于 Linux、macOS 或 Unix:

    aws elasticache delete-user-group / --user-group-id

    对于 Windows:

    aws elasticache delete-user-group ^ --user-group-id

要查看用户组列表,您可用调用 describe-user-groups 操作。

aws elasticache describe-user-groups \ --user-group-id test-group

将用户组分配给无服务器缓存

创建用户组并添加用户后,实施 RBAC 的最后步骤是将用户组分配给无服务器缓存。

使用控制台将用户组分配给无服务器缓存

要使用 Amazon Web Services Management Console 将用户组添加到无服务器缓存中,请执行以下操作:

使用 Amazon CLI 将用户组分配给无服务器缓存

以下 Amazon CLI 操作使用带值 my-user-group-iduser-group-id 参数创建无服务器缓存。用已存在的子网组替换子网组 sng-test

关键参数
  • --engine – 必须为 redis

  • --user-group-id – 此值提供用户组的 ID,该用户组由对缓存具有指定访问权限的用户组成。

对于 Linux、macOS 或 Unix:

aws elasticache create-serverless-cache \ --serverless-cache-name "new-serverless-cache" \ --description "new-serverless-cache" \ --engine "redis" \ --user-group-id "new-group-1"

对于 Windows:

aws elasticache create-serverless-cache ^ --serverless-cache-name "new-serverless-cache" ^ --description "new-serverless-cache" ^ --engine "redis" ^ --user-group-id "new-group-1"

以下 Amazon CLI 操作使用带值 my-user-group-iduser-group-id 参数修改无服务器缓存。

对于 Linux、macOS 或 Unix:

aws elasticache modify-serverless-cache \ --serverless-cache-name serverless-cache-1 \ --user-group-id "new-group-2"

对于 Windows:

aws elasticache modify-serverless-cache ^ --serverless-cache-name serverless-cache-1 ^ --user-group-id "new-group-2"

请注意,对缓存所做的任何修改都将异步更新。您可通过查看事件来监控进度。有关更多信息,请参阅查看 ElastiCache 事件

将用户组分配给复制组

创建用户组并添加用户后,实施 RBAC 的最后步骤是将用户组分配给复制组。

使用控制台将用户组分配给复制组

要使用 Amazon Web Services Management Console 将用户组添加到复制中,请执行以下操作:

使用 Amazon CLI 将用户组分配给复制组

以下 Amazon CLI 操作将创建一个启用了传输中加密(TLS)且具有 user-group-ids 参数(值为 my-user-group-id)的复制组。用已存在的子网组替换子网组 sng-test

关键参数
  • --engine – 必须为 redis

  • --engine-version – 必须是 6.0 或更高版本。

  • --transit-encryption-enabled – 必需,用于身份验证和关联用户组。

  • --user-group-ids – 此值提供用户组的 ID,该用户组由对缓存具有指定访问权限的用户组成。

  • --cache-subnet-group – 必需,用于关联用户组。

对于 Linux、macOS 或 Unix:

aws elasticache create-replication-group \ --replication-group-id "new-replication-group" \ --replication-group-description "new-replication-group" \ --engine "redis" \ --cache-node-type cache.m5.large \ --transit-encryption-enabled \ --user-group-ids "new-group-1" \ --cache-subnet-group "cache-subnet-group"

对于 Windows:

aws elasticache create-replication-group ^ --replication-group-id "new-replication-group" ^ --replication-group-description "new-replication-group" ^ --engine "redis" ^ --cache-node-type cache.m5.large ^ --transit-encryption-enabled ^ --user-group-ids "new-group-1" ^ --cache-subnet-group "cache-subnet-group"

以下 Amazon CLI 操作将修改启用了传输中加密(TLS)且具有 user-group-ids 参数(值为 my-user-group-id)的复制组。

对于 Linux、macOS 或 Unix:

aws elasticache modify-replication-group \ --replication-group-id replication-group-1 \ --user-group-ids-to-remove "new-group-1" \ --user-group-ids-to-add "new-group-2"

对于 Windows:

aws elasticache modify-replication-group ^ --replication-group-id replication-group-1 ^ --user-group-ids-to-remove "new-group-1" ^ --user-group-ids-to-add "new-group-2"

记下响应中的 PendingChanges。对缓存所做的任何修改都将异步更新。您可通过查看事件来监控进度。有关更多信息,请参阅查看 ElastiCache 事件

从 Redis AUTH 迁移到 RBAC

如果您正在使用 使用 Redis AUTH 命令进行身份验证 中所述的 Redis AUTH,并希望迁移到使用 RBAC,请使用以下过程。

使用控制台通过以下过程从 Redis AUTH 迁移到 RBAC。

使用控制台从 Redis AUTH 迁移到 RBAC
  1. 登录 Amazon Web Services Management Console 并打开 ElastiCache 控制台(https://console.aws.amazon.com/elasticache/)。

  2. 从右上角的列表中,选择要修改的缓存所在的 Amazon 区域。

  3. 在导航窗格中,选择在要修改的缓存上运行的引擎。

    此时会显示选定引擎的缓存列表。

  4. 在缓存列表中,对于要修改的缓存,选择其名称。

  5. 对于 Actions(操作),选择 Modify(修改)。

    此时将显示修改窗口。

  6. 对于访问控制,选择用户组访问控制列表

  7. 对于用户组访问控制列表,选择一个用户组。

  8. 选择预览更改,然后在下一个屏幕上选择修改

使用 CLI 通过以下过程从 Redis AUTH 迁移到 RBAC。

使用 CLI 从 Redis AUTH 迁移到 RBAC
  • 使用 modify-replication-group 命令,如下所示:

    对于 Linux、macOS 或 Unix:

    aws elasticache modify-replication-group --replication-group-id test \ --auth-token-update-strategy DELETE \ --user-group-ids-to-add user-group-1

    对于 Windows:

    aws elasticache modify-replication-group --replication-group-id test ^ --auth-token-update-strategy DELETE ^ --user-group-ids-to-add user-group-1

从 RBAC 迁移到 Redis AUTH

如果您正在使用 RBAC 并希望迁移到 Redis AUTH,请参阅 从 RBAC 迁移到 Redis AUTH

注意

如果您需要在 ElastiCache 缓存上禁用访问控制,则需要通过 Amazon CLI 来实现。有关更多信息,请参阅在 ElastiCache Redis 缓存上禁用访问控制