Autenticação com IAM - Amazon ElastiCache

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

Autenticação com IAM

Visão geral

Com a IAM Autenticação, você pode autenticar uma conexão ElastiCache com Valkey ou Redis OSS usando AWS IAM identidades, quando seu cache estiver configurado para usar Valkey ou OSS Redis versão 7 ou superior. Isso possibilita que você fortaleça seu modelo de segurança e simplifique várias tarefas administrativas de segurança. Você também pode usar a IAM Autenticação para configurar um controle de acesso refinado para cada ElastiCache cache e ElastiCache usuário individual, seguindo os princípios de permissões de privilégio mínimo. IAMA autenticação ElastiCache com Valkey ou Redis OSS funciona fornecendo um token de IAM autenticação de curta duração em vez de uma senha de ElastiCache usuário de longa duração no comando Valkey ou Redis ou. OSS AUTH HELLO Para obter mais informações sobre o token de IAM autenticação, consulte o processo de assinatura do Signature Versão 4 no Guia de Referência AWS Geral e no exemplo de código abaixo.

Você pode usar IAM identidades e suas políticas associadas para restringir ainda mais o acesso ao Valkey ou ao RedisOSS. Você também pode conceder acesso aos usuários de seus provedores de identidade federados diretamente aos caches Valkey ou RedisOSS.

Para usar AWS IAM com ElastiCache, primeiro você precisa criar um ElastiCache usuário com o modo de autenticação definido comoIAM. Em seguida, você pode criar ou reutilizar uma IAM identidade. A IAM identidade precisa de uma política associada para conceder a elasticache:Connect ação ao ElastiCache cache e ao ElastiCache usuário. Depois de configurado, você pode criar um token de IAM autenticação usando AWS as credenciais do IAM usuário ou da função. Finalmente, você precisa fornecer o token de IAM autenticação de curta duração como uma senha em seu Valkey ou Redis OSS Client ao se conectar ao seu cache. Um OSS cliente Valkey ou Redis com suporte para provedor de credenciais pode gerar automaticamente as credenciais temporárias para cada nova conexão. ElastiCache realizará a IAM autenticação para solicitações de conexão de ElastiCache usuários IAM habilitados e validará as solicitações de conexão com. IAM

Limitações

Ao usar a IAM autenticação, as seguintes limitações se aplicam:

  • IAMa autenticação está disponível ao ser usada ElastiCache com o Valkey 7.2 ou superior e o Redis OSS versão 7.0 ou superior.

  • Para ElastiCache usuários IAM habilitados, as propriedades de nome de usuário e ID de usuário devem ser idênticas.

  • O token de IAM autenticação é válido por 15 minutos. Para conexões de longa duração, recomendamos usar um OSS cliente Valkey ou Redis que ofereça suporte a uma interface de provedor de credenciais.

  • Uma conexão IAM autenticada ElastiCache com Valkey ou Redis OSS será automaticamente desconectada após 12 horas. A conexão pode ser prolongada por 12 horas enviando um HELLO comando AUTH or com um novo token de IAM autenticação.

  • IAMa autenticação não é suportada nos MULTI EXEC comandos.

  • Atualmente, a IAM autenticação suporta as seguintes chaves de contexto de condição global:

    • Ao usar a IAM autenticação com caches sem servidor,,,aws:VpcSourceIp, aws:SourceVpc aws:SourceVpce aws:CurrentTimeaws:EpochTime, e aws:ResourceTag/%s (de caches e usuários sem servidor associados) são suportados.

    • Ao usar a IAM autenticação com grupos de replicação, aws:SourceIp e aws:ResourceTag/%s (de grupos de replicação e usuários associados) são suportados.

    Para obter mais informações sobre chaves de contexto de condição AWS global, consulte chaves de contexto de condição global no Guia IAM do usuário.

Configuração

Para configurar a IAM autenticação:

  1. Criar um cache

    aws elasticache create-serverless-cache \ --serverless-cache-name cache-01 \ --description "ElastiCache IAM auth application" \ --engine redis
  2. Crie um documento de política de IAM confiança, conforme mostrado abaixo, para sua função, que permita que sua conta assuma a nova função. Salve a política em um arquivo chamado trust-policy.json.

    { "Version": "2012-10-17", "Statement": { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::123456789012:root" }, "Action": "sts:AssumeRole" } }
  3. Crie um documento IAM de política, conforme mostrado abaixo. Salve a política em um arquivo chamado 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. Crie uma IAM função.

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

    aws iam create-policy \ --policy-name "elasticache-allow-all" \ --policy-document file://policy.json
  6. Anexe a IAM política à função.

    aws iam attach-role-policy \ --role-name "elasticache-iam-auth-app" \ --policy-arn "arn:aws:iam::123456789012:policy/elasticache-allow-all"
  7. Crie um novo usuário 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. Crie um grupo de usuários e anexe o usuário.

    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

Conexão

Conectar com token como senha

Primeiro, você precisa gerar o token de IAM autenticação de curta duração usando uma solicitação AWS pré-assinada SigV4. Depois disso, você fornece o token de IAM autenticação como senha ao se conectar a um OSS cache Valkey ou Redis, conforme mostrado no exemplo abaixo.

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

Veja abaixo a definição 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 com o provedor de credenciais

O código abaixo mostra como se autenticar ElastiCache usando o provedor de credenciais de IAM autenticação.

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

Abaixo está um exemplo de um OSS cliente Lettuce Redis que envolve um provedor de credenciais para IAMAuthTokenRequest gerar automaticamente credenciais temporárias quando necessário.

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