Jika Anda terhubung ke database menggunakan Java Database Connectivity (JDBC), akun dan kata sandi database dapat disimpan dalam rahasia RDS atau rahasia generik. Anda kemudian dapat mengintegrasikan klien JDBC Secrets ke dalam aplikasi untuk mengautentikasi koneksi database menggunakan rahasia yang dikelola di Key Management Service (KMS). Topik ini menjelaskan cara menginstal dan menggunakan klien JDBC Secrets.
Ikhtisar SDK
Klien JDBC Secrets dirancang untuk skenario di mana Anda menggunakan JDBC untuk terhubung ke database. Klien secara otomatis mengambil rahasia dari KMS guna mengautentikasi koneksi database, sehingga menyederhanakan integrasi. Untuk skenario lain yang memerlukan pengambilan dan penggunaan rahasia, kami menyarankan penggunaan klien Secrets. Alternatifnya, Anda dapat menggunakan SDK instans KMS atau Alibaba Cloud SDK. Untuk informasi selengkapnya, lihat Referensi SDK.
Operasi manajemen rahasia hanya dapat dilakukan menggunakan Alibaba Cloud SDK.
Klien JDBC Secrets menyediakan fitur-fitur berikut:
Mendukung JDBC, termasuk koneksi database dalam kolam koneksi seperti c3p0 dan DBCP, serta sumber data.
Mendukung empat jenis database: MySQL, SQL Server, PostgreSQL, dan MariaDB.
Mendukung laju penyegaran rahasia kustom.
Perhatian
Jenis rahasia yang didukung: rahasia generik dan rahasia RDS.
Jika menggunakan rahasia RDS, kami menyarankan penggunaan rahasia RDS terkelola akun ganda.
Jika menggunakan rahasia generik, nilai rahasia harus dalam format JSON berikut.
{ "AccountName":"<nama_pengguna_akun_database_anda>", "AccountPassword":"<kata_sandi_akun_database_anda>" }
Bahasa pemrograman yang didukung: Java 8 atau versi lebih baru.
Kolam koneksi database yang didukung: c3p0, DBCP, dan Druid.
PentingKolam koneksi HikariCP bawaan di Spring Boot tidak menangani kode kesalahan JDBC secara standar, yang dapat menyebabkan kegagalan penyegaran rahasia KMS.
Langkah 1: Buat kredensial akses
Skenario 1: Ambil nilai rahasia menggunakan gateway bersama
Anda dapat menggunakan Internet atau virtual private cloud (VPC). Metode autentikasi berbasis RAM yang didukung mencakup peran RAM instans untuk instans Elastic Compute Service (ECS), RamRoleArn, token Security Token Service (STS), dan AccessKey. Untuk informasi selengkapnya, lihat Kelola kredensial akses.
Peran RAM instans ECS
RamRoleArn
Token STS
AccessKey
ClientKey (tidak disarankan)
Skenario 2: Ambil nilai rahasia menggunakan gateway khusus (tidak disarankan)
Skenario ini menggunakan jaringan pribadi KMS. Hanya ClientKey yang dapat digunakan sebagai kredensial akses.
Langkah 2: Instal klien
Anda dapat menginstal klien JDBC Secrets di proyek Anda menggunakan Maven.
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-secretsmanager-jdbc</artifactId>
<version>x.x.x</version>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId>
<version>4.x.x</version>
</dependency>Kami menyarankan agar Anda menginstal versi terbaru SDK. Untuk informasi selengkapnya tentang instalasi dan kode sumber, kunjungi aliyun-secretsmanager-jdbc.
Langkah 3: Inisialisasi klien menggunakan file konfigurasi secretsmanager.properties
Tambahkan file konfigurasi secretsmanager.properties ke proyek Anda. Parameter yang digunakan bervariasi tergantung pada kredensial akses yang dipilih.
AccessKey
## Jenis kredensial akses.
credentials_type=ak
## ID AccessKey.
credentials_access_key_id=#credentials_access_key_id#
## Rahasia AccessKey.
credentials_access_secret=#credentials_access_secret#
## Wilayah layanan KMS terkait.
cache_client_region_id=[{"regionId":"#regionId#"}]
## Laju penyegaran kustom. Nilai default: 6 jam. Nilai minimum: 5 menit. Satuan: milidetik.
refresh_secret_ttl=21600000RamRoleArn
## Jenis kredensial akses.
credentials_type=ram_role
## ID AccessKey.
credentials_access_key_id=#credentials_access_key_id#
## Rahasia AccessKey.
credentials_access_secret=#credentials_access_secret#
## Nama sesi yang terkait dengan kredensial akses.
credentials_role_session_name=#credentials_role_session_name#
## ARN peran RAM.
credentials_role_arn=#credentials_role_arn#
## Kebijakan untuk kredensial akses.
credentials_policy=#credentials_policy#
## Wilayah layanan KMS terkait.
cache_client_region_id=[{"regionId":"#regionId#"}]
## Laju penyegaran kustom. Nilai default: 6 jam. Nilai minimum: 5 menit. Satuan: milidetik.
refresh_secret_ttl=21600000Peran RAM instans ECS
## Jenis kredensial akses.
credentials_type=ecs_ram_role
## Nama peran RAM ECS.
credentials_role_name=#credentials_role_name#
## Wilayah layanan KMS terkait.
cache_client_region_id=[{"regionId":"#regionId#"}]
## Laju penyegaran kustom. Nilai default: 6 jam. Nilai minimum: 5 menit. Satuan: milidetik.
refresh_secret_ttl=21600000Token STS
## Jenis kredensial akses.
credentials_type=sts
## ID AccessKey.
credentials_access_key_id=#credentials_access_key_id#
## Rahasia AccessKey.
credentials_access_secret=#credentials_access_secret#
## Nama sesi yang terkait dengan kredensial akses.
credentials_role_session_name=#credentials_role_session_name#
## ARN peran RAM.
credentials_role_arn=#credentials_role_arn#
## Kebijakan untuk kredensial akses.
credentials_policy=#credentials_policy#
## Wilayah layanan KMS terkait.
cache_client_region_id=[{"regionId":"#regionId#"}]
## Laju penyegaran kustom. Nilai default: 6 jam. Nilai minimum: 5 menit. Satuan: milidetik.
refresh_secret_ttl=21600000ClientKey (gateway bersama)
## Jenis kredensial akses.
credentials_type=client_key
# Jalur file ClientKey.
client_key_private_key_path=#jalur file kunci privat client key Anda#
## Kata sandi dekripsi ClientKey. Anda dapat membaca kata sandi dari variabel lingkungan atau file.
client_key_password_from_env_variable=#nama variabel lingkungan kata sandi kunci privat client key Anda#
client_key_password_from_file_path=#jalur file kata sandi kunci privat client key Anda#
## Wilayah layanan KMS terkait.
cache_client_region_id=[{"regionId":"#regionId#"}]
## Laju penyegaran kustom. Nilai default: 6 jam. Nilai minimum: 5 menit. Satuan: milidetik.
## Konfigurasi berikut mengatur laju penyegaran rahasia menjadi 1 jam.
refresh_secret_ttl=3600000ClientKey (gateway khusus)
Metode 1: Dapatkan kata sandi client key dari variabel lingkungan
cache_client_dkms_config_info=[{"regionId":"<DKMS_REGION_ID>","endpoint":"<DKMS_ENDPOINT>","passwordFromEnvVariable":"<PASSWORD_ENV_VARIABLE>","clientKeyFile":"<CLIENT_KEY_FILE_PATH>","ignoreSslCerts":false,"caFilePath":"<CA_CERTIFICATE_FILE_PATH>"}]Sebelum mengonfigurasi file, definisikan variabel lingkungan dengan nama kustom dan atur kata sandi client key sebagai nilainya. Kemudian, ganti
<PASSWORD_ENV_VARIABLE>dengan nama variabel Anda.Contoh:
cache_client_dkms_config_info=[{"regionId":"ap-southeast-1","endpoint":"kst-hzz634e67d126u9p9****.cryptoservice.kms.aliyuncs.com","passwordFromEnvVariable":"passwordFromEnvVariable","clientKeyFile":"C:\RamSecretPlugin\src\main\resources\clientKey_KAAP.json","ignoreSslCerts":false,"caFilePath":"C:\RamSecretPlugin\src\main\resources\PrivateKmsCA_kst-hzz634e67d126u9p9****.pem"}]Metode 2: Dapatkan kata sandi client key dari file
Nama file default untuk Client Key Password (ClientKeyPassword) setelah diunduh adalah
clientKey_****_Password.txt. Anda dapat mengganti nama file tersebut, tetapi perlu mengganti<jalur file Client Key Anda>dalam nilai cache_client_dkms_config_info dengan jalur file baru.cache_client_dkms_config_info=[{"regionId":"<regionId dkms Anda >","endpoint":"<endpoint dkms Anda>","passwordFromFilePath":"< jalur file kata sandi Anda >","clientKeyFile":"<jalur file Client Key Anda>","ignoreSslCerts":false,"caFilePath":"<jalur file sertifikat CA Anda>"}]Contoh:
cache_client_dkms_config_info=[{"regionId":"cn-hangzhou","endpoint":"kst-hzz634e67d126u9p9****.cryptoservice.kms.aliyuncs.com","passwordFromFilePath":"C:\RamSecretPlugin\src\main\resources\clientKeyPassword.txt","clientKeyFile":"C:\RamSecretPlugin\src\main\resources\clientKey_KAAP.json","ignoreSslCerts":false,"caFilePath":"C:\RamSecretPlugin\src\main\resources\PrivateKmsCA_kst-hzz634e67d126u9p9****.pem"}]
Langkah 4: Gunakan klien JDBC secrets untuk terhubung ke database
Contoh ini hanya menyediakan properti yang perlu dimodifikasi. Anda dapat mengonfigurasi properti lain sesuai kebutuhan.
Terhubung ke database menggunakan JDBC
Database MySQL
CatatanGanti
#nama-rahasia-mysql-anda#,<ip-mysql-anda>,<port-mysql-anda>, dan<nama-database-anda>dalam kode contoh dengan nama rahasia, alamat IP server, port, dan nama database yang sebenarnya.import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; public class SecretManagerJDBCSample { public static void main(String[] args) throws Exception { // Muat klien JDBC secrets Alibaba Cloud, com.aliyun.kms.secretsmanager.MysqlSecretsManagerSimpleDriver. Class.forName("com.aliyun.kms.secretsmanager.MysqlSecretsManagerSimpleDriver"); Connection connect = null; try { connect = DriverManager.getConnection("secrets-manager:mysql://<ip-mysql-anda>:<port-mysql-anda>/<nama-database-anda>", "#nama-rahasia-mysql-anda#",""); } catch(SQLException e) { e.printStackTrace(); } } }Database SQL Server
CatatanGanti
#nama-rahasia-sqlserver-anda#,<ip-sqlserver-anda>,<port-sqlserver-anda>, dan<nama-database-anda>dalam kode contoh dengan nama rahasia, alamat IP server, port, dan nama database Anda.import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; public class SecretManagerJDBCSqlServerSample { public static void main(String[] args) throws Exception{ // Muat klien JDBC secrets Alibaba Cloud, com.aliyun.kms.secretsmanager.MssqlSecretsManagerSimpleDriver. Class.forName("com.aliyun.kms.secretsmanager.MssqlSecretsManagerSimpleDriver"); Connection connect = null; try { connect = DriverManager.getConnection("secrets-manager:sqlserver://<ip-sqlserver-anda>:<port-sqlserver-anda>;databaseName=<nama-database-anda>", "#nama-rahasia-sqlserver-anda#", ""); } catch (SQLException e) { e.printStackTrace(); } } }Database PostgreSQL
CatatanGanti
#nama-rahasia-postgresql-anda#,<ip-postgresql-anda>,<port-postgresql-anda>, dan<nama-database-anda>dalam kode contoh dengan nama rahasia, alamat IP server, port, dan nama database yang sebenarnya.import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; public class SecretManagerJDBCPostgreSQLSample { public static void main(String[] args) throws Exception { // Muat klien JDBC secrets Alibaba Cloud, com.aliyun.kms.secretsmanager.PostgreSQLSecretManagerSimpleDriver. Class.forName("com.aliyun.kms.secretsmanager.PostgreSQLSecretManagerSimpleDriver"); Connection connect = null; try { connect = DriverManager.getConnection("secrets-manager:postgresql://<ip-postgresql-anda>:<port-postgresql-anda>/<nama-database-anda>", "#nama-rahasia-postgresql-anda#", ""); } catch (SQLException e) { e.printStackTrace(); } } }Database MariaDB
CatatanGanti
#nama-rahasia-mariadb-anda#,<ip-mariadb-anda>,<port-mariadb-anda>, dan<nama-database-anda>dalam kode contoh dengan nama rahasia, alamat IP server, port, dan nama database yang sebenarnya.import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; public class SecretManagerJDBCMarialDBSample { public static void main(String[] args) throws Exception{ // Muat klien JDBC secrets Alibaba Cloud, com.aliyun.kms.secretsmanager.MariaDBSecretManagerSimpleDriver. Class.forName("com.aliyun.kms.secretsmanager.MariaDBSecretManagerSimpleDriver"); Connection connect = null; try { connect = DriverManager.getConnection("secrets-manager:mariadb://<ip-mariadb-anda>:<port-mariadb-anda>/<nama-database-anda>", "#nama-rahasia-mariadb-anda#", ""); } catch (SQLException e) { e.printStackTrace(); } } }
Terhubung ke database menggunakan kolam koneksi
Konfigurasikan c3p0.user, c3p0.driverClass, dan c3p0.jdbcUrl dalam file konfigurasi c3p0.properties. Atur c3p0.user ke nama rahasia dan c3p0.driverClass ke nama kelas driver JDBC Secrets Alibaba Cloud. Nilai c3p0.jdbcUrl harus diawali dengan secrets-manager.
Database MySQL
CatatanGanti
#nama-rahasia-mysql-anda#,<ip-mysql-anda>,<port-mysql-anda>, dan<nama-database-anda>dalam kode contoh dengan nama rahasia, alamat IP server, port, dan nama database yang sebenarnya.c3p0.user=#nama-rahasia-mysql-anda# c3p0.driverClass=com.aliyun.kms.secretsmanager.MysqlSecretsManagerSimpleDriver c3p0.jdbcUrl=secrets-manager:mysql://<ip-mysql-anda>:<port-mysql-anda>/<nama-database-anda>Database SQL Server
CatatanGanti
#nama-rahasia-sqlserver-anda#,<ip-sqlserver-anda>,<port-sqlserver-anda>, dan<nama-database-anda>dalam kode contoh dengan nama rahasia, alamat IP server, port, dan nama database yang sebenarnya.c3p0.user=#nama-rahasia-sqlserver-anda# c3p0.driverClass=com.aliyun.kms.secretsmanager.MysqlSecretsManagerSimpleDriver c3p0.jdbcUrl=secrets-manager:sqlserver://<ip-sqlserver-anda>:<port-sqlserver-anda>/<nama-database-anda>Database PostgreSQL
CatatanGanti
#nama-rahasia-postgresql-anda#,<ip-postgresql-anda>,<port-postgresql-anda>, dan<nama-database-anda>dalam kode contoh dengan nama rahasia, alamat IP server, port, dan nama database yang sebenarnya.c3p0.user=#nama-rahasia-postgresql-anda# c3p0.driverClass=com.aliyun.kms.secretsmanager.MysqlSecretsManagerSimpleDriver c3p0.jdbcUrl=secrets-manager:postgresql://<ip-postgresql-anda>:<port-postgresql-anda>/<nama-database-anda>Database MariaDB
CatatanGanti
#nama-rahasia-mariadb-anda#,<ip-mariadb-anda>,<port-mariadb-anda>, dan<nama-database-anda>dalam kode contoh dengan nama rahasia, alamat IP server, port, dan nama database yang sebenarnya.c3p0.user=#nama-rahasia-mariadb-anda# c3p0.driverClass=com.aliyun.kms.secretsmanager.MysqlSecretsManagerSimpleDriver c3p0.jdbcUrl=secrets-manager:mariadb://<ip-mariadb-anda>:<port-mariadb-anda>/<nama-database-anda>
Terhubung ke database menggunakan sumber data
Contoh ini menggunakan ComboPooledDataSource c3p0 dan database MySQL. Tambahkan konfigurasi berikut ke file konfigurasi Spring.
Ganti #nama-rahasia-mysql-anda#, <ip-mysql-anda>, <port-mysql-anda>, dan <nama-database-anda> dalam kode contoh dengan nama rahasia, alamat IP server, port, dan nama database yang sebenarnya.
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" >
<property name="driverClass" value="com.aliyun.kms.secretsmanager.MysqlSecretsManagerSimpleDriver" />
<property name="user" value="#nama-rahasia-mysql-anda#" />
<property name="jdbcUrl" value="secrets-manager:mysql://<ip-mysql-anda>:<port-mysql-anda>/<nama-database-anda>" />
<property name="maxPoolSize" value="***" />
<property name="minPoolSize" value="***" />
<property name="initialPoolSize" value="***" />
</bean>
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate" >
<property name="dataSource" ref="dataSource" />
</bean>Atur nilai parameter maxPoolSize, minPoolSize, dan initialPoolSize sesuai kebutuhan.
Terhubung ke database menggunakan kolam koneksi Druid
Contoh ini menggunakan database MySQL. Anda harus memodifikasi properti berikut dalam file konfigurasi.
Ganti #nama-rahasia-mysql-anda#, <ip-mysql-anda>, <port-mysql-anda>, dan <nama-database-anda> dalam kode contoh dengan nama rahasia, alamat IP server, port, dan nama database yang sebenarnya.
Menggunakan file konfigurasi properties
username=#nama-rahasia-mysql-anda# driverClassName=com.aliyun.kms.secretsmanager.MysqlSecretsManagerSimpleDriver url=secrets-manager:mysql://<ip-mysql-anda>:<port-mysql-anda>/<nama-database-anda>Menggunakan konfigurasi bean
Metode 1: File konfigurasi XML
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close"> <property name="username" value="${nama-rahasia-mysql-anda}" /> <property name="driverClassName" value="com.aliyun.kms.secretsmanager.MysqlSecretsManagerSimpleDriver" /> <property name="url" value="secrets-manager:mysql://<ip-mysql-anda>:<port-mysql-anda>/<nama-database-anda>" /> </bean>Metode 2: Penyuntikan properti
Buat kelas driver di aplikasi untuk memuat informasi koneksi database.
@Configuration public class DataConfig { @Value("${nama-rahasia-mysql-anda}") private String username; @Value("com.aliyun.kms.secretsmanager.MysqlSecretsManagerSimpleDriver") private String driverClassName; @Value("secrets-manager:mysql://<ip-mysql-anda>:<port-mysql-anda>/<nama-database-anda>") private String url; @Bean(name = "dataSource",initMethod = "init",destroyMethod = "close") public DruidDataSource dataSource(){ DruidDataSource druidDataSource = new DruidDataSource(); druidDataSource.setUsername(username); druidDataSource.setDriverClassName(driverClassName); druidDataSource.setUrl(url); return druidDataSource; } }