Het rouleren van een geheim voor resources met één set verificatiereferenties automatiseren
De beste manier om te verifiëren bij Azure-services is met behulp van een beheerde identiteit, maar in enkele gevallen is dat niet mogelijk. In dergelijke gevallen worden toegangssleutels of geheimen gebruikt. U moet toegangssleutels of geheimen regelmatig rouleren.
In deze zelfstudie leert u hoe u de periodieke roulatie van geheimen voor databases en services die gebruikmaken van één set verificatiereferenties kunt automatiseren. Deze zelfstudie laat met name zien hoe SQL Server-wachtwoorden die in Azure Key Vault zijn opgeslagen, worden gerouleerd met behulp van een functie die wordt geactiveerd door een melding van Azure Event Grid:
- Dertig dagen voor de vervaldatum van een geheim publiceert Key Vault deze "bijna verlopende" gebeurtenis naar Event Grid.
- Event Grid controleert de gebeurtenisabonnementen en maakt gebruik van HTTP POST om het eindpunt voor de functie-app aan te roepen die is geabonneerd op de gebeurtenis.
- De functie-app ontvangt de informatie over het geheim, genereert een nieuw willekeurig wachtwoord en maakt een nieuwe versie voor het geheim met het nieuwe wachtwoord in Key Vault.
- De functie-app werkt SQL Server bij met het nieuwe wachtwoord.
Notitie
Er kan een vertraging optreden tussen stap 3 en 4. Gedurende die tijd kan het geheim in Key Vault niet worden geverifieerd bij SQL Server. In het geval van een storing tijdens een van de stappen blijft Event Grid het twee uur opnieuw proberen.
Vereisten
- Een Azure-abonnement (u kunt een gratis abonnement maken).
- Azure Key Vault
- SQL Server
Als u geen bestaande Key Vault en SQL Server hebt, kunt u deze implementatiekoppeling gebruiken:
- Selecteer voor Resourcegroep de optie Nieuwe maken. Geef groep een naam, we gebruiken akvrotation in deze zelfstudie.
- Typ de aanmeldingsnaam van de SQL-beheerder onder SQL-beheerdersaanmelding.
- Selecteer Controleren + maken.
- Selecteer Maken.
U hebt nu een sleutelkluis en een SQL Server-exemplaar. U kunt deze instelling in de Azure CLI controleren door de volgende opdracht uit te voeren:
az resource list -o table -g akvrotation
Het resultaat ziet er ongeveer als volgt uit:
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
De functie wachtwoordrotatie voor SQL Server maken en implementeren
Belangrijk
Voor deze sjabloon moeten de sleutelkluis, SQL Server en Azure Function zich in dezelfde resourcegroep bevinden.
Maak vervolgens een functie-app met een door het systeem beheerde identiteit, naast de andere vereiste onderdelen, en implementeer functies voor wachtwoordrotatie van SQL Server
Voor de functie-app zijn de volgende onderdelen vereist:
- Een Azure App Service-plan
- Een functie-app met functies voor het rouleren van SQL-wachtwoorden met gebeurtenistrigger en HTTP-trigger
- Er is een opslagaccount vereist voor het beheer van de functie-app-trigger
- Een toegangsbeleid om de functie-app-id toegang te geven tot geheimen in Key Vault
- Een Event Grid-gebeurtenisabonnement voor SecretNearExpiry-gebeurtenis
Selecteer de koppeling voor de Azure-sjabloonimplementatie:
Selecteer in de lijst Resourcegroep de optie akvrotation.
Typ in de SQL Server-naam de SQL Server-naam met het wachtwoord om te draaien
Typ in Naam voor Key Vault de naam van de sleutelkluis
Typ in Naam van de functie-app de naam van de functie-app
Typ in Geheime naam de naam van het geheim waarin het wachtwoord moet worden opgeslagen
Typ in Opslagplaats-URL de GitHub-locatie van de functiecode (https://github.com/Azure-Samples/KeyVault-Rotation-SQLPassword-Csharp.git)
Selecteer Controleren + maken.
Selecteer Maken.
Nadat u de voorgaande stappen hebt voltooid, hebt u een opslagaccount, een serverfarm en een functie-app. U kunt deze instelling in de Azure CLI controleren door de volgende opdracht uit te voeren:
az resource list -o table -g akvrotation
Het resultaat ziet er ongeveer als volgt uit:
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
Zie Een functie-app maken vanuit de Azure-portal, Beheerde identiteit gebruiken voor App Service en Azure Functions en Key Vault-toegangsbeleid toewijzen met behulp van de Azure-portal voor informatie over het maken van een functie-app en het gebruik van beheerde identiteit voor toegang tot Key Vault.
Roulatiefunctie
De in de vorige stap geïmplementeerde functie gebruikt een gebeurtenis om de roulatie van een geheim te activeren door Key Vault en de SQL database bij te werken.
Gebeurtenis om functie te activeren
Deze functie leest gebeurtenisgegevens en voert de roulatielogica uit:
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);
}
}
Logica voor geheimroulatie
Met deze roulatiemethode worden databasegegevens uit het geheim gelezen, wordt een nieuwe versie van het geheim gemaakt en wordt de database met het nieuwe geheim bijgewerkt:
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");
}
}
U vindt de volledige code op GitHub.
Het geheim toevoegen aan Key Vault
Stel uw toegangsbeleid in om machtigingen voor het beheren van geheimen te verlenen aan gebruikers:
az keyvault set-policy --upn <email-address-of-user> --name akvrotation-kv --secret-permissions set delete get list
Maak een nieuw geheim met tags die de SQL Server-resource-id, de SQL Server-aanmeldings-id en de geldigheidsperiode voor het geheim in dagen bevatten. Geef de naam op van het geheim, het aanvankelijke wachtwoord van SQL database ('Simple123', in ons voorbeeld) en neem een vervaldatum op die is ingesteld op morgen.
$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
Als u een geheim met een korte vervaldatum maakt, wordt een SecretNearExpiry
-gebeurtenis binnen 15 minuten gepubliceerd, waardoor de functie voor roulatie van het geheim wordt geactiveerd.
Testen en verifiëren
Als u wilt controleren of het geheim is gerouleerd, gaat u naar Key Vault>Geheimen:
Open het sqlPassword-geheim en bekijk de oorspronkelijke en gerouleerde versies:
Een webtoepassing maken
Maak een web-app om de SQL-referenties te controleren. Met deze web-app wordt het geheim opgehaald uit Key Vault, worden SQL databasegegevens en -referenties uit het geheim opgehaald en wordt de verbinding met SQL Server getest.
Voor de web-app zijn de volgende onderdelen vereist:
- Een web-app met door het systeem beheerde identiteit
- Een toegangsbeleid voor het openen van geheimen in Key Vault via een door de web-app beheerde identiteit
Selecteer de koppeling voor de Azure-sjabloonimplementatie:
Selecteer de resourcegroep akvrotation.
Typ in de SQL Server-naam de SQL Server-naam met het wachtwoord om te draaien
Typ in Naam voor Key Vault de naam van de sleutelkluis
Typ in Geheime naam de naam van het geheim waarin het wachtwoord wordt opgeslagen
Typ in Opslagplaats-URL de GitHub-locatie van de web-appcode (https://github.com/Azure-Samples/KeyVault-Rotation-SQLPassword-Csharp-WebApp.git)
Selecteer Controleren + maken.
Selecteer Maken.
De web-app openen
Ga naar de URL van de geïmplementeerde toepassing:
'https://akvrotation-app.azurewebsites.net/'
Wanneer de toepassing in de browser wordt geopend, ziet u de gegenereerde waarde van het geheim en de waarde voor de databaseverbinding ingesteld op true.