Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.
Kelola kredensil menggunakan AWS Secrets Manager
Durga Prasad Cheepuri, Amazon Web Services
Ringkasan
Pola ini memandu Anda menggunakan AWS Secrets Manager untuk secara dinamis mengambil kredensi database untuk aplikasi Java Spring.
Di masa lalu, ketika Anda membuat aplikasi kustom yang mengambil informasi dari database, Anda biasanya harus menanamkan kredensi (rahasia) untuk mengakses database secara langsung dalam aplikasi. Ketika tiba waktunya untuk memutar kredensil, Anda harus menginvestasikan waktu untuk memperbarui aplikasi untuk menggunakan kredensil baru, dan kemudian mendistribusikan aplikasi yang diperbarui. Jika Anda memiliki beberapa aplikasi yang berbagi kredensil dan Anda melewatkan memperbarui salah satunya, aplikasi akan gagal. Karena risiko ini, banyak pengguna memilih untuk tidak secara teratur memutar kredensialnya, yang secara efektif menggantikan satu risiko dengan risiko lainnya.
Secrets Manager memungkinkan Anda mengganti kredensi hard-code dalam kode Anda (termasuk kata sandi) dengan panggilan API untuk mengambil rahasia secara terprogram. Ini membantu memastikan bahwa rahasia tidak dapat dikompromikan oleh seseorang yang memeriksa kode Anda, karena rahasianya tidak ada. Anda juga dapat mengonfigurasi Secrets Manager untuk memutar rahasia secara otomatis sesuai dengan jadwal yang Anda tentukan. Ini memungkinkan Anda untuk mengganti rahasia jangka panjang dengan rahasia jangka pendek, yang membantu mengurangi risiko kompromi secara signifikan. Untuk informasi selengkapnya, lihat dokumentasi AWS Secrets Manager.
Prasyarat dan batasan
Prasyarat
Akun AWS dengan akses ke Secrets Manager
Aplikasi Java Spring
Arsitektur
Tumpukan teknologi sumber
Aplikasi Java Spring dengan kode yang mengakses database, dengan kredensi DB dikelola dari file application.properties.
Tumpukan teknologi target
Aplikasi Java Spring dengan kode yang mengakses database, dengan kredensi DB dikelola di Secrets Manager. File application.properties menyimpan rahasia ke Secrets Manager.
Integrasi Secrets Manager dengan aplikasi

Alat
Secrets Manager — AWS Secrets Manager adalah layanan AWS yang memudahkan Anda mengelola rahasia. Rahasia dapat berupa kredensial basis data, kata sandi, kunci API pihak ketiga, dan bahkan teks acak. Anda dapat menyimpan dan mengontrol akses ke rahasia ini secara terpusat dengan menggunakan konsol Secrets Manager, antarmuka baris perintah Secrets Manager (CLI), atau Secrets Manager API dan. SDKs
Epik
| Tugas | Deskripsi | Keterampilan yang dibutuhkan |
|---|---|---|
| Simpan kredensil DB sebagai rahasia di Secrets Manager. | Simpan Amazon Relational Database Service (Amazon RDS) atau kredensi DB lainnya sebagai rahasia di Secrets Manager dengan mengikuti langkah-langkah dalam Membuat rahasia dalam dokumentasi Secrets Manager. | Sys Admin |
| Tetapkan izin untuk aplikasi Spring untuk mengakses Secrets Manager. | Tetapkan izin yang sesuai berdasarkan bagaimana aplikasi Java Spring menggunakan Secrets Manager. Untuk mengontrol akses ke rahasia, buat kebijakan berdasarkan informasi yang disediakan dalam dokumentasi Secrets Manager, di bagian Menggunakan kebijakan berbasis identitas (Kebijakan IAM) dan ABAC for Secrets Manager dan Menggunakan kebijakan berbasis sumber daya untuk Secrets Manager. Ikuti langkah-langkah di bagian Mengambil nilai rahasia dalam dokumentasi Secrets Manager. | Sys Admin |
| Tugas | Deskripsi | Keterampilan yang dibutuhkan |
|---|---|---|
| Tambahkan dependensi JAR untuk menggunakan Secrets Manager. | Lihat bagian Informasi tambahan untuk detailnya. | Pengembang Java |
| Tambahkan detail rahasia ke aplikasi Spring. | Perbarui file application.properties dengan nama rahasia, titik akhir, dan Wilayah AWS. Sebagai contoh, lihat bagian Informasi tambahan. | Pengembang Java |
| Perbarui kode pengambilan kredensi DB di Java. | Dalam aplikasi, perbarui kode Java yang mengambil kredensi DB untuk mengambil detail tersebut dari Secrets Manager. Misalnya kode, lihat bagian Informasi tambahan. | Pengembang Java |
Sumber daya terkait
Informasi tambahan
Menambahkan dependensi JAR untuk menggunakan Secrets Manager
Maven:
<groupId>com.amazonaws</groupId> <artifactId>aws-java-sdk-secretsmanager</artifactId> <version>1.11. 355 </version>
Gradle:
compile group: 'com.amazonaws', name: 'aws-java-sdk-secretsmanager', version: '1.11.355'
Memperbarui file application.properties dengan detail rahasianya
spring.aws.secretsmanager.secretName=postgres-local spring.aws.secretsmanager.endpoint=secretsmanager.us-east-1.amazonaws.com spring.aws.secretsmanager.region=us-east-1
Memperbarui kode pengambilan kredensi DB di Java
String secretName = env.getProperty("spring.aws.secretsmanager.secretName"); String endpoints = env.getProperty("spring.aws.secretsmanager.endpoint"); String AWS Region = env.getProperty("spring.aws.secretsmanager.region"); AwsClientBuilder.EndpointConfiguration config = new AwsClientBuilder.EndpointConfiguration(endpoints, AWS Region); AWSSecretsManagerClientBuilder clientBuilder = AWSSecretsManagerClientBuilder.standard(); clientBuilder.setEndpointConfiguration(config); AWSSecretsManager client = clientBuilder.build(); ObjectMapper objectMapper = new ObjectMapper(); JsonNode secretsJson = null; ByteBuffer binarySecretData; GetSecretValueRequest getSecretValueRequest = new GetSecretValueRequest().withSecretId(secretName); GetSecretValueResult getSecretValueResponse = null; try { getSecretValueResponse = client.getSecretValue(getSecretValueRequest); } catch (ResourceNotFoundException e) { log.error("The requested secret " + secretName + " was not found"); } catch (InvalidRequestException e) { log.error("The request was invalid due to: " + e.getMessage()); } catch (InvalidParameterException e) { log.error("The request had invalid params: " + e.getMessage()); } if (getSecretValueResponse == null) { return null; } // Decrypted secret using the associated KMS key // Depending on whether the secret was a string or binary, one of these fields will be populated String secret = getSecretValueResponse.getSecretString(); if (secret != null) { try { secretsJson = objectMapper.readTree(secret); } catch (IOException e) { log.error("Exception while retrieving secret values: " + e.getMessage()); } } else { log.error("The Secret String returned is null"); return null; } String host = secretsJson.get("host").textValue(); String port = secretsJson.get("port").textValue(); String dbname = secretsJson.get("dbname").textValue(); String username = secretsJson.get("username").textValue(); String password = secretsJson.get("password").textValue(); }