Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.
Autentikasi dengan IAM
Gambaran umum
Dengan Otentikasi IAM Anda dapat mengotentikasi koneksi ElastiCache untuk Valkey atau Redis OSS menggunakan identitas AWS IAM, ketika cache Anda dikonfigurasi untuk menggunakan Valkey atau Redis OSS versi 7 atau lebih tinggi. Hal ini memungkinkan Anda memperkuat model keamanan Anda dan menyederhanakan banyak tugas keamanan administratif. Anda juga dapat menggunakan Otentikasi IAM untuk mengonfigurasi kontrol akses halus untuk setiap ElastiCache cache dan ElastiCache pengguna individu, mengikuti prinsip izin hak istimewa terkecil. Otentikasi IAM ElastiCache berfungsi dengan menyediakan token otentikasi IAM berumur pendek alih-alih kata sandi ElastiCache pengguna yang berumur panjang di Valkey atau Redis OSS atau perintah. AUTH HELLO Untuk informasi selengkapnya tentang token otentikasi IAM, lihat proses penandatanganan Signature Version 4 di Panduan Refer AWS ensi Umum dan contoh kode di bawah ini.
Anda dapat menggunakan identitas IAM dan kebijakan terkait untuk lebih membatasi akses Valkey atau Redis OSS. Anda juga dapat memberikan akses kepada pengguna dari penyedia Identitas federasi mereka langsung ke cache Valkey atau Redis OSS.
Untuk menggunakan AWS IAM ElastiCache, Anda harus terlebih dahulu membuat ElastiCache pengguna dengan mode otentikasi disetel ke IAM. Kemudian Anda dapat membuat atau menggunakan kembali identitas IAM. Identitas IAM memerlukan kebijakan terkait untuk memberikan elasticache:Connect tindakan ke ElastiCache cache dan ElastiCache pengguna. Setelah dikonfigurasi, Anda dapat membuat token otentikasi IAM menggunakan AWS kredensional pengguna atau peran IAM. Akhirnya Anda perlu memberikan token otentikasi IAM berumur pendek sebagai kata sandi di Klien Valkey atau Redis OSS Anda saat menghubungkan ke cache Anda. Klien Valkey atau Redis OSS dengan dukungan untuk penyedia kredenSIAL dapat secara otomatis menghasilkan kredenSIAL sementara secara otomatis untuk setiap koneksi baru. ElastiCache akan melakukan otentikasi IAM untuk permintaan koneksi IAM-enabled ElastiCache pengguna dan akan memvalidasi permintaan koneksi dengan IAM.
Batasan
Saat menggunakan autentikasi IAM, batasan berikut berlaku:
Otentikasi IAM tersedia saat menggunakan ElastiCache untuk Valkey 7.2 dan lebih tinggi atau Redis OSS versi 7.0 ke atas.
Otentikasi IAM memerlukan enkripsi dalam transit (TLS) untuk diaktifkan pada cache Anda. Untuk informasi selengkapnya, lihat ElastiCache enkripsi dalam transit (TLS).
Untuk IAM-enabled ElastiCache pengguna properti username dan user id harus identik.
Token autentikasi IAM berlaku selama 15 menit. Jika koneksi diautentikasi ulang dengan token kedaluwarsa, permintaan otentikasi akan ditolak. Untuk koneksi berumur panjang, sebaiknya gunakan klien Valkey atau Redis OSS yang mendukung antarmuka penyedia kredenSIAL untuk secara otomatis menghasilkan token baru sebelum kedaluwarsa.
Koneksi yang diautentikasi IAM ElastiCache untuk Valkey atau Redis OSS akan secara otomatis terputus setelah 12 jam. Koneksi dapat diperpanjang selama 12 jam dengan mengirim perintah
AUTHatauHELLOdengan token autentikasi IAM baru.Otentikasi ulang IAM (
AUTHatauHELLOperintah) tidak didukung di dalam blok skripMULTI/EXECatau Lua. Namun, Anda dapat menjalankan perintah data reguler di dalamEXECblokMULTI/pada IAM-authenticated koneksi.Saat ini, autentikasi IAM mendukung kunci konteks kondisi global berikut ini:
Saat menggunakan autentikasi IAM dengan cache nirserver,
aws:VpcSourceIp,aws:SourceVpc,aws:SourceVpce,aws:CurrentTime,aws:EpochTime, danaws:ResourceTag/%s(dari cache nirserver dan pengguna terkait) didukung.Saat menggunakan autentikasi IAM dengan grup replikasi,
aws:SourceIpdanaws:ResourceTag/%s(dari grup replikasi dan pengguna terkait) didukung.
Untuk informasi selengkapnya tentang kunci konteks kondisi global, lihat Kunci konteks kondisi global AWS dalam Panduan Pengguna IAM.
catatan
Nama cache dikonversi menjadi huruf kecil pada waktu pembuatan cache. Pastikan kode otentikasi memasok nama cache dalam huruf kecil untuk menghindari kesalahan otentikasi.
Pengaturan
Untuk mengatur autentikasi IAM:
Buat cache
aws elasticache create-serverless-cache \ --serverless-cache-name cache-01 \ --description "ElastiCache IAM auth application" \ --engine redisBuat dokumen kebijakan kepercayaan IAM, seperti yang ditunjukkan di bawah ini, untuk peran Anda yang memungkinkan akun Anda mengambil peran baru. Simpan kebijakan ini ke file bernama trust-policy.json.
Buat dokumen kebijakan IAM, seperti yang ditunjukkan di bawah ini. Simpan kebijakan ke file bernama policy.json.
Buat peran IAM.
aws iam create-role \ --role-name "elasticache-iam-auth-app" \ --assume-role-policy-document file://trust-policy.jsonBuat kebijakan IAM.
aws iam create-policy \ --policy-name "elasticache-allow-all" \ --policy-document file://policy.jsonLampirkan kebijakan IAM ke peran tersebut.
aws iam attach-role-policy \ --role-name "elasticache-iam-auth-app" \ --policy-arn "arn:aws:iam::123456789012:policy/elasticache-allow-all"Buat IAM-enabled pengguna baru.
aws elasticache create-user \ --user-name iam-user-01 \ --user-id iam-user-01 \ --authentication-mode Type=iam \ --engine redis \ --access-string "on ~* +@all"Buat grup pengguna dan lampirkan pengguna.
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
Terhubung
Terhubung dengan token sebagai kata sandi
Pertama-tama, Anda harus membuat token autentikasi IAM berumur pendek menggunakan permintaan AWS SigV4 yang telah ditandatangani sebelumnya. Setelah itu Anda memberikan token otentikasi IAM sebagai kata sandi saat menghubungkan ke cache Valkey atau Redis OSS, seperti yang ditunjukkan pada contoh di bawah ini.
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 = DefaultCredentialsProvider.create(); // 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 with Redis OSS. IAMAuthTokenRequest iamAuthTokenRequest = new IAMAuthTokenRequest(userId, cacheName, region, isServerless); String iamAuthToken = iamAuthTokenRequest.toSignedRequestUri(awsCredentialsProvider.resolveCredentials()); // 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 bawah ini adalah definisi untuk IAMAuthTokenRequest.
public class IAMAuthTokenRequest { private static final SdkHttpMethod REQUEST_METHOD = SdkHttpMethod.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 Duration TOKEN_EXPIRY_DURATION = Duration.ofSeconds(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) { SdkHttpFullRequest request = getSignableRequest(); SdkHttpFullRequest signedRequest = sign(request, credentials); return signedRequest.getUri().toString().replace(REQUEST_PROTOCOL, ""); } private SdkHttpFullRequest getSignableRequest() { SdkHttpFullRequest.Builder builder = SdkHttpFullRequest.builder() .method(REQUEST_METHOD) .uri(getRequestUri()) .appendRawQueryParameter(PARAM_ACTION, ACTION_NAME) .appendRawQueryParameter(PARAM_USER, userId); if (isServerless) { builder.appendRawQueryParameter(PARAM_RESOURCE_TYPE, RESOURCE_TYPE_SERVERLESS_CACHE); } return builder.build(); } private URI getRequestUri() { return URI.create(String.format("%s%s/", REQUEST_PROTOCOL, cacheName)); } private SdkHttpFullRequest sign(SdkHttpFullRequest request, AwsCredentials credentials) { AwsV4HttpSigner signer = AwsV4HttpSigner.create(); SignedRequest signedRequest = signer.sign(r -> r.identity(credentials) .request(request) .putProperty(AwsV4HttpSigner.SERVICE_SIGNING_NAME, SERVICE_NAME) .putProperty(AwsV4HttpSigner.REGION_NAME, region) .putProperty(AwsV4HttpSigner.AUTH_LOCATION, AwsV4HttpSigner.AuthLocation.QUERY_STRING) .putProperty(AwsV4HttpSigner.EXPIRATION_DURATION, TOKEN_EXPIRY_DURATION) .build() ); return (SdkHttpFullRequest) signedRequest.request(); } }
Terhubung dengan penyedia kredensial
Kode di bawah ini menunjukkan cara mengotentikasi dengan ElastiCache menggunakan penyedia kredentif otentikasi 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 = DefaultCredentialsProvider.create(); // Create an IAM authentication token request. Once this request is signed it can be used as an // IAM authentication token for ElastiCache with 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 bawah ini adalah contoh klien Lettuce Redis OSS yang membungkus penyedia kredenSIAL untuk menghasilkan kredenSIAL sementara secara otomatis bila diperlukan. IAMAuthTokenRequest
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.userId = userId; 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.resolveCredentials()); } }