Bagikan melalui


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

Cara terbaik mengautentikasi ke layanan Azure adalah menggunakan identitas terkelola, tetapi ada beberapa skenario yang bukan jadi pilihan. Dalam kasus tersebut, kunci akses atau rahasia digunakan. Anda harus memutar kunci akses atau rahasia secara berkala.

Tutorial ini menunjukkan cara mengotomatiskan rotasi berkala rahasia untuk database dan layanan yang menggunakan satu set kredensial autentikasi. Secara khusus, tutorial ini memutar kata sandi SQL Server yang disimpan di Azure Key Vault menggunakan fungsi yang dipicu oleh pemberitahuan Azure Event Grid:

Diagram solusi rotasi

  1. Tiga puluh hari sebelum tanggal kedaluwarsa rahasia, Key Vault menerbitkan peristiwa "hampir kedaluwarsa" ke Event Grid.
  2. Event Grid memeriksa langganan peristiwa dan menggunakan HTTP POST untuk memanggil titik akhir aplikasi fungsi berlangganan peristiwa.
  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.

Catatan

Mungkin ada jeda antara langkah 3 dan 4. Selama waktu itu, rahasia di Key Vault tidak akan dapat diautentikasi ke SQL Server. Jika terjadi kegagalan salah satu langkah, Event Grid akan kembali selama dua jam.

Prasyarat

Jika Anda tidak memiliki Key Vault dan SQL Server yang sudah ada, Anda dapat menggunakan tautan penyebaran ini:

Gambar memperlihatkan tombol berlabel

  1. Pada Grup Sumber Daya, pilih Buat baru. Beri grup nama, kami menggunakan akvrotasi dalam tutorial ini.
  2. Di bawah SQL Admin Login, ketik nama masuk administrator SQL.
  3. Pilih Tinjau + buat.
  4. Pilih Buat

Membuat grup sumber daya

Sekarang Anda akan memiliki Key Vault, dan instans SQL Server. Anda bisa memverifikasi penyiapan ini di Azure CLI dengan menjalankan perintah berikut:

az resource list -o table -g akvrotation

Hasilnya akan terlihat seperti 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 server SQL

Penting

Templat ini memerlukan brankas kunci, server SQL, dan Azure Function untuk berada dalam grup sumber daya yang sama.

Selanjutnya, buat aplikasi fungsi dengan identitas yang dikelola sistem, selain komponen lain yang diperlukan, dan sebarkan fungsi rotasi kata sandi server SQL

Aplikasi fungsi memerlukan komponen-komponen ini:

  • Paket Azure App Service
  • Aplikasi Fungsi dengan fungsi rotasi kata sandi SQL dengan pemicu peristiwa dan pemicu http
  • Akun penyimpanan yang diperlukan untuk manajemen pemicu aplikasi fungsi
  • Kebijakan akses untuk identitas Aplikasi Fungsi untuk mengakses rahasia di Key Vault
  • Langganan peristiwa Event Grid untuk peristiwa SecretNearExpiry
  1. Pilih tautan penerapan templat Azure:

    Gambar memperlihatkan tombol berlabel

  2. Di daftar Grup sumber daya, pilih akvrotasi.

  3. Di Nama SQL Server, ketik nama SQL Server dengan kata sandi untuk memutar

  4. Di Nama Key Vault, ketikkan nama key vault

  5. Di Nama Aplikasi Fungsi, ketikkan nama aplikasi fungsi

  6. Di Nama Rahasia, ketikkan nama rahasia tempat kata sandi akan disimpan

  7. Di Url Repo, ketik lokasi GitHub kode fungsi (https://github.com/Azure-Samples/KeyVault-Rotation-SQLPassword-Csharp.git)

  8. Pilih Tinjau + buat.

  9. Pilih Buat.

Pilih Tinjau + buat

Setelah menyelesaikan langkah-langkah sebelumnya, Anda akan memiliki akun penyimpanan, farm server, dan aplikasi fungsi. Anda bisa memverifikasi penyiapan ini di Azure CLI dengan menjalankan perintah berikut:

az resource list -o table -g akvrotation

Hasilnya akan terlihat seperti 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 tentang cara 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 Menetapkan kebijakan akses Key Vault menggunakan portal Azure.

Fungsi rotasi

Diterapkan dalam fungsi langkah sebelumnya menggunakan peristiwa untuk memicu rotasi rahasia dengan 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 rahasia, membuat versi baru rahasia, dan memperbarui database dengan rahasia 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 di GitHub.

Tambahkan rahasia ke Key Vault

Atur kebijakan akses Anda untuk memberikan izin kelola rahasia kepada pengguna:

az keyvault set-policy --upn <email-address-of-user> --name akvrotation-kv --secret-permissions set delete get list

Buat rahasia baru dengan tag yang berisi ID sumber daya SQL Server, nama login SQL Server, dan periode validitas untuk rahasia dalam beberapa hari. Berikan nama kata sandi, inisial kata sandi dari database SQL (contohnya "Simple123") dan sertakan tanggal kedaluwarsa yang ditetapkan untuk besok.

$tomorrowDate = (get-date).AddDays(+1).ToString("yyy-MM-ddThh:mm:ssZ")
az keyvault secret set --name sqlPassword --vault-name akvrotation-kv --value "Simple123" --tags "CredentialId=sqlAdmin" "ProviderAddress=<sql-database-resource-id>" "ValidityPeriodDays=90" --expires $tomorrowDate

Membuat rahasia dengan tanggal kedaluwarsa singkat akan menerbitkan SecretNearExpiry peristiwa dalam waktu 15 menit, yang pada gilirannya akan memicu fungsi untuk memutar rahasia.

Menguji dan memverifikasi

Untuk memastikan bahwa rahasia telah dirotasi, buka Rahasia>Key Vault:

Cuplikan layar yang memperlihatkan cara mengakses Rahasia Key Vault>.

Buka rahasia sqlPassword dan lihat versi asli dan yang dirotasi:

Buka Rahasia

Membuat aplikasi web

Untuk memverifikasi kredensial SQL, buat aplikasi web. Aplikasi web ini akan mendapatkan 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 yang dikelola sistem
  • Kebijakan akses untuk mengakses rahasia di Key Vault melalui identitas terkelola aplikasi web
  1. Pilih tautan penerapan templat Azure:

    Gambar memperlihatkan tombol berlabel

  2. Pilih grup sumber daya akvrotasi.

  3. Di Nama SQL Server, ketik nama SQL Server dengan kata sandi untuk memutar

  4. Di Nama Key Vault, ketikkan nama key vault

  5. Di Nama Rahasia, ketikkan nama rahasia tempat kata sandi disimpan

  6. Di Url Repo, ketikkan lokasi GitHub kode aplikasi web (https://github.com/Azure-Samples/KeyVault-Rotation-SQLPassword-Csharp-WebApp.git)

  7. Pilih Tinjau + buat.

  8. Pilih Buat.

Membuka aplikasi web

Buka URL aplikasi yang diterapkan:

'https://akvrotation-app.azurewebsites.net/'

Ketika aplikasi terbuka di browser, Anda akan melihat Nilai Rahasia yang Dihasilkan dan nilai Database Connected dari true.

Pelajari lebih lanjut