使用基于角色的访问控制 (RBAC) 对用户进行身份验证 - 用于 Redis 的 Amazon ElastiCache
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

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

使用基于角色的访问控制 (RBAC) 对用户进行身份验证

使用 Redis AUTH 命令对用户进行身份验证 6.x 中,您可以使用一项名为“基于角色的访问控制 (RBAC)”的功能,而不是使用 Redis AUTH 命令验证用户身份(如用于 Redis 的 Amazon ElastiCache中所述)。

与 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 RedisACLWHOAMIACL USERSACL CAT 不支持任何其他基于写入的 ACL 命令。ElastiCache for Redis

RBAC 和 ElastiCache for Redis 的使用在下面进行了详细介绍。

使用 访问字符串指定权限

要为 ElastiCache for Redis 复制组指定权限,您需要使用 AWS CLI 或 AWS 管理控制台 创建访问字符串并将其分配给用户。

访问字符串定义为对用户应用以空格分隔的规则的列表。它们定义用户可执行的命令以及用户可操作的键。为了执行命令,用户必须有权访问正在执行的命令以及该命令访问的所有密钥。规则将按从左到右的形式进行应用,并且,如果提供的字符串中存在冗余,可以使用更简单的字符串,而不是提供的字符串。

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

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

on ~* +@all

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

  • on – 用户是活动用户。

  • ~* – 向所有可用密钥授予访问权限。

  • +@all – 向所有可用命令授予访问权限。

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

在以下示例中,访问字符串表示具有对以“app::”开头的密钥的读取访问权限限制的用户 键空间

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

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

+command1 – 用户对命令的访问权限限制为 命令 1.

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

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

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

将 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. 登录 AWS 管理控制台 并通过以下网址打开 Amazon ElastiCache 控制台:https://console.amazonaws.cn/elasticache/

  2. 从导航窗格中,选择 Redis

  3. 选择 User Group Management (用户组管理)

  4. 对于 User Group ID (用户组 ID),选择要修改的 ID。确保您选择了链接,而不是复选框。

  5. 选择 Swap Default (交换默认值)

  6. Swap Default (交换默认值) 窗口中,对于 Default User (默认用户),选择所需的用户作为默认用户。

  7. 选择 Swap (交换)。在执行此操作时,将终止与原始默认用户已连接到的复制组的任何现有连接。

使用 AWS CLI 创建新的默认用户

  1. 使用以下命令创建具有用户名 default 的新用户。

    对于 Linux, OS X, or 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, OS X, or 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, OS X, or 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"

    调用此修改操作时,将终止原始默认用户已与复制组之间的所有现有连接。

创建用户时,您可以设置最多两个密码。在修改密码时,将保留与复制组的任何现有连接。

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

  • 密码必须为 16–128 个可打印字符。

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

使用 控制台和 CLI 管理用户

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

在 控制台上管理用户

  1. 登录 AWS 管理控制台 并通过以下网址打开 Amazon ElastiCache 控制台:https://console.amazonaws.cn/elasticache/

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

    • 创建用户 – 创建用户时,您需要输入用户 ID、用户名、密码和访问字符串。访问字符串设置允许用户使用的密钥和命令的权限级别。

      创建用户时,您可以设置最多两个密码。在修改密码时,将保留与复制组的任何现有连接。

    • Modify User (修改用户) – 允许您更新用户的密码或更改其访问字符串。

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

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

使用 CLI 修改用户

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

    修改用户时,将更新与该用户关联的用户组,以及与用户组关联的任何复制组。将维护所有现有连接。示例如下。

    对于 Linux, OS X, or 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

    上述示例返回以下响应。

    { "UserId": "user-id-1", "UserName": "user-name-1", "Status": "modifying", "Engine": "redis", "AccessString": "off ~objects:* ~items:* ~public:* -@all", "UserGroupIds": [ "new-group-1" ], "Authentication": { "Type": "no-password" }, "ARN": "arn:aws:elasticache:us-east-1:493071037918:user:user-id-1" }
注意

我们建议不要使用 nopass 选项。如果您这样做,我们建议您将用户的权限设置为只读,并且有权访问一组有限的密钥。

使用 CLI 删除用户

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

    对于 Linux, OS X, or Unix:

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

    对于 Windows:

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

    上述示例返回以下响应。

    { "UserId": "user-id-2", "UserName": "user-name-2", "Status": "deleting", "Engine": "redis", "AccessString": "on ~keys* -@all +get", "UserGroupIds": [ "new-group-1" ], "Authentication": { "Type": "password", "PasswordCount": 1 }, "ARN": "arn:aws:elasticache:us-east-1:493071037918:user:user-id-2" }

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

aws elasticache describe-users { "Users": [ { "UserId": "user-id-1", "UserName": "user-id-1", "Status": "active", "Engine": "redis", "AccessString": "+get ~keys*", "UserGroupIds": [], "Authentication": { "Type": "password", "PasswordCount": 1 } } ] }

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

您可以创建用户组来组织并控制用户对一个或多个复制组的访问,如下所示。

执行以下过程,使用 控制台管理用户组。

使用控制台管理用户组

  1. 登录 AWS 管理控制台 并通过以下网址打开 Amazon ElastiCache 控制台:https://console.amazonaws.cn/elasticache/

  2. 在 Amazon ElastiCache 控制面板上,选择 User Management (用户管理)

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

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

      重要

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

    • 添加用户 – 将用户添加到用户组。

    • 删除用户 – 从用户组中删除用户。从用户组中删除用户后,用户与复制组之间的所有现有连接都将终止。

    • 删除 – 使用此命令可删除用户组。请注意,将删除用户组本身,而不是属于该组的用户。

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

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

    • 删除用户 从用户组中删除现有用户。–

      注意

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

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

使用 CLI 创建新用户组并添加用户

  • 使用 create-user-group 命令,如下所示。

    对于 Linux, OS X, or 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

    上述示例返回以下响应。

    { "UserGroupId": "new-group-1", "Status": "creating", "Engine": "redis", "UserIds": [ "user-id-1", "user-id-2" ], "ReplicationGroups": [], "ARN": "arn:aws:elasticache:us-east-1:493071037918:usergroup:new-group-1" }

使用 CLI 通过添加新用户或删除当前成员来修改用户组

  • 使用 modify-user-group 命令,如下所示。

    对于 Linux, OS X, or Unix:

    aws elasticache modify-user-group --user-group-id new-group-1 \ --user-ids-to-add user-id-3 \ --user-ids-to-remove user-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

    上述示例返回以下响应。

    { "UserGroupId": "new-group-1", "Status": "modifying", "Engine": "redis", "UserIds": [ "user-id-1", "user-id-2" ], "PendingChanges": { "UserIdsToRemove": [ "user-id-2" ], "UserIdsToAdd": [ "user-id-3" ] }, "ReplicationGroups": [], "ARN": "arn:aws:elasticache:us-east-1:493071037918:usergroup:new-group-1" }
注意

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

使用 CLI 删除用户组

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

    对于 Linux, OS X, or Unix:

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

    对于 Windows:

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

    上述示例返回以下响应。

    aws elasticache delete-user-group --user-group-id "new-group-1" { "UserGroupId": "new-group-1", "Status": "deleting", "Engine": "redis", "UserIds": [ "user-id-1", "user-id-3" ], "ReplicationGroups": [], "ARN": "arn:aws:elasticache:us-east-1:493071037918:usergroup:new-group-1" }

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

aws elasticache describe-user-groups \ --user-group-id test-group
{ "UserGroups": [{ "UserGroupId": "test-group", "Status": "creating", "Engine": "redis", "UserIds": [ "defaut", "test-user-1" ], "ReplicationGroups": [] }] }

将用户组分配给复制组

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

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

要使用 AWS 管理控制台 将用户组添加到复制,请执行以下操作:

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

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

关键参数

  • --engine – 必须是 redis

  • --engine-version – 必须为 6.x 或更高版本。

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

  • --user-group-ids – 此值提供包含具有集群的指定访问权限的用户的用户组。

  • --cache-subnet-group – 关联用户组所必需的。

对于 Linux, OS X, or Unix:

aws elasticache create-replication-group \ --replication-group-id "new-replication-group" \ --replication-group-description "new-replication-group" \ --engine "redis" \ --engine-version "6.x" \ --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" ^ --engine-version "6.x" ^ --cache-node-type cache.m5.large ^ --transit-encryption-enabled ^ --user-group-ids "new-group-1" ^ --cache-subnet-group "cache-subnet-group"

上述代码返回以下响应。

{ "ReplicationGroup": { "ReplicationGroupId": "new-replication-group", "Description": "new-replication-group", "Status": "creating", "PendingModifiedValues": {}, "MemberClusters": [ "new-replication-group-001" ], "AutomaticFailover": "disabled", "SnapshotRetentionLimit": 0, "SnapshotWindow": "10:30-11:30", "ClusterEnabled": false, "UserGroupIds": ["new-group-1"] "CacheNodeType": "cache.m5.large", "TransitEncryptionEnabled": true, "AtRestEncryptionEnabled": false } }

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

对于 Linux, OS X, or 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"

上述代码返回以下响应 (缩写):

{ "ReplicationGroupId": "replication-group-1", "PendingChanges": { "UserGroups": { "UserGroupIdsToRemove": ["new-group-1"], "UserGroupIdsToAdd": ["new-group-2"] } } . . . "UserGroupIds": ["new-group-1"] }
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" { "ReplicationGroupId": "replication-group-1", "PendingChanges": { "UserGroups": { "UserGroupIdsToRemove": ["new-group-1"], "UserGroupIdsToAdd": ["new-group-2"] } } . . . "UserGroupIds": ["new-group-1"] }

请注意响应中的 PendingChanges。对复制组所做的任何修改都将异步更新。您可以通过查看事件来监控此进度。有关更多信息,请参阅查看 ElastiCache 事件

从 Redis AUTH 迁移到 RBAC

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

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

使用控制台从 Redis AUTH 迁移到 RBAC

  1. 登录 AWS 管理控制台并通过以下网址打开 ElastiCache 控制台:https://console.amazonaws.cn/elasticache/

  2. 从右上角的列表中,选择要修改的集群所在的 AWS 区域。

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

    此时会显示选定引擎的集群列表。

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

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

    Modify Cluster (修改集群) 窗口随即出现。

  6. 对于 Access Control Option (访问控制选项),选择 User Group Access Control List (用户组访问控制列表)

  7. 对于 User Group Access Control List (用户组访问控制列表),选择一个用户组。

  8. 选择修改

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

使用 CLI 从 Redis AUTH 迁移到 RBAC

  • 使用 modify-replication-group 命令,如下所示。

    对于 Linux, OS X, or 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