Automatizace obměně tajného kódu pro prostředky, které používají jednu sadu přihlašovacích údajů pro ověřování
Nejlepším způsobem, jak se ověřit ve službách Azure, je použití spravované identity, ale existují některé scénáře, kdy to není možnost. V takových případech se používají přístupové klíče nebo tajné kódy. Přístupové klíče nebo tajné kódy byste měli pravidelně obměňovat.
V tomto kurzu se dozvíte, jak automatizovat pravidelnou obměnu tajných kódů pro databáze a služby, které používají jednu sadu přihlašovacích údajů ověřování. Konkrétně tento kurz obměňuje hesla SQL Serveru uložená ve službě Azure Key Vault pomocí funkce aktivované oznámením služby Azure Event Grid:
- Třicet dní před datem vypršení platnosti tajného kódu služba Key Vault publikuje událost téměř vypršení platnosti ve službě Event Grid.
- Event Grid zkontroluje odběry událostí a používá HTTP POST k volání koncového bodu aplikace funkcí, který se k události přihlásil.
- Aplikace funkcí obdrží tajné informace, vygeneruje nové náhodné heslo a vytvoří novou verzi tajného kódu s novým heslem ve službě Key Vault.
- Aplikace funkcí aktualizuje SQL Server novým heslem.
Poznámka:
Mezi kroky 3 a 4 může docházet k prodlevě. Během této doby se tajný klíč ve službě Key Vault nebude moct ověřit na SQL Serveru. V případě selhání některého z kroků služba Event Grid opakuje několik hodin.
Požadavky
- Předplatné Azure – vytvořte si ho zdarma.
- Azure Key Vault
- SQL Server
Pokud ještě nemáte službu Key Vault a SQL Server, můžete použít tento odkaz pro nasazení:
- V části Skupina prostředků vyberte Vytvořit novou. Pojmenujte skupinu, v tomto kurzu používáme akvrotation .
- V části Přihlášení správce SQL zadejte přihlašovací jméno správce SQL.
- Vyberte Zkontrolovat a vytvořit.
- Vyberte příkaz Vytvořit.
Teď budete mít službu Key Vault a instanci SQL Serveru. Toto nastavení můžete ověřit v Azure CLI spuštěním následujícího příkazu:
az resource list -o table -g akvrotation
Výsledek bude vypadat nějak takto:
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
Vytvoření a nasazení funkce obměně hesel SQL Serveru
Důležité
Tato šablona vyžaduje, aby trezor klíčů, SQL Server a Funkce Azure byly ve stejné skupině prostředků.
Dále vytvořte aplikaci funkcí s identitou spravovanou systémem, kromě dalších požadovaných komponent a nasaďte funkce obměně hesel SQL Serveru.
Aplikace funkcí vyžaduje tyto komponenty:
- Plán služby Aplikace Azure
- Aplikace funkcí s funkcemi obměně hesel SQL s triggerem události a triggerem HTTP
- Účet úložiště vyžadovaný pro správu triggerů aplikace funkcí
- Zásady přístupu pro identitu aplikace Function App pro přístup k tajným kódům ve službě Key Vault
- Odběr událostí Event Gridu pro událost SecretNearExpiry
Vyberte odkaz nasazení šablony Azure:
V seznamu skupin prostředků vyberte akvrotation.
Do pole Název SQL Serveru zadejte název SQL Serveru s heslem, který chcete otočit.
Do názvu služby Key Vault zadejte název trezoru klíčů.
Do pole Název aplikace funkcí zadejte název aplikace funkcí.
Do pole Název tajného kódu zadejte název tajného kódu, do kterého se heslo uloží.
Do adresy URL úložiště zadejte umístění GitHubu s kódem funkce (https://github.com/Azure-Samples/KeyVault-Rotation-SQLPassword-Csharp.git).
Vyberte Zkontrolovat a vytvořit.
Vyberte Vytvořit.
Po dokončení předchozích kroků budete mít účet úložiště, serverovou farmu a aplikaci funkcí. Toto nastavení můžete ověřit v Azure CLI spuštěním následujícího příkazu:
az resource list -o table -g akvrotation
Výsledek bude vypadat přibližně takto:
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
Informace o tom, jak vytvořit aplikaci funkcí a používat spravovanou identitu pro přístup ke službě Key Vault, najdete v tématu Vytvoření aplikace funkcí z webu Azure Portal, použití spravované identity pro App Service a Azure Functions a přiřazení zásad přístupu ke službě Key Vault pomocí webu Azure Portal.
Funkce Rotation
Nasazená v předchozí funkci používá událost k aktivaci obměny tajného kódu aktualizací služby Key Vault a databáze SQL.
Událost triggeru funkce
Tato funkce čte data událostí a spouští logiku obměny:
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 obměně tajných kódů
Tato metoda obměny čte informace o databázi z tajného kódu, vytvoří novou verzi tajného kódu a aktualizuje databázi novým tajným kódem:
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");
}
}
Kompletní kód najdete na GitHubu.
Přidání tajného kódu do služby Key Vault
Nastavte zásady přístupu tak, aby uživatelům udělily oprávnění ke správě tajných kódů:
az keyvault set-policy --upn <email-address-of-user> --name akvrotation-kv --secret-permissions set delete get list
Vytvořte nový tajný klíč se značkami, které obsahují ID prostředku SQL Serveru, přihlašovací jméno SQL Serveru a dobu platnosti tajného kódu ve dnech. Zadejte název tajného klíče, počáteční heslo z databáze SQL (v našem příkladu "Simple123") a zadejte datum vypršení platnosti nastavené na zítra.
$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
Vytvoření tajného kódu s krátkým datem vypršení platnosti publikuje SecretNearExpiry
událost do 15 minut, což zase aktivuje funkci pro otočení tajného kódu.
Testování a ověření
Pokud chcete ověřit, že se tajný klíč otočil, přejděte na Tajné kódy služby Key Vault>:
Otevřete tajný kód sqlPassword a zobrazte původní a otočené verze:
Vytvoření webové aplikace
Pokud chcete ověřit přihlašovací údaje SQL, vytvořte webovou aplikaci. Tato webová aplikace získá tajný kód ze služby Key Vault, extrahuje informace o databázi SQL a přihlašovací údaje z tajného klíče a otestuje připojení k SQL Serveru.
Webová aplikace vyžaduje tyto komponenty:
- Webová aplikace s identitou spravovanou systémem
- Zásady přístupu pro přístup k tajným kódům ve službě Key Vault prostřednictvím spravované identity webové aplikace
Vyberte odkaz nasazení šablony Azure:
Vyberte skupinu prostředků akvrotation.
Do pole Název SQL Serveru zadejte název SQL Serveru s heslem, který chcete otočit.
Do názvu služby Key Vault zadejte název trezoru klíčů.
Do pole Název tajného klíče zadejte název tajného kódu, ve kterém je heslo uloženo.
Do adresy URL úložiště zadejte umístění GitHubu s kódem webové aplikace (https://github.com/Azure-Samples/KeyVault-Rotation-SQLPassword-Csharp-WebApp.git).
Vyberte Zkontrolovat a vytvořit.
Vyberte Vytvořit.
Otevření webové aplikace
Přejděte na adresu URL nasazené aplikace:
'https://akvrotation-app.azurewebsites.net/'
Když se aplikace otevře v prohlížeči, zobrazí se vygenerovaná tajná hodnota a hodnota připojená k databázi s hodnotou true.