Autenticazione con IAM - Amazon ElastiCache

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

Autenticazione con IAM

Panoramica

Con IAM Authentication è possibile autenticare una connessione ElastiCache con Valkey o Redis OSS utilizzando AWS IAM identità, quando la cache è configurata per utilizzare Valkey o Redis versione 7 o successiva. OSS Ciò consente di consolidare il modello di sicurezza e semplificare molte attività di sicurezza amministrative. Puoi anche utilizzare l'IAMautenticazione per configurare un controllo granulare degli accessi per ogni singolo ElastiCache utente e cache, seguendo i principi delle autorizzazioni con privilegi minimi. ElastiCache IAML'autenticazione ElastiCache con Valkey o Redis OSS funziona fornendo un token di IAM autenticazione di breve durata anziché una password utente di lunga durata nel comando Valkey o Redis or. ElastiCache OSS AUTH HELLO Per ulteriori informazioni sul token di IAM autenticazione, consulta il processo di firma di Signature Version 4 nella Guida di riferimento AWS generale e l'esempio di codice riportato di seguito.

È possibile utilizzare IAM le identità e le politiche associate per limitare ulteriormente l'accesso a Valkey o RedisOSS. Puoi anche concedere l'accesso agli utenti dei loro provider di identità federati direttamente alle cache Valkey o Redis. OSS

Per utilizzare AWS IAM con ElastiCache, devi prima creare un ElastiCache utente con la modalità di autenticazione impostata su. IAM È quindi possibile creare o riutilizzare un'IAMidentità. L'IAMidentità necessita di una policy associata per concedere l'elasticache:Connectazione alla ElastiCache cache e ElastiCache all'utente. Una volta configurato, è possibile creare un token di IAM autenticazione utilizzando AWS le credenziali dell'IAMutente o del ruolo. Infine, è necessario fornire il token di IAM autenticazione di breve durata come password nel OSS client Valkey o Redis durante la connessione alla cache. Un OSS client Valkey o Redis con supporto per il provider di credenziali può generare automaticamente le credenziali temporanee per ogni nuova connessione. ElastiCache eseguirà IAM l'autenticazione per le richieste di connessione degli ElastiCache utenti IAM abilitati e convaliderà le richieste di connessione con. IAM

Limitazioni

Quando si utilizza IAM l'autenticazione, si applicano le seguenti limitazioni:

  • IAMl'autenticazione è disponibile quando si utilizza ElastiCache con Valkey 7.2 o versione successiva e Redis OSS versione 7.0 o successiva.

  • Per ElastiCache gli utenti IAM abilitati, le proprietà nome utente e id utente devono essere identiche.

  • Il token di IAM autenticazione è valido per 15 minuti. Per connessioni di lunga durata, consigliamo di utilizzare un OSS client Valkey o Redis che supporti un'interfaccia con un provider di credenziali.

  • Una connessione IAM ElastiCache autenticata a Valkey o Redis OSS verrà automaticamente disconnessa dopo 12 ore. La connessione può essere prolungata per 12 ore inviando un HELLO comando AUTH or con un nuovo token di autenticazione. IAM

  • IAMl'autenticazione non è supportata nei MULTI EXEC comandi.

  • Attualmente, IAM l'autenticazione supporta le seguenti chiavi di contesto delle condizioni globali:

    • Quando si utilizza IAM l'autenticazione con cache serverless,aws:VpcSourceIp,aws:SourceVpc, aws:SourceVpce aws:CurrentTimeaws:EpochTime, e aws:ResourceTag/%s (dalle cache e dagli utenti serverless associati) sono supportati.

    • Quando si utilizza IAM l'autenticazione con i gruppi di replica, aws:SourceIp e aws:ResourceTag/%s (dai gruppi di replica e dagli utenti associati) sono supportati.

    Per ulteriori informazioni sulle chiavi di contesto delle condizioni globali, vedere le chiavi di contesto delle condizioni AWS globali nella Guida per l'IAMutente.

Installazione

Per configurare IAM l'autenticazione:

  1. Crea una cache.

    aws elasticache create-serverless-cache \ --serverless-cache-name cache-01 \ --description "ElastiCache IAM auth application" \ --engine redis
  2. Crea un documento sulla politica di IAM fiducia, come mostrato di seguito, per il tuo ruolo che consenta al tuo account di assumere il nuovo ruolo. Salva la policy in un file denominato trust-policy.json.

    { "Version": "2012-10-17", "Statement": { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::123456789012:root" }, "Action": "sts:AssumeRole" } }
  3. Crea un documento IAM di policy, come illustrato di seguito. Salva la policy in un file denominato 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. Crea un IAM ruolo.

    aws iam create-role \ --role-name "elasticache-iam-auth-app" \ --assume-role-policy-document file://trust-policy.json
  5. Crea la IAM politica.

    aws iam create-policy \ --policy-name "elasticache-allow-all" \ --policy-document file://policy.json
  6. Allega la IAM politica al ruolo.

    aws iam attach-role-policy \ --role-name "elasticache-iam-auth-app" \ --policy-arn "arn:aws:iam::123456789012:policy/elasticache-allow-all"
  7. Crea un nuovo utente IAM abilitato.

    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. Crea un gruppo di utenti e collega l'utente.

    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

Connessione

Connetti con token come password

È innanzitutto necessario generare il token di IAM autenticazione di breve durata utilizzando una richiesta AWS SigV4 prefirmata. Dopodiché fornisci il token di IAM autenticazione come password quando ti connetti a una OSS cache Valkey o Redis, come mostrato nell'esempio seguente.

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

Di seguito è riportata la definizione per 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()); } }

Connetti con provider di credenziali

Il codice seguente mostra come eseguire l'autenticazione ElastiCache utilizzando il provider di credenziali di IAM autenticazione.

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

Di seguito è riportato un esempio di OSS client Lettuce Redis che inserisce un provider di credenziali per IAMAuthTokenRequest generare automaticamente credenziali temporanee quando necessario.

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