翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
IAM による認証
概要
IAM 認証では、キャッシュが ElastiCache Valkey または Redis OSSバージョン 7 以降を使用するように設定されている場合、ID OSSを使用して AWS IAM for Valkey または Redis への接続を認証できます。これにより、セキュリティモデルを強化し、多くの管理セキュリティタスクを簡素化できます。IAM 認証を使用して、最小特権のアクセス許可の原則に従って、個々の ElastiCache キャッシュと ElastiCache ユーザーごとにきめ細かなアクセスコントロールを設定することもできます。 IAMの認証は、Valkey、Redis、OSSAUTH
または HELLO
コマンドで、存続期間の長い ElastiCache ユーザーパスワードの代わりに、存続期間の短いIAM認証トークンを提供することによって ElastiCache 機能します。IAM 認証トークンの詳細については、「 AWS 全般のリファレンスガイド」の「署名バージョン 4 の署名プロセス」および以下のコード例を参照してください。
IAM ID とそれに関連するポリシーを使用して、Valkey または Redis OSS アクセスをさらに制限できます。また、フェデレーティッド ID プロバイダーのユーザーに Valkey または Redis OSSキャッシュへのアクセスを直接付与することもできます。
で を使用するには AWS IAM ElastiCache、まず認証モードを に設定して ElastiCache ユーザーを作成する必要がありますIAM。その後、IAMID を作成または再利用できます。IAM ID には、 ElastiCache キャッシュと ElastiCache ユーザーに elasticache:Connect
アクションを付与するための関連ポリシーが必要です。設定したら、IAMユーザーまたはロールの AWS 認証情報を使用してIAM認証トークンを作成できます。最後に、キャッシュに接続するときに、有効期間の短いIAM認証トークンを Valkey または Redis OSSクライアントのパスワードとして指定する必要があります。認証情報プロバイダーをサポートする Valkey または Redis OSSクライアントは、新しい接続ごとに一時的な認証情報を自動的に生成できます。 ElastiCache は、 IAM対応 ElastiCache ユーザーの接続リクエストに対してIAM認証を実行し、 との接続リクエストを検証しますIAM。
制限
IAM 認証を使用する場合、次の制限が適用されます。
IAM 認証は、 ElastiCache for Valkey 7.2 以降または Redis OSSバージョン 7.0 以降を使用する場合に使用できます。
IAMが有効な ElastiCache ユーザーの場合、ユーザー名とユーザー ID のプロパティは同じである必要があります。
IAM 認証トークンは 15 分間有効です。存続期間の長い接続の場合は、認証情報プロバイダーインターフェイスをサポートする Valkey または Redis OSSクライアントを使用することをお勧めします。
Valkey または Redis ElastiCache の へのIAM認証済み接続OSSは、12 時間後に自動的に切断されます。新しいIAM認証トークンで
AUTH
またはHELLO
コマンドを送信することで、接続を 12 時間延長できます。IAM 認証は
MULTI EXEC
コマンドではサポートされていません。現在、IAM認証では以下のグローバル条件コンテキストキーがサポートされています。
サーバーレスキャッシュでIAM認証を使用する場合、
aws:VpcSourceIp
、、aws:SourceVpc
、aws:SourceVpce
、aws:EpochTime
、aws:ResourceTag/%s
(関連するサーバーレスキャッシュとユーザーから)aws:CurrentTime
がサポートされます。レプリケーショングループでIAM認証を使用する場合、
aws:SourceIp
およびaws:ResourceTag/%s
(関連するレプリケーショングループおよびユーザーから) がサポートされます。
グローバル条件コンテキストキーの詳細については、「 IAMユーザーガイド」のAWS 「 グローバル条件コンテキストキー」を参照してください。
セットアップ
IAM 認証を設定するには:
キャッシュを作成する
aws elasticache create-serverless-cache \ --serverless-cache-name cache-01 \ --description "ElastiCache IAM auth application" \ --engine redis
以下に示すように、アカウントが新しいロールを引き受けることを許可する ロールのIAM信頼ポリシードキュメントを作成します。ポリシーを trust-policy.json というファイルに保存します。
{ "Version": "2012-10-17", "Statement": { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::123456789012:root" }, "Action": "sts:AssumeRole" } }
次に示すように、 IAMポリシードキュメントを作成します。ポリシーを policy.json というファイルに保存します。
{ "Version": "2012-10-17", "Statement": [ { "Effect" : "Allow", "Action" : [ "elasticache:Connect" ], "Resource" : [ "arn:aws:elasticache:us-east-1:123456789012:serverlesscache:cache-01", "arn:aws:elasticache:us-east-1:123456789012:user:iam-user-01" ] } ] }
IAM ロールを作成します。
aws iam create-role \ --role-name "elasticache-iam-auth-app" \ --assume-role-policy-document file://trust-policy.json
IAM ポリシーを作成します。
aws iam create-policy \ --policy-name "elasticache-allow-all" \ --policy-document file://policy.json
IAM ポリシーをロールにアタッチします。
aws iam attach-role-policy \ --role-name "elasticache-iam-auth-app" \ --policy-arn "arn:aws:iam::123456789012:policy/elasticache-allow-all"
IAM新しい 対応ユーザーを作成します。
aws elasticache create-user \ --user-name iam-user-01 \ --user-id iam-user-01 \ --authentication-mode Type=iam \ --engine redis \ --access-string "on ~* +@all"
ユーザーグループを作成し、ユーザーをアタッチします。
aws elasticache create-user-group \ --user-group-id iam-user-group-01 \ --engine redis \ --user-ids default iam-user-01 aws elasticache modify-serverless-cache \ --serverless-cache-name cache-01 \ --user-group-id iam-user-group-01
接続中
トークンをパスワードとして接続
まず、AWS SigV4 署名付きリクエストを使用して、有効期間の短いIAM認証トークンを生成する必要があります。その後、以下の例に示すように、Valkey または Redis OSSキャッシュに接続するときにIAM認証トークンをパスワードとして指定します。
String userId = "
insert user id
"; String cacheName = "insert cache name
"; boolean isServerless =true
; String region = "insert region
"; // Create a default AWS Credentials provider. // This will look for AWS credentials defined in environment variables or system properties. AWSCredentialsProvider awsCredentialsProvider = new DefaultAWSCredentialsProviderChain(); // Create an IAM authentication token request and signed it using the AWS credentials. // The pre-signed request URL is used as an IAM authentication token for ElastiCache with Redis OSS. IAMAuthTokenRequest iamAuthTokenRequest = new IAMAuthTokenRequest(userId, cacheName, region, isServerless); String iamAuthToken = iamAuthTokenRequest.toSignedRequestUri(awsCredentialsProvider.getCredentials()); // Construct Redis OSS URL with IAM Auth credentials provider RedisURI redisURI = RedisURI.builder() .withHost(host) .withPort(port) .withSsl(ssl) .withAuthentication(userId, iamAuthToken) .build(); // Create a new Lettuce Redis OSS client RedisClient client = RedisClient.create(redisURI); client.connect();
以下は IAMAuthTokenRequest
の定義です。
public class IAMAuthTokenRequest { private static final HttpMethodName REQUEST_METHOD = HttpMethodName.GET; private static final String REQUEST_PROTOCOL = "http://"; private static final String PARAM_ACTION = "Action"; private static final String PARAM_USER = "User"; private static final String PARAM_RESOURCE_TYPE = "ResourceType"; private static final String RESOURCE_TYPE_SERVERLESS_CACHE = "ServerlessCache"; private static final String ACTION_NAME = "connect"; private static final String SERVICE_NAME = "elasticache"; private static final long TOKEN_EXPIRY_SECONDS = 900; private final String userId; private final String cacheName; private final String region; private final boolean isServerless; public IAMAuthTokenRequest(String userId, String cacheName, String region, boolean isServerless) { this.userId = userId; this.cacheName = cacheName; this.region = region; this.isServerless = isServerless; } public String toSignedRequestUri(AWSCredentials credentials) throws URISyntaxException { Request<Void> request = getSignableRequest(); sign(request, credentials); return new URIBuilder(request.getEndpoint()) .addParameters(toNamedValuePair(request.getParameters())) .build() .toString() .replace(REQUEST_PROTOCOL, ""); } private <T> Request<T> getSignableRequest() { Request<T> request = new DefaultRequest<>(SERVICE_NAME); request.setHttpMethod(REQUEST_METHOD); request.setEndpoint(getRequestUri()); request.addParameters(PARAM_ACTION, Collections.singletonList(ACTION_NAME)); request.addParameters(PARAM_USER, Collections.singletonList(userId)); if (isServerless) { request.addParameters(PARAM_RESOURCE_TYPE, Collections.singletonList(RESOURCE_TYPE_SERVERLESS_CACHE)); } return request; } private URI getRequestUri() { return URI.create(String.format("%s%s/", REQUEST_PROTOCOL, cacheName)); } private <T> void sign(SignableRequest<T> request, AWSCredentials credentials) { AWS4Signer signer = new AWS4Signer(); signer.setRegionName(region); signer.setServiceName(SERVICE_NAME); DateTime dateTime = DateTime.now(); dateTime = dateTime.plus(Duration.standardSeconds(TOKEN_EXPIRY_SECONDS)); signer.presignRequest(request, credentials, dateTime.toDate()); } private static List<NameValuePair> toNamedValuePair(Map<String, List<String>> in) { return in.entrySet().stream() .map(e -> new BasicNameValuePair(e.getKey(), e.getValue().get(0))) .collect(Collectors.toList()); } }
認証情報プロバイダーに接続
以下のコードは、認証情報プロバイダー ElastiCache を使用して でIAM認証する方法を示しています。
String userId = "
insert user id
"; String cacheName = "insert cache name
"; boolean isServerless =true
; String region = "insert region
"; // Create a default AWS Credentials provider. // This will look for AWS credentials defined in environment variables or system properties. AWSCredentialsProvider awsCredentialsProvider = new DefaultAWSCredentialsProviderChain(); // Create an IAM authentication token request. Once this request is signed it can be used as an // IAM authentication token for ElastiCache with Redis OSS. IAMAuthTokenRequest iamAuthTokenRequest = new IAMAuthTokenRequest(userId, cacheName, region, isServerless); // Create a Redis OSS credentials provider using IAM credentials. RedisCredentialsProvider redisCredentialsProvider = new RedisIAMAuthCredentialsProvider( userId, iamAuthTokenRequest, awsCredentialsProvider); // Construct Redis OSS URL with IAM Auth credentials provider RedisURI redisURI = RedisURI.builder() .withHost(host) .withPort(port) .withSsl(ssl) .withAuthentication(redisCredentialsProvider) .build(); // Create a new Lettuce Redis OSS client RedisClient client = RedisClient.create(redisURI); client.connect();
以下は、 を認証情報プロバイダーIAMAuthTokenRequestにラップして、必要に応じて一時的な認証情報を自動生成する Lettuce Redis OSSクライアントの例です。
public class RedisIAMAuthCredentialsProvider implements RedisCredentialsProvider { private static final long TOKEN_EXPIRY_SECONDS = 900; private final AWSCredentialsProvider awsCredentialsProvider; private final String userId; private final IAMAuthTokenRequest iamAuthTokenRequest; private final Supplier<String> iamAuthTokenSupplier; public RedisIAMAuthCredentialsProvider(String userId, IAMAuthTokenRequest iamAuthTokenRequest, AWSCredentialsProvider awsCredentialsProvider) { this.userName = userName; this.awsCredentialsProvider = awsCredentialsProvider; this.iamAuthTokenRequest = iamAuthTokenRequest; this.iamAuthTokenSupplier = Suppliers.memoizeWithExpiration(this::getIamAuthToken, TOKEN_EXPIRY_SECONDS, TimeUnit.SECONDS); } @Override public Mono<RedisCredentials> resolveCredentials() { return Mono.just(RedisCredentials.just(userId, iamAuthTokenSupplier.get())); } private String getIamAuthToken() { return iamAuthTokenRequest.toSignedRequestUri(awsCredentialsProvider.getCredentials()); } }