Memecahkan masalah rotasi AWS Secrets Manager - AWS Secrets Manager

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

Memecahkan masalah rotasi AWS Secrets Manager

Untuk banyak layanan, Secrets Manager menggunakan fungsi Lambda untuk memutar rahasia. Untuk informasi selengkapnya, lihat Rotasi oleh fungsi Lambda. Fungsi rotasi Lambda berinteraksi dengan database atau layanan rahasianya serta Secrets Manager. Ketika rotasi tidak bekerja seperti yang Anda harapkan, Anda harus terlebih dahulu memeriksa CloudWatch log.

catatan

Beberapa layanan dapat mengelola rahasia untuk Anda, termasuk mengelola rotasi otomatis. Untuk informasi selengkapnya, lihat Rotasi terkelola untuk AWS Secrets Manager rahasia.

Untuk melihat CloudWatch log untuk fungsi Lambda Anda
  1. Buka konsol Secrets Manager di https://console.aws.amazon.com/secretsmanager/.

  2. Pilih rahasia Anda, dan kemudian pada halaman detail, di bawah konfigurasi Rotasi, pilih fungsi rotasi Lambda. Konsol Lambda terbuka.

  3. Pada tab Monitor, pilih Log, lalu pilih Lihat log masuk CloudWatch.

    CloudWatch Konsol membuka dan menampilkan log untuk fungsi Anda.

Tidak ada aktivitas setelah “Menemukan kredensyal dalam variabel lingkungan”

Jika tidak ada aktivitas setelah “Menemukan kredensyal dalam variabel lingkungan”, dan durasi tugas panjang, misalnya batas waktu Lambda default 30000ms, maka fungsi Lambda mungkin habis waktu saat mencoba mencapai titik akhir Secrets Manager.

Fungsi rotasi Lambda Anda harus dapat mengakses titik akhir Secrets Manager. Jika fungsi Lambda Anda dapat mengakses internet, maka Anda dapat menggunakan titik akhir publik. Untuk menemukan titik akhir, lihatAWS Secrets Manager titik akhir.

Jika fungsi Lambda Anda berjalan di VPC yang tidak memiliki akses internet, kami sarankan Anda mengonfigurasi titik akhir pribadi layanan Secrets Manager di dalam. VPC Anda kemudian VPC dapat mencegat permintaan yang ditujukan ke titik akhir regional publik dan mengarahkannya ke titik akhir pribadi. Untuk informasi selengkapnya, lihat VPCtitik akhir ()AWS PrivateLink.

Atau, Anda dapat mengaktifkan fungsi Lambda Anda untuk mengakses titik akhir publik Secrets Manager dengan menambahkan NATgateway atau gateway internet ke AndaVPC, yang memungkinkan lalu lintas dari Anda VPC untuk mencapai titik akhir publik. Ini membuat Anda VPC berisiko lebih besar karena alamat IP untuk gateway dapat diserang dari Internet publik.

Tidak ada aktivitas setelah "createSecret”

Berikut ini adalah masalah yang dapat menyebabkan rotasi berhenti setelahnyacreateSecret:

VPCJaringan ACLs tidak mengizinkan HTTPS lalu lintas masuk dan keluar.

Untuk informasi selengkapnya, lihat Mengontrol lalu lintas ke subnet menggunakan Jaringan ACLs di Panduan VPC Pengguna Amazon.

Konfigurasi batas waktu fungsi Lambda terlalu pendek untuk melakukan tugas.

Untuk informasi selengkapnya, lihat Mengonfigurasi opsi fungsi Lambda di Panduan AWS Lambda Pengembang.

VPCEndpoint Secrets Manager tidak mengizinkan masuknya VPC CIDRs pada grup keamanan yang ditetapkan.

Untuk informasi selengkapnya, lihat Mengontrol lalu lintas ke sumber daya menggunakan grup keamanan di Panduan VPC Pengguna Amazon.

Kebijakan VPC endpoint Secrets Manager tidak mengizinkan Lambda menggunakan VPC endpoint.

Untuk informasi selengkapnya, lihat Menggunakan titik AWS Secrets Manager VPC akhir.

Rahasianya menggunakan rotasi pengguna bergantian, rahasia superuser dikelola oleh AmazonRDS, dan fungsi Lambda tidak dapat mengakses. RDS API

Untuk rotasi pengguna bergantian di mana rahasia superuser dikelola oleh AWS layanan lain, fungsi rotasi Lambda harus dapat memanggil titik akhir layanan untuk mendapatkan informasi koneksi database. Kami menyarankan Anda mengonfigurasi VPC titik akhir untuk layanan database. Untuk informasi selengkapnya, lihat:

Kesalahan: “Akses ke KMS tidak diizinkan”

Jika Anda lihatClientError: An error occurred (AccessDeniedException) when calling the GetSecretValue operation: Access to KMS is not allowed, fungsi rotasi tidak memiliki izin untuk mendekripsi rahasia menggunakan KMS kunci yang digunakan untuk mengenkripsi rahasia. Mungkin ada kondisi dalam kebijakan izin yang membatasi konteks enkripsi ke rahasia tertentu. Untuk informasi tentang izin yang diperlukan, lihatPernyataan kebijakan untuk kunci yang dikelola pelanggan.

Kesalahan: “Kunci hilang dari rahasiaJSON”

Fungsi rotasi Lambda membutuhkan nilai rahasia berada dalam struktur tertentuJSON. Jika Anda melihat kesalahan ini, maka JSON mungkin kehilangan kunci yang coba diakses oleh fungsi rotasi. Untuk informasi tentang JSON struktur untuk setiap jenis rahasia, lihatJSONstruktur AWS Secrets Manager rahasia .

Kesalahan: "setSecret: Tidak dapat masuk ke database”

Berikut ini adalah masalah yang dapat menyebabkan kesalahan ini:

Fungsi rotasi tidak dapat mengakses database.

Jika durasi tugas panjang, misalnya lebih dari 5000 ms, maka fungsi rotasi Lambda mungkin tidak dapat mengakses database melalui jaringan.

Jika database atau layanan Anda berjalan pada EC2 instans Amazon di aVPC, sebaiknya Anda mengonfigurasi fungsi Lambda agar berjalan dalam hal yang sama. VPC Kemudian fungsi rotasi dapat berkomunikasi langsung dengan layanan Anda. Untuk informasi selengkapnya, lihat Mengonfigurasi VPC akses.

Untuk mengizinkan fungsi Lambda mengakses database atau layanan, Anda harus memastikan bahwa grup keamanan yang dilampirkan ke fungsi rotasi Lambda Anda memungkinkan koneksi keluar ke database atau layanan. Anda juga harus memastikan bahwa grup keamanan yang dilampirkan ke database atau layanan Anda mengizinkan koneksi masuk dari fungsi rotasi Lambda.

Kredensi dalam rahasia tidak benar.

Jika durasi tugas pendek, maka fungsi rotasi Lambda mungkin tidak dapat mengautentikasi dengan kredensialnya secara rahasia. Periksa kredensyal dengan masuk secara manual dengan informasi dalam AWSCURRENT dan AWSPREVIOUS versi rahasia menggunakan perintah. AWS CLI get-secret-value

Database digunakan scram-sha-256 untuk mengenkripsi kata sandi.

Jika database Anda adalah Aurora Postgre SQL versi 13 atau yang lebih baru dan digunakan scram-sha-256 untuk mengenkripsi kata sandi, tetapi fungsi rotasi menggunakan libpq versi 9 atau lebih lama yang tidak mendukungscram-sha-256, maka fungsi rotasi tidak dapat terhubung ke database.

Untuk menentukan pengguna database mana yang menggunakan scram-sha-256 enkripsi
Untuk menentukan versi fungsi rotasi libpq Anda yang digunakan
  1. Di komputer berbasis Linux, di konsol Lambda, navigasikan ke fungsi rotasi Anda dan unduh bundel penerapan. Buka kompres file zip ke direktori kerja.

  2. Pada baris perintah, di direktori kerja, jalankan:

    readelf -a libpq.so.5 | grep RUNPATH

  3. Jika Anda melihat stringPostgreSQL-9.4.x, atau versi utama kurang dari 10, maka fungsi rotasi tidak mendukungscram-sha-256.

    • Output untuk fungsi rotasi yang tidak mendukungscram-sha-256:

      0x000000000000001d (RUNPATH) Library runpath: [/local/p4clients/pkgbuild-a1b2c/workspace/build/PostgreSQL/PostgreSQL-9.4.x_client_only.123456.0/AL2_x86_64/DEV.STD.PTHREAD/build/private/tmp/brazil-path/build.libfarm/lib:/local/p4clients/pkgbuild-a1b2c/workspace/src/PostgreSQL/build/private/install/lib]

    • Output untuk fungsi rotasi yang mendukungscram-sha-256:

      0x000000000000001d (RUNPATH) Library runpath: [/local/p4clients/pkgbuild-a1b2c/workspace/build/PostgreSQL/PostgreSQL-10.x_client_only.123456.0/AL2_x86_64/DEV.STD.PTHREAD/build/private/tmp/brazil-path/build.libfarm/lib:/local/p4clients/pkgbuild-a1b2c/workspace/src/PostgreSQL/build/private/install/lib]

catatan

Jika Anda mengatur rotasi rahasia otomatis sebelum 30 Desember 2021, fungsi rotasi Anda menggabungkan versi sebelumnya libpq yang tidak mendukungscram-sha-256. Untuk mendukungscram-sha-256, Anda perlu membuat ulang fungsi rotasi Anda.

Database membutuhkanSSL/TLSakses.

Jika database Anda memerlukan TLS koneksiSSL/, tetapi fungsi rotasi menggunakan koneksi yang tidak terenkripsi, maka fungsi rotasi tidak dapat terhubung ke database. Fungsi rotasi untuk Amazon RDS (kecuali Oracle dan Db2) dan Amazon DocumentDB secara otomatis menggunakan Secure Socket Layer (SSL) atau Transport Layer Security (TLS) untuk terhubung ke database Anda, jika tersedia. Jika tidak, mereka menggunakan koneksi yang tidak terenkripsi.

catatan

Jika Anda mengatur rotasi rahasia otomatis sebelum 20 Desember 2021, fungsi rotasi Anda mungkin didasarkan pada templat sebelumnya yang tidak mendukungSSL/TLS. To support connections that use SSL/TLS, Anda perlu membuat ulang fungsi rotasi Anda.

Untuk menentukan kapan fungsi rotasi Anda dibuat
  1. Di konsol Secrets Manager https://console.aws.amazon.com/secretsmanager/, buka rahasia Anda. Di bagian konfigurasi Rotasi, di bawah fungsi rotasi Lambda, Anda melihat fungsi Lambda, misalnyaARN,. arn:aws:lambda:aws-region:123456789012:function:SecretsManagerMyRotationFunction Salin nama fungsi dari akhirARN, dalam contoh ini SecretsManagerMyRotationFunction .

  2. Di AWS Lambda konsol https://console.aws.amazon.com/lambda/, di bawah Fungsi, tempel nama fungsi Lambda Anda di kotak pencarian, pilih Enter, lalu pilih fungsi Lambda.

  3. Di halaman detail fungsi, pada tab Konfigurasi, di bawah Tag, salin nilai di sebelah kunci aws:cloudformation:stack-name.

  4. Di AWS CloudFormation konsol https://console.aws.amazon.com/cloudformation, di bawah Tumpukan, tempel nilai kunci di kotak pencarian, lalu pilih Enter.

  5. Daftar tumpukan menyaring sehingga hanya tumpukan yang membuat fungsi rotasi Lambda yang muncul. Di kolom Tanggal dibuat, lihat tanggal tumpukan dibuat. Ini adalah tanggal fungsi rotasi Lambda dibuat.

Kesalahan: “Tidak dapat mengimpor modul 'lambda_function'”

Anda mungkin menerima kesalahan ini jika Anda menjalankan fungsi Lambda sebelumnya yang secara otomatis ditingkatkan dari Python 3.7 ke versi Python yang lebih baru. Untuk mengatasi kesalahan, Anda dapat mengubah versi fungsi Lambda kembali ke Python 3.7, dan kemudian. Tingkatkan fungsi rotasi yang ada dari Python 3.7 ke 3.9 Untuk informasi selengkapnya, lihat Mengapa rotasi fungsi Secrets Manager Lambda saya gagal dengan kesalahan “modul pg tidak ditemukan”? di AWS re:post.

Tingkatkan fungsi rotasi yang ada dari Python 3.7 ke 3.9

Beberapa fungsi rotasi yang dibuat sebelum November 2022 menggunakan Python 3.7. The AWS SDK for Python berhenti mendukung Python 3.7 pada Desember 2023. Untuk informasi selengkapnya, lihat Pembaruan kebijakan dukungan Python untuk AWS SDKs dan Alat. Untuk beralih ke fungsi rotasi baru yang menggunakan Python 3.9, Anda dapat menambahkan properti runtime ke fungsi rotasi yang ada atau membuat ulang fungsi rotasi.

Untuk menemukan fungsi rotasi Lambda mana yang menggunakan Python 3.7
  1. Masuk ke AWS Management Console dan buka AWS Lambda konsol di https://console.aws.amazon.com/lambda/.

  2. Dalam daftar Fungsi, filter untukSecretsManager.

  3. Dalam daftar fungsi yang difilter, di bawah Runtime, cari Python 3.7.

Opsi 1: Buat ulang fungsi rotasi menggunakan AWS CloudFormation

Saat Anda menggunakan konsol Secrets Manager untuk mengaktifkan rotasi, Secrets Manager menggunakan AWS CloudFormation untuk membuat sumber daya yang diperlukan, termasuk fungsi rotasi Lambda. Jika Anda menggunakan konsol untuk mengaktifkan rotasi, atau Anda membuat fungsi rotasi menggunakan AWS CloudFormation tumpukan, Anda dapat menggunakan AWS CloudFormation tumpukan yang sama untuk membuat ulang fungsi rotasi dengan nama baru. Fungsi baru menggunakan versi Python yang lebih baru.

Untuk menemukan AWS CloudFormation tumpukan yang menciptakan fungsi rotasi
  • Pada halaman detail fungsi Lambda, pada tab Konfigurasi, pilih Tag. Lihat di ARN sebelah aws:cloudformation:stack-id.

    Nama tumpukan tertanam dalamARN, seperti yang ditunjukkan pada contoh berikut.

    • ARN: arn:aws:cloudformation:us-west-2:408736277230:stack/SecretsManagerRDSMySQLRotationSingleUser5c2-SecretRotationScheduleHostedRotationLambda-3CUDHZMDMBO8/79fc9050-2eef-11ed-80f0-021fb13c0537

    • Nama tumpukan: SecretsManagerRDSMySQLRotationSingleUser5c2-SecretRotationScheduleHostedRotationLambda

Untuk membuat ulang fungsi rotasi ()AWS CloudFormation
  1. Di AWS CloudFormation, cari tumpukan berdasarkan nama, lalu pilih Perbarui.

    Jika kotak dialog muncul merekomendasikan Anda memperbarui tumpukan root, pilih Buka tumpukan root, lalu pilih Perbarui.

  2. Pada halaman Update stack, di bawah Siapkan template, pilih Edit di Application Composer, dan kemudian di bawah Edit template di Application Composer, pilih tombol Edit di Application Composer.

  3. Di Application Composer, lakukan hal berikut:

    1. Dalam kode template, diSecretRotationScheduleHostedRotationLambda, ganti nilai untuk "functionName": "SecretsManagerTestRotationRDS" dengan nama fungsi baru, misalnya diJSON, "functionName": "SecretsManagerTestRotationRDSupdated"

    2. Pilih Perbarui template.

    3. Di kotak AWS CloudFormation dialog Lanjutkan ke, pilih Konfirmasi dan lanjutkan ke AWS CloudFormation.

  4. Lanjutkan melalui alur kerja AWS CloudFormation tumpukan dan kemudian pilih Kirim.

Opsi 2: Perbarui runtime untuk fungsi rotasi yang ada menggunakan AWS CloudFormation

Saat Anda menggunakan konsol Secrets Manager untuk mengaktifkan rotasi, Secrets Manager menggunakan AWS CloudFormation untuk membuat sumber daya yang diperlukan, termasuk fungsi rotasi Lambda. Jika Anda menggunakan konsol untuk mengaktifkan rotasi, atau Anda membuat fungsi rotasi menggunakan AWS CloudFormation tumpukan, Anda dapat menggunakan AWS CloudFormation tumpukan yang sama untuk memperbarui runtime untuk fungsi rotasi.

Untuk menemukan AWS CloudFormation tumpukan yang menciptakan fungsi rotasi
  • Pada halaman detail fungsi Lambda, pada tab Konfigurasi, pilih Tag. Lihat di ARN sebelah aws:cloudformation:stack-id.

    Nama tumpukan tertanam dalamARN, seperti yang ditunjukkan pada contoh berikut.

    • ARN: arn:aws:cloudformation:us-west-2:408736277230:stack/SecretsManagerRDSMySQLRotationSingleUser5c2-SecretRotationScheduleHostedRotationLambda-3CUDHZMDMBO8/79fc9050-2eef-11ed-80f0-021fb13c0537

    • Nama tumpukan: SecretsManagerRDSMySQLRotationSingleUser5c2-SecretRotationScheduleHostedRotationLambda

Untuk memperbarui runtime untuk fungsi rotasi ()AWS CloudFormation
  1. Di AWS CloudFormation, cari tumpukan berdasarkan nama, lalu pilih Perbarui.

    Jika kotak dialog muncul merekomendasikan Anda memperbarui tumpukan root, pilih Buka tumpukan root, lalu pilih Perbarui.

  2. Pada halaman Update stack, di bawah Siapkan template, pilih Edit di Application Composer, dan kemudian di bawah Edit template di Application Composer, pilih tombol Edit di Application Composer.

  3. Di Application Composer, lakukan hal berikut:

    1. Dalam templateJSON, untuk, di bawah SecretRotationScheduleHostedRotationLambdaProperties, di bawahParameters, tambahkan"runtime": "python3.9".

    2. Pilih Perbarui template.

    3. Di kotak AWS CloudFormation dialog Lanjutkan ke, pilih Konfirmasi dan lanjutkan ke AWS CloudFormation.

  4. Lanjutkan melalui alur kerja AWS CloudFormation tumpukan dan kemudian pilih Kirim.

Opsi 3: Untuk AWS CDK pengguna, tingkatkan CDK perpustakaan

Jika Anda menggunakan versi AWS CDK sebelumnya v2.94.0 untuk mengatur rotasi rahasia Anda, Anda dapat memperbarui fungsi Lambda dengan memutakhirkan ke v2.94.0 atau yang lebih baru. Untuk informasi selengkapnya, lihat Panduan Pengembang AWS Cloud Development Kit (AWS CDK) v2.

AWS Lambda rotasi rahasia dengan PutSecretValue gagal

Jika Anda menggunakan peran yang diasumsikan atau rotasi lintas akun dengan Secrets Manager dan Anda menemukan RotationFailed acara AWS CloudTrail dengan pesan: Versi rahasia tertunda VERSION_ID untuk Rahasia tidak SECRET_ARN dibuat oleh LAMBDA_ARN. Lambda Hapus AWSPENDING label pementasan dan mulai ulang rotasi, maka Anda perlu memperbarui fungsi Lambda Anda untuk menggunakan parameter. RotationToken

Perbarui fungsi rotasi Lambda untuk disertakan RotationToken

  1. Unduh kode fungsi Lambda

    • Buka konsol Lambda

    • Di panel navigasi, pilih Fungsi

    • Pilih fungsi rotasi rahasia Lambda Anda untuk nama Fungsi

    • Untuk Download, pilih salah satu Kode fungsi.zip, AWS SAM file, Keduanya

    • Pilih OK untuk menyimpan fungsi pada mesin lokal Anda.

  2. Sunting Lambda_handler

    Sertakan parameter rotation_token dalam langkah create_secret untuk rotasi lintas akun:

    def lambda_handler(event, context): """Secrets Manager Rotation Template This is a template for creating an AWS Secrets Manager rotation lambda Args: event (dict): Lambda dictionary of event parameters. These keys must include the following: - SecretId: The secret ARN or identifier - ClientRequestToken: The ClientRequestToken of the secret version - Step: The rotation step (one of createSecret, setSecret, testSecret, or finishSecret) - RotationToken: the rotation token to put as parameter for PutSecretValue call context (LambdaContext): The Lambda runtime information Raises: ResourceNotFoundException: If the secret with the specified arn and stage does not exist ValueError: If the secret is not properly configured for rotation KeyError: If the event parameters do not contain the expected keys """ arn = event['SecretId'] token = event['ClientRequestToken'] step = event['Step'] # Add the rotation token rotation_token = event['RotationToken'] # Setup the client service_client = boto3.client('secretsmanager', endpoint_url=os.environ['SECRETS_MANAGER_ENDPOINT']) # Make sure the version is staged correctly metadata = service_client.describe_secret(SecretId=arn) if not metadata['RotationEnabled']: logger.error("Secret %s is not enabled for rotation" % arn) raise ValueError("Secret %s is not enabled for rotation" % arn) versions = metadata['VersionIdsToStages'] if token not in versions: logger.error("Secret version %s has no stage for rotation of secret %s." % (token, arn)) raise ValueError("Secret version %s has no stage for rotation of secret %s." % (token, arn)) if "AWSCURRENT" in versions[token]: logger.info("Secret version %s already set as AWSCURRENT for secret %s." % (token, arn)) return elif "AWSPENDING" not in versions[token]: logger.error("Secret version %s not set as AWSPENDING for rotation of secret %s." % (token, arn)) raise ValueError("Secret version %s not set as AWSPENDING for rotation of secret %s." % (token, arn)) # Use rotation_token if step == "createSecret": create_secret(service_client, arn, token, rotation_token) elif step == "setSecret": set_secret(service_client, arn, token) elif step == "testSecret": test_secret(service_client, arn, token) elif step == "finishSecret": finish_secret(service_client, arn, token) else: raise ValueError("Invalid step parameter")
  3. Edit create_secret kode

    Merevisi create_secret fungsi untuk menerima dan menggunakan rotation_token parameter:

    # Add rotation_token to the function def create_secret(service_client, arn, token, rotation_token): """Create the secret This method first checks for the existence of a secret for the passed in token. If one does not exist, it will generate a new secret and put it with the passed in token. Args: service_client (client): The secrets manager service client arn (string): The secret ARN or other identifier token (string): The ClientRequestToken associated with the secret version rotation_token (string): the rotation token to put as parameter for PutSecretValue call Raises: ResourceNotFoundException: If the secret with the specified arn and stage does not exist """ # Make sure the current secret exists service_client.get_secret_value(SecretId=arn, VersionStage="AWSCURRENT") # Now try to get the secret version, if that fails, put a new secret try: service_client.get_secret_value(SecretId=arn, VersionId=token, VersionStage="AWSPENDING") logger.info("createSecret: Successfully retrieved secret for %s." % arn) except service_client.exceptions.ResourceNotFoundException: # Get exclude characters from environment variable exclude_characters = os.environ['EXCLUDE_CHARACTERS'] if 'EXCLUDE_CHARACTERS' in os.environ else '/@"\'\\' # Generate a random password passwd = service_client.get_random_password(ExcludeCharacters=exclude_characters) # Put the secret, using rotation_token service_client.put_secret_value(SecretId=arn, ClientRequestToken=token, SecretString=passwd['RandomPassword'], VersionStages=['AWSPENDING'], RotationToken=rotation_token) logger.info("createSecret: Successfully put secret for ARN %s and version %s." % (arn, token))
  4. Unggah kode fungsi Lambda yang diperbarui

    Setelah memperbarui kode fungsi Lambda Anda, unggah untuk memutar rahasia Anda.