Mengotomatiskan rotasi rahasia untuk sumber daya yang menggunakan satu set kredensial autentikasi

Cara terbaik untuk mengautentikasi ke layanan Azure adalah dengan identitas terkelola, tetapi beberapa skenario memerlukan kunci akses, kata sandi, atau rahasia lainnya. Putar rahasia tersebut secara teratur untuk mengurangi dampak kredensial yang bocor.

Tutorial ini menunjukkan cara mengotomatiskan rotasi rahasia berkala untuk database dan layanan yang menggunakan satu set kredensial autentikasi. Untuk gambaran umum autorotasi di berbagai jenis aset, lihat Memahami autorotasi dalam Azure Key Vault.

Secara khusus, tutorial ini memutar kata sandi SQL Server yang disimpan di Azure Key Vault, dengan menggunakan fungsi yang dipicu oleh pemberitahuan Azure Event Grid:

Tip

Untuk Azure SQL Database dan Azure SQL Managed Instance, lebih suka autentikasi khusus Microsoft Entra daripada login SQL. Gunakan pola rotasi kata sandi dalam tutorial ini hanya ketika beban kerja memerlukan autentikasi SQL.

Diagram solusi rotasi

  1. Tiga puluh hari sebelum tanggal kedaluwarsa rahasia, Key Vault menerbitkan peristiwa "mendekati kedaluwarsa" ke Event Grid.
  2. Event Grid memeriksa langganan acara dan menggunakan HTTP POST untuk memanggil endpoint aplikasi fungsi yang berlangganan terhadap acara tersebut.
  3. Aplikasi fungsi menerima informasi rahasia, menghasilkan kata sandi acak baru, dan membuat versi baru untuk rahasia dengan kata sandi baru di Key Vault.
  4. Aplikasi fungsi memperbarui SQL Server dengan kata sandi baru.

Nota

Mungkin ada jeda antara langkah 3 dan 4. Selama periode tersebut, secret di Key Vault tidak dapat digunakan untuk mengautentikasi ke SQL Server. Jika ada langkah yang gagal, Event Grid akan mencoba kembali selama dua jam.

Prasyarat

Jika Anda belum memiliki Key Vault dan instans SQL Server, gunakan tautan deployment ini:

Image memperlihatkan tombol berlabel

  1. Di bawah Grup sumber daya, pilih Buat baru, dan beri nama grup. Tutorial ini menggunakan akvrotation.
  2. Di bawah Masuk Admin SQL, masukkan nama masuk administrator SQL.
  3. Pilih Tinjau + kreasikan.
  4. Pilih Buat.

Membuat grup sumber daya

Anda sekarang memiliki sebuah Key Vault dan sebuah instans SQL Server. Verifikasi penyiapan ini di Azure CLI:

az resource list -o table -g akvrotation

Hasilnya terlihat mirip dengan output berikut:

Name                     ResourceGroup         Location    Type                               Status
-----------------------  --------------------  ----------  ---------------------------------  --------
akvrotation-kv           akvrotation      eastus      Microsoft.KeyVault/vaults
akvrotation-sql          akvrotation      eastus      Microsoft.Sql/servers
akvrotation-sql/master   akvrotation      eastus      Microsoft.Sql/servers/databases
akvrotation-sql2         akvrotation      eastus      Microsoft.Sql/servers
akvrotation-sql2/master  akvrotation      eastus      Microsoft.Sql/servers/databases

Membuat dan menyebarkan fungsi rotasi kata sandi SQL Server

Penting

Templat ini memerlukan brankas kunci, instans SQL Server, dan aplikasi fungsi berada dalam grup sumber daya yang sama.

Selanjutnya, buat aplikasi fungsi dengan identitas terkelola yang ditetapkan sistem bersama dengan komponen lain yang diperlukan, dan sebarkan fungsi rotasi kata sandi SQL Server.

Aplikasi fungsi memerlukan komponen-komponen ini:

  • Paket Azure App Service.
  • Aplikasi fungsi yang dilengkapi dengan fungsi rotasi kata sandi SQL yang memiliki pemicu Event Grid serta pemicu HTTP.
  • Akun penyimpanan untuk pengelolaan pemicu aplikasi fungsi.
  • Penetapan peran Azure yang memungkinkan identitas aplikasi fungsi mengakses rahasia di Key Vault.
  • Subskripsi acara Event Grid untuk acara SecretNearExpiry.
  1. Pilih tautan penyebaran templat Azure:

    Image memperlihatkan tombol berlabel

  2. Di daftar Grup sumber daya, pilih akvrotation.

  3. Di Nama SQL Server, masukkan nama instans SQL Server yang kata sandinya ingin Anda putar.

  4. Di Nama Key Vault, masukkan nama key vault.

  5. Di Nama Aplikasi Fungsi, masukkan nama aplikasi fungsi.

  6. Di Nama Rahasia, masukkan nama rahasia yang menyimpan kata sandi.

  7. Di URL Repositori, masukkan lokasi GitHub kode fungsi: https://github.com/Azure-Samples/KeyVault-Rotation-SQLPassword-Csharp.git.

  8. Pilih Tinjau + kreasikan.

  9. Pilih Buat.

Nota

Templat ARM ini menggunakan penyebaran kontrol sumber App Service (Kudu) untuk menarik kode fungsi dari GitHub. Untuk beban kerja produksi, kami menyarankan penerapan berbasis paket seperti func azure functionapp publish atau zip deploy dengan WEBSITE_RUN_FROM_PACKAGE sebagai gantinya.

Pilih Tinjau+buat

Setelah menyelesaikan langkah-langkah sebelumnya, Anda memiliki akun penyimpanan, farm server, dan aplikasi fungsi. Verifikasi penyiapan ini di Azure CLI:

az resource list -o table -g akvrotation

Hasilnya terlihat mirip dengan output berikut:

Name                     ResourceGroup         Location    Type                               Status
-----------------------  --------------------  ----------  ---------------------------------  --------
akvrotation-kv           akvrotation       eastus      Microsoft.KeyVault/vaults
akvrotation-sql          akvrotation       eastus      Microsoft.Sql/servers
akvrotation-sql/master   akvrotation       eastus      Microsoft.Sql/servers/databases
cfogyydrufs5wazfunctions akvrotation       eastus      Microsoft.Storage/storageAccounts
akvrotation-fnapp        akvrotation       eastus      Microsoft.Web/serverFarms
akvrotation-fnapp        akvrotation       eastus      Microsoft.Web/sites
akvrotation-fnapp        akvrotation       eastus      Microsoft.insights/components

Untuk informasi selengkapnya tentang membuat aplikasi fungsi dan menggunakan identitas terkelola untuk mengakses Key Vault, lihat Membuat aplikasi fungsi dari portal Azure, Cara menggunakan identitas terkelola untuk App Service dan Azure Functions, dan Menyediakan akses ke Key Vault dengan Azure RBAC.

Nota

Fungsi sampel menargetkan model .NET dalam proses untuk Azure Functions. Untuk pengembangan baru, gunakan model pekerja terisolasi .NET, yang merupakan model yang didukung ke depannya.

Fungsi rotasi

Fungsi yang disebarkan pada langkah sebelumnya menggunakan peristiwa untuk memicu rotasi rahasia. Ini memperbarui Key Vault dan database SQL.

Peristiwa pemicu fungsi

Fungsi ini membaca data peristiwa dan menjalankan logika rotasi:

public static class SimpleRotationEventHandler
{
   [FunctionName("AKVSQLRotation")]
   public static void Run([EventGridTrigger]EventGridEvent eventGridEvent, ILogger log)
   {
      log.LogInformation("C# Event trigger function processed a request.");
      var secretName = eventGridEvent.Subject;
      var secretVersion = Regex.Match(eventGridEvent.Data.ToString(), "Version\":\"([a-z0-9]*)").Groups[1].ToString();
      var keyVaultName = Regex.Match(eventGridEvent.Topic, ".vaults.(.*)").Groups[1].ToString();
      log.LogInformation($"Key Vault Name: {keyVaultName}");
      log.LogInformation($"Secret Name: {secretName}");
      log.LogInformation($"Secret Version: {secretVersion}");

      SecretRotator.RotateSecret(log, secretName, keyVaultName);
   }
}

Logika rotasi rahasia

Metode rotasi ini membaca informasi database dari elemen rahasia, membuat versi baru elemen rahasia, dan memperbarui database dengan elemen rahasia yang baru.

    public class SecretRotator
    {
		private const string CredentialIdTag = "CredentialId";
		private const string ProviderAddressTag = "ProviderAddress";
		private const string ValidityPeriodDaysTag = "ValidityPeriodDays";

		public static void RotateSecret(ILogger log, string secretName, string keyVaultName)
        {
            //Retrieve Current Secret
            var kvUri = "https://" + keyVaultName + ".vault.azure.net";
            var client = new SecretClient(new Uri(kvUri), new DefaultAzureCredential());
            KeyVaultSecret secret = client.GetSecret(secretName);
            log.LogInformation("Secret Info Retrieved");

            //Retrieve Secret Info
            var credentialId = secret.Properties.Tags.ContainsKey(CredentialIdTag) ? secret.Properties.Tags[CredentialIdTag] : "";
            var providerAddress = secret.Properties.Tags.ContainsKey(ProviderAddressTag) ? secret.Properties.Tags[ProviderAddressTag] : "";
            var validityPeriodDays = secret.Properties.Tags.ContainsKey(ValidityPeriodDaysTag) ? secret.Properties.Tags[ValidityPeriodDaysTag] : "";
            log.LogInformation($"Provider Address: {providerAddress}");
            log.LogInformation($"Credential Id: {credentialId}");

            //Check Service Provider connection
            CheckServiceConnection(secret);
            log.LogInformation("Service Connection Validated");
            
            //Create new password
            var randomPassword = CreateRandomPassword();
            log.LogInformation("New Password Generated");

            //Add secret version with new password to Key Vault
            CreateNewSecretVersion(client, secret, randomPassword);
            log.LogInformation("New Secret Version Generated");

            //Update Service Provider with new password
            UpdateServicePassword(secret, randomPassword);
            log.LogInformation("Password Changed");
            log.LogInformation($"Secret Rotated Successfully");
        }
}

Anda dapat menemukan kode lengkap pada GitHub.

Tambahkan rahasia ke Key Vault

Tetapkan diri Anda peran Key Vault Secrets Officer sehingga Anda dapat mengelola rahasia di vault:

az role assignment create --role "Key Vault Secrets Officer" --assignee <email-address-of-user> --scope /subscriptions/<subscription-id>/resourceGroups/<resource-group>/providers/Microsoft.KeyVault/vaults/akvrotation-kv

Buat rahasia dengan tag yang berisi ID sumber daya SQL Server, nama login SQL Server, dan periode validitas rahasia dalam beberapa hari. Atur nama secret, kata sandi awal dari database SQL (Simple123 dalam contoh ini), dan tanggal kedaluwarsa yang disetel ke besok agar rotasi langsung terpicu.

tomorrowDate=$(date -u -d "+1 day" +"%Y-%m-%dT%H:%M:%SZ")
az keyvault secret set --name sqlPassword --vault-name akvrotation-kv --value "Simple123" --tags "CredentialId=sqlAdmin" "ProviderAddress=<sql-database-resource-id>" "ValidityPeriodDays=90" --expires $tomorrowDate

Menetapkan tanggal kedaluwarsa yang singkat akan memublikasikan peristiwa SecretNearExpiry dalam 15 menit, yang memicu fungsi untuk merotasi rahasia.

Menguji dan memverifikasi

Untuk memastikan bahwa secret telah dirotasi, buka Key Vault>Secrets:

Screenshot yang menunjukkan cara mengakses Key Vault > Secrets.

Buka rahasia sqlPassword dan lihat versi asli dan yang telah diganti:

Pergi ke Rahasia

Membuat aplikasi web

Untuk memverifikasi kredensial SQL, buat aplikasi web. Aplikasi web mengambil rahasia dari Key Vault, mengekstrak informasi database SQL dan kredensial dari rahasia, dan menguji koneksi ke SQL Server.

Aplikasi web memerlukan komponen-komponen ini:

  • Aplikasi web dengan identitas terkelola yang ditetapkan sistem.
  • Penugasan peran yang memungkinkan identitas terkelola milik aplikasi web membaca rahasia di Key Vault.
  1. Pilih tautan penyebaran templat Azure:

    Image memperlihatkan tombol berlabel

  2. Pilih grup sumber daya akvrotation .

  3. Di Nama SQL Server, masukkan nama SQL Server yang kata sandinya Anda putar.

  4. Di Nama Key Vault, masukkan nama key vault.

  5. Di Nama Rahasia, masukkan nama rahasia yang menyimpan kata sandi.

  6. Di URL Repositori, masukkan lokasi GitHub kode aplikasi web: https://github.com/Azure-Samples/KeyVault-Rotation-SQLPassword-Csharp-WebApp.git.

  7. Pilih Tinjau + kreasikan.

  8. Pilih Buat.

Buka aplikasi web

Buka URL aplikasi yang disebarkan: https://akvrotation-app.azurewebsites.net/.

Saat aplikasi terbuka di browser, halaman memperlihatkan Nilai Rahasia yang Dihasilkan dan nilai Database Tersambung dari true.

Menggunakan AI untuk mengkustomisasi fungsi rotasi untuk database Anda

Tutorial ini menunjukkan rotasi rahasia untuk SQL Server, tetapi Anda dapat menyesuaikan fungsi rotasi untuk jenis database lainnya. GitHub Copilot dapat membantu Anda mengubah kode fungsi rotasi agar berfungsi dengan database atau jenis kredensial Anda.

I'm using the Azure Key Vault secret rotation tutorial for SQL Server. Help me modify the rotation function to work with PostgreSQL instead. The function should:
1. Generate a new secure password
2. Update the PostgreSQL database user password
3. Store the new password in Key Vault
Show me the changes needed to the C# function code, including the correct PostgreSQL connection library and password update command.

Copilot juga dapat membantu Anda menyesuaikan pola ini untuk jenis kredensial lainnya seperti kunci API, string koneksi, atau kata sandi akun layanan.

GitHub Copilot didukung oleh AI, sehingga kejutan dan kesalahan dimungkinkan. Untuk informasi selengkapnya, lihat FAQ Copilot.

Pelajari lebih lanjut