View a markdown version of this page

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

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

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

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

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

创建 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>— 您的缓存使用的引擎: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:验证两种身份验证方法

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

使用以下 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>— 您的缓存使用的引擎: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 身份验证令牌

使用 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 身份验证令牌的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)。