Automatizace obměně tajného klíče 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 v některých scénářích to není možné. V těchto 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ů pro ověřování. Konkrétně tento kurz obměňuje SQL Server hesla uložená v Azure Key Vault pomocí funkce aktivované oznámením Azure Event Grid:
- Třicet dní před datem vypršení platnosti tajného kódu Key Vault publikuje událost "blížící se vypršení platnosti" ve službě Event Grid.
- Event Grid zkontroluje odběry událostí a použije HTTP POST k volání koncového bodu aplikace funkcí přihlášeného k odběru události.
- Aplikace funkcí obdrží tajné informace, vygeneruje nové náhodné heslo a vytvoří novou verzi tajného kódu s novým heslem v Key Vault.
- Aplikace funkcí SQL Server aktualizuje pomocí nového hesla.
Poznámka
Mezi kroky 3 a 4 může dojít ke zpoždění. Během této doby se tajný kód v Key Vault nebude moct ověřit pro SQL Server. V případě selhání některého z kroků se Event Grid pokusí provést opakování po dobu dvou hodin.
Požadavky
- Předplatné Azure – vytvořte si ho zdarma.
- Azure Key Vault
- SQL Server
Pokud nemáte existující 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žijeme akvrotaci .
- V části SQL Správa Přihlášení zadejte přihlašovací jméno správce SQL.
- Vyberte Zkontrolovat a vytvořit.
- Vyberte Vytvořit.
Teď budete mít Key Vault a instanci SQL Server. 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 Functions byly ve stejné skupině prostředků.
Dále vytvořte aplikaci funkcí s identitou spravovanou systémem a dalšími požadovanými komponentami a nasaďte funkce obměně hesel SQL Serveru.
Aplikace funkcí vyžaduje tyto komponenty:
- Plán Azure App Service
- Aplikace funkcí s funkcemi pro obměně hesel SQL s triggerem události a triggerem HTTP
- Účet úložiště vyžadovaný pro správu triggeru aplikace funkcí
- Zásady přístupu pro identitu aplikace funkcí pro přístup k tajným kódům v Key Vault
- Odběr události Event Gridu pro událost SecretNearExpiry
Vyberte odkaz pro nasazení šablony Azure:
V seznamu Skupina prostředků vyberte akvrotation.
Do SQL Server Název zadejte název SQL Server s heslem, který chcete otočit.
Do Key Vault Název 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 kód funkce Umístění GitHubu (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ě jako následující výstup:
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 k Key Vault, najdete v tématech Vytvoření aplikace funkcí z Azure Portal, Použití spravované identity pro App Service a Azure Functions a Přiřazení zásad Key Vault přístupu pomocí Azure Portal.
Funkce otáčení
Funkce nasazená v předchozím kroku používá událost k aktivaci obměně tajného kódu aktualizací Key Vault a databáze SQL.
Událost triggeru funkce
Tato funkce načte data událostí a spustí 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 klíče, vytvoří novou verzi tajného klíče 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");
}
}
Úplný kód najdete na GitHubu.
Přidání tajného kódu do 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ý kód se značkami, které obsahují ID prostředku SQL Server, přihlašovací jméno SQL Server a dobu platnosti tajného kódu ve dnech. Zadejte název tajného kódu, počáteční heslo z databáze SQL (v našem příkladu Simple123) a uveďte datum vypršení platnosti nastavené na zítřek.
$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 k obměně tajného kódu.
Testování a ověření
Pokud chcete ověřit, že se tajný klíč otočil, přejděte na Key Vault>Secrets:
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 z Key Vault, extrahuje z tajného klíče informace a přihlašovací údaje databáze SQL a otestuje připojení k SQL Server.
Webová aplikace vyžaduje tyto komponenty:
- Webová aplikace se systémem spravovanou identitou
- Zásady přístupu pro přístup k tajným kódům v Key Vault prostřednictvím spravované identity webové aplikace
Vyberte odkaz pro nasazení šablony Azure:
Vyberte skupinu prostředků akvrotation .
Do SQL Server Název zadejte název SQL Server s heslem, který chcete otočit.
Do Key Vault Název zadejte název trezoru klíčů.
Do pole Název tajného kódu zadejte název tajného kódu, ve kterém je heslo uložené.
Do adresy URL úložiště zadejte kód webové aplikace na GitHubu (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, uvidíte hodnotu Vygenerovaný tajný kód a hodnotu Připojená databázes hodnotou true.