View a markdown version of this page

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

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

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

本指南介绍如何在不中断服务的情况下将基于 Amazon ElastiCache 节点的集群或无服务器缓存从基于密码的身份验证 (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 用户elasticache:Connect执行操作的 IAM 策略。有关更多信息,请参阅 使用 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>— 您的缓存使用的引擎:valkeyredis

  • <your-existing-auth-password>— 当前在您的缓存中配置的身份验证令牌。

创建 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>— 您的缓存使用的引擎:valkeyredis

步骤 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>— 您的缓存使用的引擎:valkeyredis

  • <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 身份验证令牌的AUTHHELLO命令,可以延长连接时间。

  • 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:确认移除后

将基于密码的用户从用户组中移除后,请监控 A AuthenticationFailures ma CloudWatch zon 指标。如果持续值为零,则表示没有发生任何身份验证失败,包括任何剩余的基于密码的尝试。针对此指标设置 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)。