Kelola kredensil menggunakan AWS Secrets Manager - AWS Prescriptive Guidance

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

Diagram showing AWS Secrets Manager interaction with an admin, custom app, and personnel database.

Alat

  • Secrets ManagerAWS 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

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