Bir kimlik doğrulama kimlik bilgileri kümesini kullanan kaynaklar için gizli dizi döndürmeyi otomatikleştirme
Azure hizmetlerinde kimlik doğrulamanın en iyi yolu yönetilen kimlik kullanmaktır, ancak bunun bir seçenek olmadığı bazı senaryolar vardır. Böyle durumlarda erişim anahtarları veya gizli diziler kullanılır. Erişim anahtarlarını veya gizli dizileri düzenli aralıklarla döndürmeniz gerekir.
Bu öğreticide, tek bir kimlik doğrulama kimlik bilgisi kümesi kullanan veritabanları ve hizmetler için gizli dizilerin düzenli olarak döndürülerek otomatikleştirilmesi gösterilmektedir. Özellikle, bu öğretici Azure Event Grid bildirimi tarafından tetiklenen bir işlevi kullanarak Azure Key Vault'ta depolanan SQL Server parolalarını döndürür:
- Key Vault, bir gizli dizinin sona erme tarihinden otuz gün önce Event Grid'de "süresi dolmak üzere" olayını yayımlar.
- Event Grid olay aboneliklerini denetler ve olaya abone olan işlev uygulaması uç noktasını çağırmak için HTTP POST kullanır.
- İşlev uygulaması gizli dizi bilgilerini alır, yeni bir rastgele parola oluşturur ve Key Vault'taki yeni parolayla gizli dizi için yeni bir sürüm oluşturur.
- İşlev uygulaması SQL Server'i yeni parolayla güncelleştirir.
Not
3. ve 4. adımlar arasında bir gecikme olabilir. Bu süre boyunca, Key Vault'taki gizli dizi SQL Server'da kimlik doğrulaması yapamaz. Adımlardan herhangi birinin başarısız olması durumunda Event Grid iki saat boyunca yeniden denenir.
Önkoşullar
- Azure aboneliği - ücretsiz bir abonelik oluşturun.
- Azure Key Vault
- SQL Server
Mevcut Key Vault ve SQL Server'larınız yoksa şu dağıtım bağlantısını kullanabilirsiniz:
- Kaynak grubu'nun altında Yeni oluştur’u seçin. Gruba bir ad verin, bu öğreticide akvrotation kullanıyoruz.
- SQL Yöneticisi Oturum Açma'nın altına SQL yöneticisi oturum açma adı yazın.
- Gözden geçir ve oluştur’u seçin.
- Oluştur'u seçin
Artık bir Key Vault ve bir SQL Server örneğiniz olacak. Aşağıdaki komutu çalıştırarak Bu kurulumu Azure CLI'da doğrulayabilirsiniz:
az resource list -o table -g akvrotation
Sonuç aşağıdaki çıkışta görünür:
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
SQL server parola döndürme işlevi oluşturma ve dağıtma
Önemli
Bu şablon anahtar kasası, SQL sunucusu ve Azure İşlevi'nin aynı kaynak grubunda olmasını gerektirir.
Ardından, sistem tarafından yönetilen bir kimlikle, diğer gerekli bileşenlere ek olarak bir işlev uygulaması oluşturun ve SQL server parola döndürme işlevlerini dağıtın
İşlev uygulaması şu bileşenleri gerektirir:
- Azure Uygulaması Hizmeti planı
- Olay tetikleyicisi ve http tetikleyicisi ile SQL parola döndürme işlevlerine sahip bir İşlev Uygulaması
- İşlev uygulaması tetikleyici yönetimi için gereken bir depolama hesabı
- Key Vault'ta gizli dizilere erişmek için İşlev Uygulaması kimliğine yönelik erişim ilkesi
- SecretNearExpiry olayı için Event Grid olay aboneliği
Azure şablonu dağıtım bağlantısını seçin:
Kaynak grubu listesinde akvrotation öğesini seçin.
SQL Server Adı'nda, döndürmek için parolayla SQL Server adını yazın
Anahtar Kasası Adı alanına anahtar kasası adını yazın
İşlev Uygulaması Adı alanına işlev uygulaması adını yazın
Gizli Dizi Adı alanına parolanın depolanacağı gizli dizi adını yazın
Depo Url'sine işlev kodu GitHub konumu (https://github.com/Azure-Samples/KeyVault-Rotation-SQLPassword-Csharp.git) yazın
Gözden geçir ve oluştur’u seçin.
Oluştur'u belirleyin.
Önceki adımları tamamladıktan sonra bir depolama hesabınız, bir sunucu grubunuz ve bir işlev uygulamanız olur. Aşağıdaki komutu çalıştırarak Bu kurulumu Azure CLI'da doğrulayabilirsiniz:
az resource list -o table -g akvrotation
Sonuç aşağıdaki çıkışa benzer olacaktır:
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
İşlev uygulaması oluşturma ve Key Vault'a erişmek için yönetilen kimliği kullanma hakkında bilgi için bkz. Azure portalından işlev uygulaması oluşturma, App Service ve Azure İşlevleri için yönetilen kimlik kullanma ve Azure portalını kullanarak Key Vault erişim ilkesi atama.
Döndürme işlevi
Önceki adımda dağıtılan işlev, Key Vault ve SQL veritabanını güncelleştirerek gizli dizi döndürmeyi tetikleyen bir olay kullanır.
İşlev tetikleyici olayı
Bu işlev olay verilerini okur ve döndürme mantığını çalıştırır:
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);
}
}
Gizli dizi döndürme mantığı
Bu döndürme yöntemi gizli dizideki veritabanı bilgilerini okur, gizli dizinin yeni bir sürümünü oluşturur ve veritabanını yeni gizli diziyle güncelleştirir:
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");
}
}
Kodun tamamını GitHub'da bulabilirsiniz.
Gizli diziyi Key Vault'a ekleme
Kullanıcılara gizli dizileri yönetme izinleri vermek için erişim ilkenizi ayarlayın:
az keyvault set-policy --upn <email-address-of-user> --name akvrotation-kv --secret-permissions set delete get list
SQL Server kaynak kimliğini, SQL Server oturum açma adını ve gün cinsinden gizli dizi için geçerlilik süresini içeren etiketlerle yeni bir gizli dizi oluşturun. Gizli anahtarın adını, SQL veritabanındaki ilk parolayı ("Simple123" örneğimizde) belirtin ve yarın için ayarlanmış bir son kullanma tarihi ekleyin.
$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
Kısa bir son kullanma tarihiyle gizli dizi oluşturmak 15 dakika içinde bir SecretNearExpiry
olay yayımlar ve bu da işlevin gizli diziyi döndürmesini tetikler.
Test edin ve doğrulayın
Gizli dizinin döndürüldüğünü doğrulamak için Key Vault>Gizli Dizileri'ne gidin:
sqlPassword gizli dizisini açın ve özgün ve döndürülmüş sürümleri görüntüleyin:
Web uygulaması oluşturma
SQL kimlik bilgilerini doğrulamak için bir web uygulaması oluşturun. Bu web uygulaması Key Vault'tan gizli diziyi alır, gizli diziden SQL veritabanı bilgilerini ve kimlik bilgilerini ayıklar ve SQL Server bağlantısını test eder.
Web uygulaması şu bileşenleri gerektirir:
- Sistem tarafından yönetilen kimliğe sahip bir web uygulaması
- Web uygulaması yönetilen kimliği aracılığıyla Key Vault'taki gizli dizilere erişmek için erişim ilkesi
Azure şablonu dağıtım bağlantısını seçin:
akvrotation kaynak grubunu seçin.
SQL Server Adı'nda, döndürmek için parolayla SQL Server adını yazın
Anahtar Kasası Adı alanına anahtar kasası adını yazın
Gizli Dizi Adı alanına parolanın depolandığı gizli dizi adını yazın
Depo Url'sine web uygulaması kodu GitHub konumu (https://github.com/Azure-Samples/KeyVault-Rotation-SQLPassword-Csharp-WebApp.git) yazın
Gözden geçir ve oluştur’u seçin.
Oluştur'u belirleyin.
Web uygulamasını açma
Dağıtılan uygulama URL'sine gidin:
'https://akvrotation-app.azurewebsites.net/'
Uygulama tarayıcıda açıldığında Oluşturulan Gizli Dizi Değeri'ni ve Veritabanı Bağlı değerini true olarak görürsünüz.