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

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

在 Amazon ElastiCache for Redis 6.x 中,您可以使用称为基于角色的访问控制 (RBAC) 的功能,而无需使用 Redis AUTH 命令对用户进行身份验证(如 使用 Redis AUTH 命令对用户进行身份验证 中所示)。

与 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 复制组的权限,请使用 AWS CLI 或 AWS Management Console 创建一个访问字符串并将其分配给用户。

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

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

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

on ~* +@all

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

  • on – 用户是活动用户。

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

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

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

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

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

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

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

+@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 Management Console 并打开 Amazon ElastiCache 控制台 (https://console.aws.amazon.com/elasticache/)。

  2. 자세한 내용은 AWS Command Line Interface 사용 설명서에서 AWS Command Line Interface 설치를 참조하세요.

  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、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. 登录到 AWS Management Console 并打开 Amazon ElastiCache 控制台 (https://console.aws.amazon.com/elasticache/)。

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

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

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

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

    • Delete User(删除用户)– 用户账户将从其所属的任何用户管理组中移除。

按以下过程使用 AWS 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

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

    { "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、macOS 或 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 Management Console 并打开 Amazon ElastiCache 控制台 (https://console.aws.amazon.com/elasticache/)。

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

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

    • Create(创建)– 创建用户组时,您可以添加用户,然后将用户组分配给复制组。例如,您可以为在集群上具有管理角色的用户创建一个 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

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

    { "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、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-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、macOS 或 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 Management Console 将用户组添加到复制中,请执行以下操作:

使用 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、macOS 或 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、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"

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

{ "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 Management Console 并打开 ElastiCache 控制台 (https://console.aws.amazon.com/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、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