Authentifizierung mit IAM - Amazon ElastiCache

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

Authentifizierung mit IAM

Übersicht

Mit der IAM Authentifizierung können Sie eine Verbindung zu ElastiCache Valkey oder Redis OSS mithilfe von AWS IAM Identitäten authentifizieren, wenn Ihr Cache für die Verwendung von Valkey oder Redis Version 7 oder höher konfiguriert ist. OSS Auf diese Weise können Sie Ihr Sicherheitsmodell stärken und viele administrative Sicherheitsaufgaben vereinfachen. Sie können die IAM Authentifizierung auch verwenden, um eine differenzierte Zugriffskontrolle für jeden einzelnen ElastiCache Cache und jeden einzelnen Benutzer zu konfigurieren, wobei die Prinzipien der geringsten Zugriffsrechte eingehalten werden. ElastiCache IAMDie Authentifizierung ElastiCache mit Valkey oder Redis OSS funktioniert, indem im Befehl Valkey oder Redis oder ein kurzlebiges IAM Authentifizierungstoken anstelle eines langlebigen ElastiCache Benutzerkennworts bereitgestellt wird. OSS AUTH HELLO Weitere Informationen zum IAM Authentifizierungstoken finden Sie im AWS Allgemeinen Referenzhandbuch zum Signaturprozess von Signature Version 4 und im folgenden Codebeispiel.

Sie können IAM Identitäten und die zugehörigen Richtlinien verwenden, um den Zugriff auf Valkey oder OSS Redis weiter einzuschränken. Sie können Benutzern von ihren Federated Identity-Anbietern auch direkten Zugriff auf Valkey- oder Redis-Caches gewähren. OSS

Um AWS IAM mit zu verwenden ElastiCache, müssen Sie zunächst einen ElastiCache Benutzer erstellen, für den der Authentifizierungsmodus auf eingestellt ist. IAM Anschließend können Sie eine IAM Identität erstellen oder wiederverwenden. Für die IAM Identität ist eine zugehörige Richtlinie erforderlich, um dem ElastiCache Cache und dem ElastiCache Benutzer die elasticache:Connect Aktion zu gewähren. Nach der Konfiguration können Sie ein IAM Authentifizierungstoken mit den AWS Anmeldeinformationen des IAM Benutzers oder der Rolle erstellen. Schließlich müssen Sie das kurzlebige IAM Authentifizierungstoken als Passwort in Ihrem Valkey- oder OSS Redis-Client angeben, wenn Sie eine Verbindung zu Ihrem Cache herstellen. Ein Valkey- oder OSS Redis-Client mit Unterstützung für den Anbieter von Anmeldeinformationen kann die temporären Anmeldeinformationen für jede neue Verbindung automatisch generieren. ElastiCache führt die IAM Authentifizierung für Verbindungsanfragen von IAM -aktivierten ElastiCache Benutzern durch und validiert die Verbindungsanfragen mit. IAM

Einschränkungen

Bei der Verwendung der IAM Authentifizierung gelten die folgenden Einschränkungen:

  • IAMDie Authentifizierung ist bei Verwendung ElastiCache mit Valkey 7.2 oder höher und Redis OSS Version 7.0 oder höher verfügbar.

  • Für IAM -aktivierte ElastiCache Benutzer müssen die Eigenschaften Benutzername und Benutzer-ID identisch sein.

  • Das IAM Authentifizierungstoken ist 15 Minuten gültig. Für langlebige Verbindungen empfehlen wir die Verwendung eines Valkey- oder OSS Redis-Clients, der eine Credentials-Provider-Schnittstelle unterstützt.

  • Eine IAM authentifizierte Verbindung zu ElastiCache Valkey oder Redis OSS wird nach 12 Stunden automatisch unterbrochen. Die Verbindung kann um 12 Stunden verlängert werden, indem ein AUTH HELLO OR-Befehl mit einem neuen Authentifizierungstoken gesendet wird. IAM

  • IAMDie Authentifizierung wird in MULTI EXEC Befehlen nicht unterstützt.

  • Derzeit unterstützt die IAM Authentifizierung die folgenden globalen Bedingungskontextschlüssel:

    • Bei Verwendung der IAM Authentifizierung mit serverlosen Caches werdenaws:VpcSourceIp,aws:SourceVpc,aws:SourceVpce, aws:CurrentTimeaws:EpochTime, und aws:ResourceTag/%s (von zugehörigen serverlosen Caches und Benutzern) unterstützt.

    • Bei Verwendung der IAM Authentifizierung mit Replikationsgruppen werden aws:SourceIp und aws:ResourceTag/%s (von zugehörigen Replikationsgruppen und Benutzern) unterstützt.

    Weitere Informationen zu globalen Bedingungskontextschlüsseln finden Sie unter Kontextschlüssel für AWS globale Bedingungen im IAM Benutzerhandbuch.

Aufstellen

So richten Sie die IAM Authentifizierung ein:

  1. Erstellen eines Caches

    aws elasticache create-serverless-cache \ --serverless-cache-name cache-01 \ --description "ElastiCache IAM auth application" \ --engine redis
  2. Erstellen Sie für Ihre Rolle ein Dokument mit IAM Vertrauensrichtlinien, das es Ihrem Konto ermöglicht, die neue Rolle anzunehmen, wie unten dargestellt. Speichern Sie die Richtlinie in einer Datei namens trust-policy.json.

    { "Version": "2012-10-17", "Statement": { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::123456789012:root" }, "Action": "sts:AssumeRole" } }
  3. Erstellen Sie ein IAM Richtliniendokument, wie unten gezeigt. Speichern Sie die Richtlinie in einer Datei namens 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. Erstellen Sie eine IAM Rolle.

    aws iam create-role \ --role-name "elasticache-iam-auth-app" \ --assume-role-policy-document file://trust-policy.json
  5. Erstellen Sie die IAM Richtlinie.

    aws iam create-policy \ --policy-name "elasticache-allow-all" \ --policy-document file://policy.json
  6. Hängen Sie die IAM Richtlinie an die Rolle an.

    aws iam attach-role-policy \ --role-name "elasticache-iam-auth-app" \ --policy-arn "arn:aws:iam::123456789012:policy/elasticache-allow-all"
  7. Erstellen Sie einen neuen IAM -fähigen Benutzer.

    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. Erstellen Sie eine Benutzergruppe und fügen Sie einen Benutzer an.

    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

Herstellen von Verbindungen

Verbinden mit Token als Passwort

Sie müssen zuerst das kurzlebige IAM Authentifizierungstoken mithilfe einer vorsignierten AWS SigV4-Anfrage generieren. Danach geben Sie das IAM Authentifizierungstoken als Passwort an, wenn Sie eine Verbindung zu einem Valkey- oder OSS Redis-Cache herstellen, wie im folgenden Beispiel gezeigt.

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

Im Folgenden finden Sie die Definition für 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()); } }

Verbinden mit Anbieter von Anmeldeinformationen

Der folgende Code zeigt, wie Sie sich ElastiCache mithilfe des IAM Anbieters für Anmeldeinformationen authentifizieren.

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

Im Folgenden finden Sie ein Beispiel für einen Lettuce OSS Redis-Client, der den IAMAuthTokenRequest in einen Anbieter für Anmeldeinformationen einbindet, um bei Bedarf automatisch temporäre Anmeldeinformationen zu generieren.

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