Bir kimlik doğrulama kimlik bilgileri kümesi kullanan kaynaklar için gizli dizi döndürmeyi otomatikleştirin
Azure hizmetlerinde kimlik doğrulaması yapmanın en iyi yolu yönetilen bir kimlikkullanmaktır, ancak bir seçenek olmadığı durumlarda bazı senaryolar vardır. Bu durumlarda, erişim anahtarları veya gizli dizileri kullanılır. Erişim anahtarlarını veya gizli dizileri düzenli olarak döndürmelisiniz.
Bu öğreticide, tek bir kimlik doğrulama kimlik bilgileri kümesi kullanan veritabanları ve hizmetler için düzenli aralıklarla yapılan gizli dizi döndürmenin nasıl otomatikleştirdiği gösterilmektedir. Özellikle, bu öğretici Azure Event Grid bildirimi tarafından tetiklenen bir işlev kullanılarak Azure Key Vault depolanan SQL Server parolalarını döndürür:
- Bir parolanın süre sonu tarihinden otuz gün önce, Key Vault Event Grid "sona erme" olayını yayınlar.
- Event Grid olay aboneliklerini denetler ve olaya abone olan işlev uygulama uç noktasını çağırmak için HTTP POST kullanır.
- İşlev uygulaması gizli bilgileri alır, yeni bir rastgele parola oluşturur ve Key Vault yeni parolayla gizli dizi için yeni bir sürüm oluşturur.
- İşlev uygulaması güncelleştirmeleri yeni parolayla SQL Server.
Not
3 ve 4. adımlar arasında bir gecikme olabilir. Bu süre boyunca Key Vault gizli dizi SQL Server kimlik doğrulaması yapamaz. Adımların hiçbirinde hata olması durumunda iki saat boyunca yeniden denemeler Event Grid.
Önkoşullar
- Bir Azure aboneliği- ücretsiz olarak bir tane oluşturun.
- Azure Key Vault
- SQL Server
Mevcut Key Vault ve SQL Server yoksa dağıtım bağlantısı aşağıdaki şekilde kullanılabilir:
- Kaynak grubu altında Yeni oluştur' u seçin. Gruba bir ad verin, bu öğreticide akvrotation kullanıyoruz.
- SQL Yöneticisi oturum açma bölümünde SQL yönetici oturum açma adı yazın.
- Gözden geçir ve oluştur’u seçin.
- Oluştur’u seçin
Artık Key Vault ve SQL Server bir örnek vardır. Aşağıdaki komutu çalıştırarak bu kurulumu Azure CLı 'da doğrulayabilirsiniz:
az resource list -o table -g akvrotation
Sonuç aşağıdaki çıktıyı görü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
Aşağıdaki şablon Key Vault, SQL Server ve Azure Işlevinin aynı kaynak grubunda olmasını gerektirir
Sonra, sistem tarafından yönetilen kimliğe sahip bir işlev uygulaması oluşturun ve diğer gerekli bileşenlere ek olarak SQL Server parola döndürme işlevlerini dağıtın
İşlev uygulaması bu bileşenleri gerektirir:
- Azure App Service planı
- Olay tetikleyicisi ve http tetikleyicisi ile SQL parola döndürme işlevleri ile İşlev Uygulaması
- İşlev uygulaması tetikleyici yönetimi için gerekli bir depolama hesabı
- Key Vault gizli dizileri erişmek için İşlev Uygulaması kimlik erişimi ilkesi
- Secretyaklaştığında süre sonu olayı Için eventgrid olay aboneliği
Azure şablonu dağıtım bağlantısını seçin:
Kaynak grubu listesinde, akvdönüşü' ni seçin.
SQL Server adı' nda, döndürmek için parola Ile SQL Server adını yazın
Key Vault adına, Anahtar Kasası adını yazın
İşlev uygulaması adına, işlev uygulama adını yazın
Gizli dizi adında parolanın depolanacağı gizli adı yazın
Depo URL 'si içinde, Işlev kodu GitHub Location () yazın https://github.com/Azure-Samples/KeyVault-Rotation-SQLPassword-Csharp.git
Gözden geçir ve oluştur’u seçin.
Oluştur’u seçin.
Yukarıdaki adımları tamamladıktan sonra bir depolama hesabınız, sunucu grubunuz ve bir işlev uygulamanız olacaktır. Aşağıdaki komutu çalıştırarak bu kurulumu Azure CLı 'da doğrulayabilirsiniz:
az resource list -o table -g akvrotation
Sonuç aşağıdaki çıktıya benzer bir şekilde görünecektir:
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
Bir işlev uygulaması oluşturma ve Key Vault erişmek için yönetilen kimlik kullanma hakkında bilgi için, bkz. Azure Portal bir işlev uygulaması oluşturma, App Service ve Azure işlevleri için yönetilen kimlik kullanmave Azure Portal kullanarak bir Key Vault erişim ilkesi atama.
Döndürme işlevi
Önceki adımda dağıtılan işlevi, Key Vault ve SQL veritabanını güncelleştirerek bir gizli dizi dönüşü tetiklemek için 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 anahtar döndürme mantığı
Bu döndürme yöntemi, gizli dizi veritabanı bilgilerini okur, gizliliğin yeni bir sürümünü oluşturur ve veritabanını yeni gizli anahtar ile 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");
}
}
Tüm kodu GitHub' da bulabilirsiniz.
Gizli dizi Key Vault ekleyin
Kullanıcılara gizli dizi 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
Gizli dizi için SQL Server kaynak KIMLIĞI, SQL Server oturum açma adı ve geçerlilik süresi içeren etiketlerle yeni bir gizli dizi oluşturun. SQL veritabanından gizli, başlangıç parolasının adını sağlayın (örneğimizde "Simple123") ve yarın için ayarlanmış bir sona erme 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 süre sonu tarihi ile bir gizli dizi oluşturmak SecretNearExpiry , 15 dakika içinde bir olay yayımlar, bu da işlevi parolayı döndürmek için tetikler.
Test ve doğrulama
Gizli dizinin döndürülmeyeceğini doğrulamak için Key Vault > gizli dizi sayfasına gidin:
SQLPassword gizli anahtarını 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 parolayı alacak, SQL veritabanı bilgilerini ve kimlik bilgilerini gizli listeden ayıklayarak SQL Server bağlantısını test edecektir.
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 parolalara erişim 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 parola Ile SQL Server adını yazın
Key Vault adına, Anahtar Kasası adını yazın
Gizli dizi adında parolanın depolandığı gizli adı yazın
Depo URL'sinde, 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 seçin.
Web uygulamasını açın
Dağıtılan uygulama URL 'sine gidin:
'https://akvrotation-app.azurewebsites.net/'
Uygulama tarayıcıda açıldığında, oluşturulan gizli değeri ve bir veritabanı bağlı değeri true olarak görürsünüz.
