View a markdown version of this page

从基于密码的身份验证 (AUTH) 迁移到 IAM 身份验证 - 亚马逊 ElastiCache

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

从基于密码的身份验证 (AUTH) 迁移到 IAM 身份验证

本指南介绍如何在不中断服务的情况下将 ElastiCache 基于Amazon节点的集群或无服务器缓存从基于密码的身份验证 (AUTH) 迁移到 AWS Identity and Access Management (IAM) 身份验证。

注意

我们建议在对生产环境进行更改之前,在非生产环境中测试此迁移。

概述

IAM 身份验证通过消除对长效密码的需求来增强安全性。相反,应用程序使用AWS 签名版本 4 签名流程生成短期身份验证令牌(有效期最长 15 分钟)。

先决条件

在开始之前,请验证以下几点:

  • 你的缓存正在运行 Redis OSS 7.0 或更高版本或 Valkey。早期的引擎版本不支持 IAM 身份验证。

  • In-transit 您的缓存已启用加密 (TLS)。IAM 身份验证需要 TLS。有关更多信息,请参阅 ElastiCache 传输加密 (TLS)。

  • 您拥有创建用户和修改用户组所必需的 IAM 权限。有关更多信息,请参阅 亚马逊如何 ElastiCache 与 IAM 合作。

  • 您的应用程序使用的 IAM 角色或用户具有 IAM 策略,允许目标缓存和 IAM 用户elasticache:Connect执行操作。有关更多信息,请参阅 使用 IAM 进行身份验证。

  • 没有额外的 IAM 身份验证限制适用于您的应用程序。有关限制的完整列表,请参阅使用 IAM 进行身份验证。

迁移过程

迁移过程包括创建基于密码的用户和 IAM-authenticated 用户,验证连接,然后将您的应用程序过渡到 IAM 身份验证。

第 1 步:创建用户

创建两个 ElastiCache 用户,以便您的缓存在迁移期间支持基于密码的身份验证和 IAM 身份验证。

创建基于密码的身份验证用户

注意

如果您已经配置了基于密码的用户,则可以跳过创建新用户并使用现有用户。

使用以下 AWS CLI 命令创建基于密码的用户。

对于 Linux、macOS 或 Unix:

aws elasticache create-user \ --user-id <user-id> \ --user-name default \ --engine <engine> \ --passwords "<your-existing-auth-password>" \ --access-string "on ~* +@all"

对于 Windows:

aws elasticache create-user ^ --user-id <user-id> ^ --user-name default ^ --engine <engine> ^ --passwords "<your-existing-auth-password>" ^ --access-string "on ~* +@all"

进行如下替换:

  • <user-id>— 此用户的唯一 ID。

  • <engine>— 你的缓存使用的引擎:valkey或redis。

  • <your-existing-auth-password>— 当前在您的缓存上配置的 AUTH 令牌。

创建 IAM-authenticated 用户

使用以下 AWS CLI 命令创建 IAM-authenticated 用户。

对于 Linux、macOS 或 Unix:

aws elasticache create-user \ --user-id <iam-user-id> \ --user-name <iam-user-name> \ --authentication-mode Type=iam \ --engine <engine> \ --access-string "on ~* +@all"

对于 Windows:

aws elasticache create-user ^ --user-id <iam-user-id> ^ --user-name <iam-user-name> ^ --authentication-mode Type=iam ^ --engine <engine> ^ --access-string "on ~* +@all"

进行如下替换:

  • <iam-user-id>— IAM 用户的唯一 ID。

  • <iam-user-name>— IAM 用户的用户名。

  • <engine>— 你的缓存使用的引擎:valkey或redis。

第 2 步:创建并连接用户组

如果您已经有一个包含基于密码的用户的用户组,请将该 IAM-authenticated 用户添加到该现有群组:

对于 Linux、macOS 或 Unix:

aws elasticache modify-user-group \ --user-group-id <user-group-id> \ --user-ids-to-add <iam-user-id>

对于 Windows:

aws elasticache modify-user-group ^ --user-group-id <user-group-id> ^ --user-ids-to-add <iam-user-id>

进行如下替换:

  • <user-group-id>— 您现有用户组的 ID。

  • <iam-user-id>— 在步骤 1 中创建的 IAM-authenticated 用户的用户 ID。

然后跳至 步骤 3:验证两种身份验证方法。

否则,创建一个新的用户组,添加两个用户,并将该组附加到您的缓存中。

使用以下 AWS CLI 命令创建包含两个用户的用户组:

对于 Linux、macOS 或 Unix:

aws elasticache create-user-group \ --user-group-id <user-group-id> \ --engine <engine> \ --user-ids <user-id> <iam-user-id>

对于 Windows:

aws elasticache create-user-group ^ --user-group-id <user-group-id> ^ --engine <engine> ^ --user-ids <user-id> <iam-user-id>

进行如下替换:

  • <user-group-id>— 用户组的唯一 ID。

  • <engine>— 你的缓存使用的引擎:valkey或redis。

  • <user-id>, <iam-user-id> — 在步骤 1 中创建的用户 ID。

然后修改您的缓存以使用新的用户组。

对于基于节点的集群:

对于 Linux、macOS 或 Unix:

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

对于 Windows:

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

进行如下替换:

  • <replication-group-id>— 您的复制组的 ID。

  • <user-group-id>— 您在上面创建的用户组 ID。

对于无服务器缓存:

对于 Linux、macOS 或 Unix:

aws elasticache modify-serverless-cache \ --serverless-cache-name <serverless-cache-name> \ --user-group-id <user-group-id>

对于 Windows:

aws elasticache modify-serverless-cache ^ --serverless-cache-name <serverless-cache-name> ^ --user-group-id <user-group-id>

进行如下替换:

  • <serverless-cache-name>— 您的无服务器缓存的名称。

  • <user-group-id>— 您在上面创建的用户组 ID。

步骤 3:验证两种身份验证方法

完成第 2 步后,您的缓存支持两种身份验证方法。在继续操作之前,请验证应用程序是否可以使用两种方法进行连接。

  • 使用基于密码的身份验证的应用程序可以继续使用该密码进行连接。

  • 为 IAM 身份验证配置的应用程序可以使用 IAM 令牌进行连接。

第 4 步:连接 IAM

生成 IAM 身份验证令牌

使用 AWS SigV4 预签名请求生成短期的 IAM 身份验证令牌。以下 Python 示例演示了代币生成。

import boto3 from botocore.auth import SigV4QueryAuth from botocore.awsrequest import AWSRequest cache_name = "<cache-name>" user = "<username>" region = "<region>" expires = 900 session = boto3.Session() credentials = session.get_credentials().get_frozen_credentials() req = AWSRequest( method="GET", url=f"http://{cache_name}/", params={"Action": "connect", "User": user} ) SigV4QueryAuth(credentials, "elasticache", region, expires=expires).add_auth(req) token = req.url.replace("http://", "") print(token)
注意

生成的令牌自创建之日起有效期最长 15 分钟。

使用 valkey-cli 进行连接

使用生成的令牌连接到您的 ElastiCache 缓存。您可以使用valkey-cli或连接redis-cli到 Valkey 集群。对于 Redis OSS 集群,请使用redis-cli。

valkey-cli -h <host> -p 6379 --tls

对于启用集群模式的集群,添加标--cluster志:

valkey-cli -h <host> -p 6379 --tls --cluster

然后使用以下命令进行身份验证:

AUTH <username> <token>

进行如下替换:

  • <host>— 缓存的终端节点。

  • <username>— 用户的 IAM-authenticated 用户名。

  • <token>— 您生成的 IAM 身份验证令牌。

预期输出:

OK

运行以下命令来验证用户名:

ACL WHOAMI

第 5 步:应用程序集成

对于 Java 应用程序,使用默认的 AWS 证书提供程序链来生成临时安全证书。有关更多信息,请参阅 使用 IAM 进行身份验证。对于其他语言,使用AWS 签名版本 4 签名流程生成 IAM 身份验证令牌,并将其作为密码传递给客户的AUTH命令。

完成迁移

在您的应用程序可以使用 IAM 身份验证进行连接后,完成以下步骤以完成迁移。

第 1 步:使用备用方式配置 IAM 身份验证

在删除基于密码的用户之前,请更新您的应用程序代码以使用 IAM 身份验证作为主要方法,同时保留基于密码的用户作为备用方法。

在您的应用程序代码中:

  • 将您的客户端配置为使用 IAM-generated 令牌作为主要方法进行身份验证。

  • 添加备用机制,这样,如果 IAM 身份验证失败(例如,由于令牌到期或生成错误),客户端将使用基于密码的身份验证凭证重试。

  • 记录所有身份验证尝试,包括回退和重试,这样您就可以监控是否有任何连接恢复到基于密码的身份验证。

第 2 步:监控和验证

在至少 24-48 小时内查看您的应用程序日志IamAuthenticationExpirations、和 IamAuthenticationThrottling Amazon CloudWatch 指标,以确认所有连接均通过 IAM。

任一指标的调查值均为非零值:

  • IamAuthenticationExpirations— 经 IAM 身份验证的连接会在 12 小时后自动断开连接。通过发送带有新 IAM 身份验证令牌的AUTH或HELLO命令,可以延长连接。

  • IamAuthenticationThrottling— 表示身份验证请求过多,这可能意味着您的应用程序生成令牌过于激进或存在连接池问题。

对于基于节点的集群,您可以执行额外的引擎级检查:

  • ACL LOG— 检查身份验证尝试是否失败。使用以下内容查找参赛作品reason=auth.

  • CLIENT LIST— 验证连接的用户。检查该user=字段以确认客户正在使用 IAM 用户。

ACL LOG并且仅CLIENT LIST在基于节点的集群上可用。对于 ElastiCache 无服务器部署,依赖应用程序端日志记录和 Amazon 指标。 CloudWatch

第 3 步:移除基于密码的用户

确认所有应用程序都使用 IAM 身份验证后,将基于密码的用户从用户组中移除。

Valkey 缓存

直接删除基于密码的用户:

对于 Linux、macOS 或 Unix:

aws elasticache modify-user-group \ --user-group-id <user-group-id> \ --user-ids-to-remove <password-user-id>

对于 Windows:

aws elasticache modify-user-group ^ --user-group-id <user-group-id> ^ --user-ids-to-remove <password-user-id>

Redis OSS 缓存

对于 Redis OSS 缓存,用户组必须始终包含具有该用户名的用户。default如果您在步骤 1 中创建的基于密码的用户拥有该用户名default,则必须先创建一个禁用的占位符用户来替换该用户名,然后才能将其删除:

对于 Linux、macOS 或 Unix:

aws elasticache create-user \ --user-id <disabled-default-id> \ --user-name default \ --engine redis \ --no-password-required \ --access-string "off ~* -@all"

对于 Windows:

aws elasticache create-user ^ --user-id <disabled-default-id> ^ --user-name default ^ --engine redis ^ --no-password-required ^ --access-string "off ~* -@all"

然后将禁用用户添加到该组并删除基于密码的用户:

对于 Linux、macOS 或 Unix:

aws elasticache modify-user-group \ --user-group-id <user-group-id> \ --user-ids-to-add <disabled-default-id> \ --user-ids-to-remove <password-user-id>

对于 Windows:

aws elasticache modify-user-group ^ --user-group-id <user-group-id> ^ --user-ids-to-add <disabled-default-id> ^ --user-ids-to-remove <password-user-id>

如果您在步骤 1 中创建的基于密码的用户没有该用户名default,则可以使用上述 Valkey 缓存中显示的相同命令直接将其删除。

进行如下替换:

  • <disabled-default-id>— 禁用占位符用户的唯一 ID(仅限 Redis OSS)。

  • <user-group-id>— 与您的缓存关联的用户组的 ID。

  • <password-user-id>— 要删除的基于密码的用户的用户 ID。

注意

将基于密码的用户从用户组中移除后,请勿将其删除。保持可用,以防您需要回滚到基于密码的身份验证。

第 4 步:移除后确认

将基于密码的用户从用户组中移除后,监控AuthenticationFailures亚马逊 CloudWatch 指标。持续值为零表示未发生任何身份验证失败,包括任何剩余的密码尝试。针对该指标设置 CloudWatch 警报以检测意外尝试。

对于基于节点的集群,您也可以使用和进行ACL LOG验证。CLIENT LIST对于无服务器缓存,依赖应用程序端的日志记录和指标。 CloudWatch

回滚程序

Re-add 将基于密码的用户添加到用户组,然后在调查时在应用程序中恢复基于密码的身份验证。

对于 Valkey 缓存:

对于 Linux、macOS 或 Unix:

aws elasticache modify-user-group \ --user-group-id <user-group-id> \ --user-ids-to-add <password-user-id>

对于 Windows:

aws elasticache modify-user-group ^ --user-group-id <user-group-id> ^ --user-ids-to-add <password-user-id>

对于基于密码的用户没有用户名的 Redis OSS 缓存default,请使用上面的相同命令。

对于您在中创建禁用占位符用户的 Redis OSS 缓存第 3 步:移除基于密码的用户,只需一次操作即可添加基于密码的用户并移除禁用的占位符用户:

对于 Linux、macOS 或 Unix:

aws elasticache modify-user-group \ --user-group-id <user-group-id> \ --user-ids-to-add <password-user-id> \ --user-ids-to-remove <disabled-default-id>

对于 Windows:

aws elasticache modify-user-group ^ --user-group-id <user-group-id> ^ --user-ids-to-add <password-user-id> ^ --user-ids-to-remove <disabled-default-id>

进行如下替换:

  • <user-group-id>— 与您的缓存关联的用户组的 ID。

  • <password-user-id>— 要重新添加的基于密码的用户的用户 ID。

  • <disabled-default-id>— 禁用的占位符用户的用户 ID(仅限 Redis OSS)。