

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

# 从基于密码的身份验证 (AUTH) 迁移到 IAM 身份验证
<a name="auth-to-iam-migration"></a>

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

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

## 概述
<a name="auth-to-iam-overview"></a>

IAM 身份验证无需使用长寿命密码，从而增强了安全性。相反，应用程序使用[Amazon 签名版本 4 签名过程](https://docs.amazonaws.cn//general/latest/gr/signature-version-4.html)生成短期身份验证令牌（有效期最长 15 分钟）。

## 先决条件
<a name="auth-to-iam-prereqs"></a>

在开始之前，请验证以下几点：
+ 你的缓存正在运行 Redis OSS 7.0 或更高版本或 Valkey。早期版本的引擎不支持 IAM 身份验证。
+ In-transit 您的缓存已启用加密 (TLS)。IAM 身份验证需要 TLS。有关更多信息，请参阅 [ElastiCache 传输中加密 (TLS)](in-transit-encryption.md)。
+ 您拥有创建用户和修改用户组所必需的 IAM 权限。有关更多信息，请参阅 [亚马逊如何 ElastiCache 与 IAM 合作](security_iam_service-with-iam.md)。
+ 您的应用程序使用的 IAM 角色或用户具有允许目标缓存和 IAM 用户`elasticache:Connect`执行操作的 IAM 策略。有关更多信息，请参阅 [使用 IAM 进行身份验证](auth-iam.md)。
+ 您的应用程序没有其他 IAM 身份验证限制。有关限制的完整列表，请参阅[使用 IAM 进行身份验证](auth-iam.md)。

## 迁移过程
<a name="auth-to-iam-process"></a>

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

### 步骤 1：创建用户
<a name="auth-to-iam-create-users"></a>

创建两个 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：创建并附加用户组
<a name="auth-to-iam-user-group"></a>

如果您已经有一个包含基于密码的用户的用户组，请将该用户添加到该现有 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：验证两种身份验证方法](#auth-to-iam-verify-dual)。

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

使用以下 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：验证两种身份验证方法
<a name="auth-to-iam-verify-dual"></a>

完成步骤 2 后，您的缓存支持这两种身份验证方法。在继续操作之前，请验证应用程序是否可以使用这两种方法进行连接。
+ 使用基于密码的身份验证的应用程序可以继续使用密码进行连接。
+ 为 IAM 身份验证配置的应用程序可以使用 IAM 令牌进行连接。

### 第 4 步：使用 IAM 连接
<a name="auth-to-iam-connect"></a>

**生成 IAM 身份验证令牌**

使用 [Amazon Sigv4](https://docs.amazonaws.cn//general/latest/gr/sigv4-signed-request-examples.html) 预签名请求生成短期的 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：应用程序集成
<a name="auth-to-iam-app-integration"></a>

对于 Java 应用程序，使用默认 Amazon 凭证提供程序链生成临时安全证书。有关更多信息，请参阅 [使用 IAM 进行身份验证](auth-iam.md)。对于其他语言，请使用[Amazon 签名版本 4 签名流程](https://docs.amazonaws.cn//general/latest/gr/signature-version-4.html)生成 IAM 身份验证令牌，并将其作为密码传递到客户端的`AUTH`命令中。

## 完成迁移
<a name="auth-to-iam-completing"></a>

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

### 步骤 1：配置带后备功能的 IAM 身份验证
<a name="auth-to-iam-fallback"></a>

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

在您的应用程序代码中：
+ 将您的客户端配置为使用 IAM-generated 令牌作为主要方法进行身份验证。
+ 添加回退机制，这样，如果 IAM 身份验证失败（例如，由于令牌到期或生成错误），客户端将使用基于密码的身份验证凭证重试。
+ 记录所有身份验证尝试，包括回退和重试，以便您可以监控是否有任何连接正在回退到基于密码的身份验证。

### 步骤 2：监控和验证
<a name="auth-to-iam-monitor"></a>

在至少 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：移除基于密码的用户
<a name="auth-to-iam-remove-user"></a>

确认所有应用程序都使用 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 name="auth-to-iam-confirm"></a>

将基于密码的用户从用户组中移除后，请监控 A `AuthenticationFailures` ma CloudWatch zon 指标。如果持续值为零，则表示没有发生任何身份验证失败，包括任何剩余的基于密码的尝试。针对此指标设置 CloudWatch 警报以检测意外尝试。

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

## 回滚程序
<a name="auth-to-iam-rollback"></a>

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：移除基于密码的用户](#auth-to-iam-remove-user)，只需一个操作即可添加基于密码的用户并移除已禁用的占位符用户：

对于 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）。