Autenticación con IAM - Amazon ElastiCache

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

Autenticación con IAM

Información general

Con la IAM autenticación, puede autenticar una conexión ElastiCache con Valkey o Redis OSS mediante AWS IAM identidades, si su caché está configurada para usar Valkey o OSS Redis, versión 7 o superior. Esto le permite reforzar el modelo de seguridad y simplificar muchas tareas de seguridad administrativa. También puede usar la IAM autenticación para configurar un control de acceso detallado para cada ElastiCache caché y usuario individual, siguiendo los principios de permisos con privilegios mínimos. ElastiCache IAMLa autenticación ElastiCache con Valkey o Redis OSS funciona proporcionando un token de IAM autenticación de corta duración en lugar de una contraseña de usuario de larga duración ElastiCache en el comando o de Valkey o Redis. OSS AUTH HELLO Para obtener más información sobre el token de IAM autenticación, consulte el proceso de firma de la versión 4 de Signature en la Guía de referencia AWS general y el ejemplo de código que aparece a continuación.

Puede usar IAM las identidades y sus políticas asociadas para restringir aún más el acceso a Valkey o RedisOSS. También puedes conceder acceso a los usuarios desde sus proveedores de identidad federados directamente a las cachés de Valkey o Redis. OSS

Para usarlo AWS IAM con ElastiCache, primero debe crear un ElastiCache usuario con el modo de autenticación establecido en. IAM A continuación, puede crear o reutilizar una IAM identidad. La IAM identidad necesita una política asociada para conceder la elasticache:Connect acción a la ElastiCache memoria caché y al ElastiCache usuario. Una vez configurado, puede crear un token de IAM autenticación con las AWS credenciales del IAM usuario o rol. Por último, debe proporcionar el token de IAM autenticación de corta duración como contraseña en su OSS cliente de Valkey o Redis cuando se conecte a la memoria caché. Un OSS cliente de Valkey o Redis con soporte para el proveedor de credenciales puede generar automáticamente las credenciales temporales automáticamente para cada nueva conexión. ElastiCache IAMautenticará las solicitudes de conexión de ElastiCache los usuarios IAM habilitados y validará las solicitudes de conexión con. IAM

Limitaciones

Al utilizar la IAM autenticación, se aplican las siguientes limitaciones:

  • IAMla autenticación está disponible cuando se utiliza ElastiCache con Valkey 7.2 o superior y Redis con la OSS versión 7.0 o superior.

  • En el caso IAM de ElastiCache los usuarios habilitados, las propiedades del nombre de usuario y del identificador de usuario deben ser idénticas.

  • El token IAM de autenticación es válido durante 15 minutos. Para conexiones de larga duración, recomendamos utilizar un OSS cliente Valkey o Redis que admita una interfaz de proveedor de credenciales.

  • Una conexión IAM autenticada ElastiCache con Valkey o Redis se OSS desconectará automáticamente después de 12 horas. La conexión se puede prolongar durante 12 horas enviando un HELLO comando AUTH or con un nuevo IAM token de autenticación.

  • IAMlos MULTI EXEC comandos no admiten la autenticación.

  • Actualmente, la IAM autenticación admite las siguientes claves de contexto de condición global:

    • Cuando se utiliza la IAM autenticación con cachés sin servidoraws:VpcSourceIp, se aws:SourceVpc admitenaws:SourceVpce,,aws:CurrentTime,aws:EpochTime, y aws:ResourceTag/%s (desde cachés sin servidor y usuarios asociados).

    • Cuando se utiliza la IAM autenticación con grupos de replicación, aws:SourceIp y aws:ResourceTag/%s (desde los grupos de replicación y los usuarios asociados), son compatibles.

    Para obtener más información sobre las claves de contexto de condición AWS globales, consulte las claves de contexto de condición globales en la Guía del IAM usuario.

Configuración

Para configurar la IAM autenticación:

  1. Creación de una caché

    aws elasticache create-serverless-cache \ --serverless-cache-name cache-01 \ --description "ElastiCache IAM auth application" \ --engine redis
  2. Cree un documento de política de IAM confianza, como se muestra a continuación, para su función, que permita a su cuenta asumir la nueva función. Guarde la política en un archivo denominado trust-policy.json.

    { "Version": "2012-10-17", "Statement": { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::123456789012:root" }, "Action": "sts:AssumeRole" } }
  3. Cree un documento IAM de política, como se muestra a continuación. Guarde la política en un archivo denominado 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" ] } ] }
  4. Cree un IAM rol.

    aws iam create-role \ --role-name "elasticache-iam-auth-app" \ --assume-role-policy-document file://trust-policy.json
  5. Cree la IAM política.

    aws iam create-policy \ --policy-name "elasticache-allow-all" \ --policy-document file://policy.json
  6. Adjunte la IAM política al rol.

    aws iam attach-role-policy \ --role-name "elasticache-iam-auth-app" \ --policy-arn "arn:aws:iam::123456789012:policy/elasticache-allow-all"
  7. Cree un nuevo usuario IAM habilitado.

    aws elasticache create-user \ --user-name iam-user-01 \ --user-id iam-user-01 \ --authentication-mode Type=iam \ --engine redis \ --access-string "on ~* +@all"
  8. Cree un grupo de usuarios y asocie al usuario.

    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

Conexión

Conectar con el token como contraseña

Primero debe generar el token de IAM autenticación de corta duración mediante una solicitud prefirmada de AWS SiGv4. Después, proporciona el token de IAM autenticación como contraseña cuando se conecta a una OSS caché de Valkey o Redis, como se muestra en el siguiente ejemplo.

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 (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();

A continuación, se muestra la definición de 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()); } }

Conectar con el proveedor de credenciales

El siguiente código muestra cómo autenticarse mediante el proveedor de ElastiCache credenciales de IAM autenticación.

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 (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();

A continuación se muestra un ejemplo de un OSS cliente de Lettuce Redis que incluye un proveedor IAMAuthTokenRequest de credenciales para generar automáticamente credenciales temporales cuando sea necesario.

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()); } }