Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
A melhor forma de autenticar-se nos serviços Azure é usando uma managed identity, mas há alguns cenários em que isso não é uma opção. Nesses casos, chaves de acesso ou segredos são usados. Você deve alternar periodicamente as chaves de acesso ou segredos.
Este tutorial mostra como automatizar a rotação periódica de segredos para bancos de dados e serviços que usam um conjunto de credenciais de autenticação. Para obter uma visão geral abrangente dos conceitos e benefícios da rotação automática em diferentes tipos de ativos, consulte Noções básicas sobre rotação automática no Cofre de Chaves do Azure.
Especificamente, este tutorial gira as senhas do SQL Server armazenadas no Cofre da Chave do Azure usando uma função acionada pela notificação da Grade de Eventos do Azure:
- Trinta dias antes da data de expiração de um segredo, o Key Vault publica o evento "próximo da expiração" na Grelha de Eventos.
- A Grade de Eventos verifica as assinaturas de eventos e usa HTTP POST para chamar o ponto de extremidade do aplicativo de função inscrito no evento.
- O aplicativo de função recebe as informações secretas, gera uma nova senha aleatória e cria uma nova versão para o segredo com a nova senha no Cofre de Chaves.
- O aplicativo de função atualiza o SQL Server com a nova senha.
Observação
Pode haver um atraso entre as etapas 3 e 4. Durante esse tempo, o segredo no Cofre da Chave não poderá ser autenticado no SQL Server. Em caso de falha em qualquer uma das etapas, o Event Grid faz novas tentativas durante duas horas.
Pré-requisitos
- Uma assinatura do Azure - crie uma conta gratuita.
- Azure Key Vault
- SQL Server
Se você não tiver o Cofre da Chave e o SQL Server existentes, poderá usar este link de implantação:
- Em Grupo de recursos, selecione Criar novo. Dê um nome ao grupo, usamos akvrotation neste tutorial.
- Em Logon de administrador do SQL, digite Nome de logon do administrador do SQL.
- Selecione Verificar + criar.
- Selecione Criar
Agora você terá um Cofre de Chaves e uma instância do SQL Server. Você pode verificar essa configuração na CLI do Azure executando o seguinte comando:
az resource list -o table -g akvrotation
O resultado terá a seguinte aparência:
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
Criar e implantar a função de rotação de senha do SQL Server
Importante
Este modelo requer que o cofre de chaves, o SQL Server e a Função do Azure estejam no mesmo grupo de recursos.
Em seguida, crie um aplicativo de função com uma identidade gerenciada pelo sistema, além dos outros componentes necessários, e implante funções de rotação de senha do SQL Server
O aplicativo de função requer estes componentes:
- Um plano do Azure App Service
- Um App de Função com funções de rotação de senha SQL com gatilho de evento e gatilho HTTP
- É necessário ter uma conta de armazenamento para a gestão de gatilhos de aplicações de funções.
- Uma política de acesso para a identidade do App de Funções aceder a segredos no Key Vault
- Uma subscrição de evento do Event Grid para o evento SecretNearExpiry
Selecione o link de implantação do modelo do Azure:
Na lista Grupo de recursos , selecione akvrotation.
No Nome do SQL Server, digite o nome do SQL Server e a senha para rotação de credenciais.
No Nome do Cofre da Chave, digite o nome do Cofre da Chave
Em Nome do aplicativo de função, digite o nome do aplicativo de função
No Nome Secreto, digite o nome secreto onde a senha será armazenada
No URL do repositório, digite a localização do código de função no GitHub (https://github.com/Azure-Samples/KeyVault-Rotation-SQLPassword-Csharp.git)
Selecione Verificar + criar.
Selecione Criar.
Depois de concluir as etapas anteriores, irá ter uma conta de armazenamento, um grupo de servidores e uma aplicação de funções. Você pode verificar essa configuração na CLI do Azure executando o seguinte comando:
az resource list -o table -g akvrotation
O resultado será semelhante à seguinte saída:
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
Para obter informações sobre como criar um aplicativo de função e usar a identidade gerenciada para acessar o Cofre da Chave, consulte Criar um aplicativo de função a partir do portal do Azure, Como usar a identidade gerenciada para o Serviço de Aplicativo e o Azure Functions e Atribuir uma política de acesso ao Cofre da Chave usando o portal do Azure.
Função de rotação
Implantado numa etapa anterior, utiliza um evento para acionar a rotação de uma chave secreta, atualizando o Cofre de Chaves e o banco de dados SQL.
Evento de ativação de função
Esta função lê os dados do evento e executa a lógica de rotação:
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);
}
}
Lógica de rotação secreta
Esse método de rotação lê as informações do banco de dados do segredo, cria uma nova versão do segredo e atualiza o banco de dados com o novo segredo:
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");
}
}
Você pode encontrar o código completo no GitHub.
Adicionar o segredo ao Cofre de Chaves
Defina sua política de acesso para conceder permissões de gerenciamento de segredos aos usuários:
az keyvault set-policy --upn <email-address-of-user> --name akvrotation-kv --secret-permissions set delete get list
Crie um novo segredo com tags que contenham o ID do recurso do SQL Server, o login do SQL Server e o período de validade do segredo em dias. Forneça o nome da senha inicial secreta do banco de dados SQL (em nosso exemplo "Simple123") e inclua uma data de expiração definida para amanhã.
$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
Criar um segredo com uma data de expiração curta publicará um SecretNearExpiry evento dentro de 15 minutos, o que, por sua vez, acionará a função para girar o segredo.
Testar e verificar
Para verificar a rotação do segredo, vá para Cofre da Chave>Segredos:
Abra o segredo sqlPassword e visualize as versões original e rotativa:
Criar um aplicativo Web
Para verificar as credenciais SQL, crie um aplicativo Web. Este aplicativo Web obterá o segredo do Cofre de Chaves, extrairá informações e credenciais do banco de dados SQL do segredo e testará a conexão com o SQL Server.
O aplicativo Web requer estes componentes:
- Um aplicativo Web com identidade gerenciada pelo sistema
- Uma política de acesso para aceder a segredos no Cofre da Chave através da identidade gerida pela aplicação Web
Selecione o link de implantação do modelo do Azure:
Selecione o grupo de recursos akvrotation .
No Nome do SQL Server, digite o nome do SQL Server e a senha para rotação de credenciais.
No Nome do Cofre da Chave, digite o nome do Cofre da Chave
No Nome Secreto, digite o nome secreto onde a senha está armazenada
No URL do repositório, digite a localização do código do aplicativo web no GitHub (https://github.com/Azure-Samples/KeyVault-Rotation-SQLPassword-Csharp-WebApp.git)
Selecione Verificar + criar.
Selecione Criar.
Abra o aplicativo Web
Vá para a URL do aplicativo implantado:
https://akvrotation-app.azurewebsites.net/
Quando a aplicação for aberta no navegador, verá o valor Segredo gerado e um valor Conectado ao banco de dados de verdadeiro.
Mais informações
- Rotação de recursos com dois conjuntos de credenciais
- Noções básicas sobre rotação automática no Azure Key Vault
- Monitorizar o Azure Key Vault com o Azure Event Grid
- Receber e-mails quando um segredo do cofre de chaves for alterado
- Esquema de eventos da Grade de Eventos do Azure para o Azure Key Vault