全部产品
Search
文档中心

Tair (Redis® OSS-Compatible):Gunakan KMS untuk mengelola rahasia instance

更新时间:Jul 02, 2025

Ketika aplikasi Anda perlu mengakses instance Tair (Redis OSS-compatible), Anda dapat menyimpan kata sandi akun instance tersebut dalam rahasia yang dikelola oleh Key Management Service (KMS). Aplikasi bisnis secara dinamis mengambil kata sandi akun dari KMS dengan mengintegrasikan Alibaba Cloud SDK, KMS SDK, atau secret SDK. Anda juga dapat mengonfigurasi rotasi rahasia untuk mengurangi risiko kebocoran kata sandi akun.

Deskripsi fitur

Ketika Anda mengelola akun database dari instance Tair (Redis OSS-compatible) di KMS, Anda tidak perlu mengonfigurasi akun database statis di aplikasi. Setelah membuat rahasia untuk akun database suatu instance di KMS, aplikasi dapat memanggil operasi GetSecretValue untuk mengambil rahasia guna mengakses instance tersebut.

Sebagai contoh, jika nama rahasia instance yang Anda buat di KMS adalah username, KMS akan membuat akun username dan username_clone pada instance dan menggunakan akun-akun tersebut untuk mengakses instance. Mode dua akun ini memastikan ketersediaan dan keamanan yang lebih tinggi dibandingkan mode satu akun. Anda dapat mengonfigurasi kebijakan rotasi akun di konsol KMS. Secara default, KMS melakukan rotasi akun setiap 24 jam. Akun yang berbeda digunakan untuk masuk ke instance guna meningkatkan keamanan. Untuk informasi lebih lanjut, lihat Kelola dan gunakan rahasia Redis/Tair.

Penting

Jangan modifikasi atau hapus kata sandi akun yang dibuat oleh KMS di konsol Tair (Redis OSS-compatible) untuk mencegah kegagalan layanan.

Batasan

  • Anda tidak dapat mengubah kata sandi akun terkelola yang dibuat oleh KMS di konsol Tair (Redis OSS-compatible). Namun, Anda dapat mengubah kata sandi dengan memutar ulang kata sandi secara manual atau mengonfigurasi kebijakan rotasi otomatis di konsol KMS. Untuk informasi lebih lanjut, lihat Putar rahasia Redis/Tair.

  • Anda tidak dapat menghapus akun terkelola yang dibuat oleh KMS di konsol Tair (Redis OSS-compatible). Untuk menghapus akun terkelola, kunjungi konsol KMS. Untuk informasi lebih lanjut, lihat Hapus rahasia Redis/Tair.

  • Anda tidak dapat memodifikasi deskripsi akun terkelola yang dibuat oleh KMS di konsol Tair (Redis OSS-compatible).

Prasyarat

  • Instance Elastic Compute Service (ECS) telah dibuat untuk terhubung ke instance Tair (Redis OSS-compatible) yang ingin Anda kelola. Dalam contoh ini, sistem operasi instance ECS adalah Alibaba Cloud Linux 3.2104 LTS 64-bit, dan Java 1.8.0 telah diinstal pada instance ECS.

  • Jika Anda menggunakan Resource Access Management (RAM) user atau RAM role untuk mengelola rahasia instance, Anda harus melampirkan kebijakan sistem AliyunKMSSecretAdminAccess ke pengguna atau role tersebut. Untuk informasi lebih lanjut, lihat Berikan izin kepada pengguna RAM.

Prosedur

  1. Beli dan aktifkan instance KMS. Untuk informasi lebih lanjut, lihat Beli dan aktifkan instance KMS.

    Ketika membuat instance KMS, pilih virtual private cloud (VPC) yang sama dengan instance ECS.

    Jika Anda sudah memiliki instance KMS, tambahkan VPC dari instance ECS ke instance KMS. Untuk informasi lebih lanjut, lihat Konfigurasikan akses Multi-VPC ke instance KMS dalam wilayah yang sama.

  2. Buat titik akses aplikasi (AAP). Untuk informasi lebih lanjut, lihat Buat AAP.

    Setelah AAP dibuat, browser secara otomatis mengunduh informasi kunci klien. Informasi kunci klien mencakup content dan password kunci klien. Konten kunci klien disimpan dalam file JSON. Jaga agar informasi tetap rahasia.

  3. Unduh sertifikat Certificate Authority (CA) dari instance KMS di halaman Instances di konsol KMS. Untuk informasi lebih lanjut, lihat Dapatkan sertifikat CA instance.

  4. Buat customer master key (CMK). Untuk informasi lebih lanjut, lihat Memulai dengan kunci.

  5. Buat rahasia untuk instance Tair (Redis OSS-compatible). Untuk informasi lebih lanjut, lihat Buat rahasia Redis/Tair.

  6. Tulis kode uji Java.

    1. Tambahkan dependensi Maven ke proyek Anda. Kemudian, paket Java akan diunduh secara otomatis dari repositori Maven. Anda juga dapat menambahkan bagian <build> berikut untuk mengemas dependensi proyek menjadi satu file JAR.

          <dependencies>
              <dependency>
                  <groupId>redis.clients</groupId>
                  <artifactId>jedis</artifactId>
                  <version>5.1.0</version>
              </dependency>
              <dependency>
                  <groupId>com.aliyun</groupId>
                  <artifactId>alibabacloud-dkms-gcs-sdk</artifactId>
                  <version>0.5.2</version>
              </dependency>
              <dependency>
                  <groupId>com.aliyun</groupId>
                  <artifactId>tea</artifactId>
                  <version>1.2.3</version>
              </dependency>
              <dependency>
                  <groupId>org.slf4j</groupId>
                  <artifactId>slf4j-api</artifactId>
                  <version>1.7.10</version>
              </dependency>
              <dependency>
                  <groupId>ch.qos.logback</groupId>
                  <artifactId>logback-classic</artifactId>
                  <version>1.2.9</version>
              </dependency>
          </dependencies>
      
          <build>
              <plugins>
                  <plugin>
                      <groupId>org.apache.maven.plugins</groupId>
                      <artifactId>maven-assembly-plugin</artifactId>
                      <version>3.3.0</version>
                      <configuration>
                          <archive>
                              <manifest>
                                  <mainClass>
                                      com.aliyun.KMSJedisTest
                                  </mainClass>
                              </manifest>
                          </archive>
                          <descriptorRefs>
                              <descriptorRef>jar-with-dependencies</descriptorRef>
                          </descriptorRefs>
                      </configuration>
                      <executions>
                          <execution>
                              <id>assemble-all</id>
                              <phase>package</phase>
                              <goals>
                                  <goal>single</goal>
                              </goals>
                          </execution>
                      </executions>
                  </plugin>
                  <plugin>
                      <groupId>org.apache.maven.plugins</groupId>
                      <artifactId>maven-compiler-plugin</artifactId>
                      <configuration>
                          <source>1.8</source>
                          <target>1.8</target>
                      </configuration>
                  </plugin>
              </plugins>
          </build>
    2. Tulis kode untuk mengimplementasikan kelas utama KMSJedisTest.java.

      Catatan

      Dalam contoh ini, parameter credentialCacheTime ditambahkan untuk mencegah sistem mengambil kata sandi dari KMS setiap kali koneksi baru dibuat. Nilai default dari parameter credentialCacheTime adalah 600 detik. Selama waktu cache, kata sandi yang di-cache dikembalikan tanpa mengakses KMS. Anda dapat memanggil operasi setCredentialCacheTime untuk menyesuaikan durasi cache. Kami merekomendasikan Anda mengatur durasi cache minimal 10 menit.

      package com.aliyun;
      
      import java.time.Duration;
      
      import redis.clients.jedis.DefaultJedisClientConfig;
      import redis.clients.jedis.HostAndPort;
      import redis.clients.jedis.Jedis;
      import redis.clients.jedis.JedisPool;
      
      public class KMSJedisTest {
          public static void main(String[] args) throws Exception {
              if (args.length < 2) {
                  System.out.println(
                      "Silakan masukkan kmsEndpoint, clientKeyFilePath, clientKeyPass, caCertPath, secretName, redisHost");
                  return;
              }
      
              String endpoint = args[0];
              String clientKeyFilePath = args[1];
              String clientKeyPass = args[2];
              String caCertPath = args[3];
              String secretName = args[4];
              KMSRedisCredentialsProvider kmsRedisCredentialsProvider = new KMSRedisCredentialsProvider(endpoint,
                  clientKeyFilePath, clientKeyPass, caCertPath, secretName);
              kmsRedisCredentialsProvider.setCredentialCacheTime(Duration.ofSeconds(10)); // Tentukan durasi cache untuk mencegah permintaan sering ke KMS.
      
              String redisHost = args[5];
              JedisPool jedisPool = new JedisPool(HostAndPort.from(redisHost),
                  DefaultJedisClientConfig.builder().credentialsProvider(kmsRedisCredentialsProvider).build());
      
              for (int i = 0; i < Integer.MAX_VALUE; i++) {
                  Thread.sleep(1000);
                  try (Jedis jedis = jedisPool.getResource()) {
                      System.out.println(jedis.set("" + i, "" + i));
                      System.out.println(jedis.get("" + i));
                  } catch (Exception e) {
                      System.out.println(e);
                  }
              }
          }
      }
      
    3. Tulis kode untuk mengimplementasikan kelas KMSRedisCredentialsProvider.java.

      package com.aliyun;
      
      import java.time.Duration;
      import java.time.LocalDateTime;
      import java.time.format.DateTimeFormatter;
      
      import org.json.JSONObject;
      import org.slf4j.Logger;
      import org.slf4j.LoggerFactory;
      import redis.clients.jedis.DefaultRedisCredentials;
      import redis.clients.jedis.RedisCredentials;
      import redis.clients.jedis.RedisCredentialsProvider;
      
      import com.aliyun.dkms.gcs.openapi.models.Config;
      import com.aliyun.dkms.gcs.sdk.Client;
      import com.aliyun.dkms.gcs.sdk.models.*;
      
      public class KMSRedisCredentialsProvider implements RedisCredentialsProvider {
          private static final Logger logger = LoggerFactory.getLogger(KMSRedisCredentialsProvider.class);
      
          private final String endpoint;
          private final String clientKeyFilePath;
          private final String clientKeyPass;
          private final String caCertPath;
          private final String secretName;
          private static Client client = null;
      
          // waktu cache kredensial
          private Duration credentialCacheTime = Duration.ofSeconds(600);
          private DefaultRedisCredentials cachedCredentials = null;
          private LocalDateTime credentialsExpiration = null;
      
          public KMSRedisCredentialsProvider(String endpoint, String clientKeyFilePath, String clientKeyPass,
              String caCertPath, String secretName) {
              this.endpoint = endpoint;
              this.clientKeyFilePath = clientKeyFilePath;
              this.clientKeyPass = clientKeyPass;
              this.caCertPath = caCertPath;
              this.secretName = secretName;
              createClientInstance(endpoint, clientKeyFilePath, clientKeyPass, caCertPath);
          }
      
          public void setCredentialCacheTime(Duration credentialCacheTime) {
              this.credentialCacheTime = credentialCacheTime;
          }
      
          private static synchronized void createClientInstance(String endpoint, String clientKeyFilePath,
              String clientKeyPass, String caCertPath) {
              if (client == null) {
                  try {
                      client = new Client(new Config()
                          .setProtocol("https")
                          .setEndpoint(endpoint)
                          .setCaFilePath(caCertPath)
                          .setClientKeyFile(clientKeyFilePath)
                          .setPassword(clientKeyPass));
                  } catch (Exception e) {
                      logger.error("Inisialisasi klien kms gagal", e);
                      throw new RuntimeException(e);
                  }
              }
          }
      
          @Override
          public RedisCredentials get() {
              try {
                  LocalDateTime now = LocalDateTime.now();
                  // Periksa cache
                  if (cachedCredentials != null && now.isBefore(credentialsExpiration)) {
                      return cachedCredentials;
                  }
      
                  GetSecretValueRequest request = new GetSecretValueRequest().setSecretName(secretName);
                  GetSecretValueResponse getSecretValueResponse = client.getSecretValue(request);
                  logger.debug("Sekarang: " + now.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")) +
                      ", getSecretValueRequest: " + request);
                  String secretData = getSecretValueResponse.getSecretData();
                  JSONObject secretObject = new JSONObject(secretData);
                  if (secretObject.get("AccountName") == null || secretObject.get("AccountPassword") == null) {
                      throw new IllegalArgumentException("secretData harus berisi AccountName dan AccountPassword");
                  }
                  cachedCredentials = new DefaultRedisCredentials(secretObject.get("AccountName").toString(),
                      secretObject.get("AccountPassword").toString());
                  credentialsExpiration = now.plusSeconds(credentialCacheTime.getSeconds());
                  return cachedCredentials;
              } catch (Exception e) {
                  logger.error("pengambilan rahasia gagal", e);
                  throw new RuntimeException(e);
              }
          }
      
          @Override
          public void prepare() {
              // tidak melakukan apa pun
          }
      
          @Override
          public void cleanUp() {
              // tidak melakukan apa pun
          }
      }
      
    4. Jalankan perintah mvn package untuk mengemas seluruh proyek menjadi file JAR.

  7. Pada instance ECS, gunakan SDK for Java untuk terhubung ke instance Tair (Redis OSS-compatible).

    Sintaks sampel:

    java -jar <kms-redis-jar-with-dependencies.jar> <kmsEndpoint> <clientKeyFilePath> <clientKeyPass> <caCertPath> <secretName> <redisHost>

    Parameter:

    • kms-redis-jar-with-dependencies.jar: file JAR yang dihasilkan dari proses pengemasan Maven. Pastikan Anda menggunakan file JAR yang memiliki akhiran jar-with-dependencies.

    • kmsEndpoint: titik akhir VPC dari instance KMS. Anda dapat memperoleh titik akhir di halaman detail instance KMS.

    • clientKeyFilePath: jalur ke file kunci klien. Ini adalah file JSON yang diunduh di Langkah 2.

    • clientKeyPass: kata sandi untuk kunci klien. Kata sandi disimpan dalam file TXT yang diunduh di Langkah 2.

    • caCertPath: sertifikat CA dari instance KMS, yaitu file PEM yang diunduh di Langkah 3.

    • secretName: nama rahasia instance yang dibuat di Langkah 5.

    • redisHost: titik akhir VPC dan nomor port dari instance Tair (Redis OSS-compatible), seperti r-bp1g727yrai5yh****.redis.rds.aliyuncs.com:6379.

    Perintah sampel:

    java -jar kms-redis-samples-1.0-SNAPSHOT-jar-with-dependencies.jar kst-hzz6674e7fbw21x9x****.cryptoservice.kms.aliyuncs.com /root/clientKey_KAAP.6432ddc6-f23a-4d78-ac84-****4598206b.json 267d1****1cda4415058e1d72ec49e0a /root/PrivateKmsCA_kst-hzz6674e7fbw21x9x****.pem kms-redis r-bp1g727yrai5yh****.redis.rds.aliyuncs.com:6379

    Keluaran berikut dikembalikan, yang menunjukkan bahwa koneksi telah berhasil dibuat:

    0
    OK
    1
    OK
    2
    OK
    3
    OK
    4
    OK
  8. Putar segera rahasia di konsol KMS. Untuk informasi lebih lanjut, lihat Putar rahasia Redis/Tair.

    Selama pemutaran, KMS menggunakan akun lain (username atau username_clone) untuk mengakses instance Tair (Redis OSS-compatible).

    Jika instance ECS dapat terhubung ke instance Tair (Redis OSS-compatible), fitur rotasi kata sandi bekerja sesuai harapan.

    ...
    30
    OK
    31
    OK
    32
    OK
    33
    OK
  9. Lakukan switchover master-replika atau switchover high-availability (HA) pada instance Tair (Redis OSS-compatible) dan periksa status klien.

    Keluaran berikut dikembalikan, yang menunjukkan bahwa koneksi transien terjadi selama switchover HA, dan instance KMS memperbarui rahasia serta menyambungkan kembali ke instance Tair (Redis OSS-compatible):

    138
    OK
    139
    redis.clients.jedis.exceptions.JedisConnectionException: Unexpected end of stream.
    OK
    142
    OK
    143
    OK

Referensi