本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
从基于密码的身份验证 (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>— 您的缓存使用的引擎:valkey或redis。<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>— 您的缓存使用的引擎: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:确认移除后
将基于密码的用户从用户组中移除后,请监控 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)。