IAM을 사용하는 인증 - Amazon ElastiCache

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

IAM을 사용하는 인증

개요

IAM 인증을 사용하면 캐시가 Valkey 또는 Redis OSS 버전 7 이상을 사용하도록 구성된 경우 자격 증명을 OSS 사용하여 AWS IAM Valkey 또는 Redis ElastiCache 와의 연결을 인증할 수 있습니다. 그러면 보안 모델이 강화되고 여러 보안 관리 작업이 단순화됩니다. 또한 IAM 인증을 사용하여 최소 권한 원칙에 따라 각 개별 ElastiCache 캐시 및 ElastiCache 사용자에 대해 세분화된 액세스 제어를 구성할 수 있습니다. IAM Valkey 또는 Redis를 ElastiCache 사용한 에 대한 인증은 Valkey 또는 Redis OSS AUTH 또는 HELLO 명령에서 수명이 긴 ElastiCache 사용자 암호 대신 수명이 짧은 IAM 인증 토큰을 제공하는 방식으로 OSS 작동합니다. IAM 인증 토큰에 대한 자세한 내용은 AWS 일반 참조 가이드의 서명 버전 4 서명 프로세스와 아래 코드 예제를 참조하세요.

IAM 자격 증명 및 관련 정책을 사용하여 Valkey 또는 Redis OSS 액세스를 추가로 제한할 수 있습니다. 페더레이션 ID 공급자의 사용자에게 Valkey 또는 Redis OSS 캐시에 대한 액세스 권한을 직접 부여할 수도 있습니다.

와 함께 를 사용하려면 AWS IAM ElastiCache먼저 인증 모드가 로 설정된 ElastiCache 사용자를 생성해야 합니다IAM. 그런 다음 IAM 자격 증명을 생성하거나 재사용할 수 있습니다. 자격 IAM 증명은 ElastiCache 캐시 및 ElastiCache 사용자에게 elasticache:Connect 작업을 부여하기 위한 관련 정책이 필요합니다. 구성되면 IAM 사용자 또는 역할의 AWS 자격 증명을 사용하여 IAM 인증 토큰을 생성할 수 있습니다. 마지막으로 캐시에 연결할 때 Valkey 또는 Redis OSS Client에서 수명이 짧은 IAM 인증 토큰을 암호로 제공해야 합니다. 자격 증명 공급자를 지원하는 Valkey 또는 Redis OSS 클라이언트는 새 연결마다 임시 자격 증명을 자동으로 생성할 수 있습니다. ElastiCache 는 IAM활성화된 ElastiCache 사용자의 연결 요청에 대한 IAM 인증을 수행하고 를 사용하여 연결 요청을 검증합니다IAM.

제한 사항

IAM 인증을 사용하는 경우 다음 제한이 적용됩니다.

  • IAM Valkey 7.2 이상 및 Redis OSS 버전 7.0 이상 ElastiCache 에서 를 사용할 때 인증을 사용할 수 있습니다.

  • 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:SourceVpcaws:SourceVpce, aws:CurrentTime, aws:EpochTime, 및 aws:ResourceTag/%s (관련 서버리스 캐시 및 사용자)가 지원됩니다.

    • 복제 그룹 aws:SourceIpaws:ResourceTag/%s (연결된 복제 그룹 및 사용자의)에서 IAM 인증을 사용하는 경우 지원됩니다.

    전역 조건 컨텍스트 키에 대한 자세한 내용은 IAM 사용 설명서의 AWS 전역 조건 컨텍스트 키를 참조하세요.

설정

IAM 인증을 설정하려면:

  1. 캐시 생성

    aws elasticache create-serverless-cache \ --serverless-cache-name cache-01 \ --description "ElastiCache IAM auth application" \ --engine redis
  2. 계정이 새 역할을 수임할 수 있도록 아래에 표시된 대로 역할에 대한 IAM 신뢰 정책 문서를 생성합니다. 정책을 trust-policy.json 파일에 저장합니다.

    { "Version": "2012-10-17", "Statement": { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::123456789012:root" }, "Action": "sts:AssumeRole" } }
  3. 아래와 같이 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" ] } ] }
  4. IAM 역할을 생성합니다.

    aws iam create-role \ --role-name "elasticache-iam-auth-app" \ --assume-role-policy-document file://trust-policy.json
  5. IAM 정책을 생성합니다.

    aws iam create-policy \ --policy-name "elasticache-allow-all" \ --policy-document file://policy.json
  6. IAM 정책을 역할에 연결합니다.

    aws iam attach-role-policy \ --role-name "elasticache-iam-auth-app" \ --policy-arn "arn:aws:iam::123456789012:policy/elasticache-allow-all"
  7. 새 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"
  8. 사용자 그룹을 생성하고 사용자를 연결합니다.

    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

Connecting

토큰을 암호로 연결

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