View a markdown version of this page

从基于密码的身份验证 (AUTH) 迁移到 IAM 身份验证 - Amazon ElastiCache
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)。

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

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

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

注意

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

概述

IAM 身份验证通过消除对长效密码的需求来增强安全性。相反,应用程序使用Amazon 签名版本 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 身份验证。

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

注意

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

使用以下 Amazon 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 用户

使用以下 Amazon 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:验证两种身份验证方法。

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

使用以下 Amazon 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 身份验证令牌

使用 Amazon 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 应用程序,使用默认的 Amazon 证书提供程序链来生成临时安全证书。有关更多信息,请参阅 使用 IAM 进行身份验证。对于其他语言,使用Amazon 签名版本 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)。