Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
A melhor maneira de autenticar nos serviços Azure é usando uma identidade manada, mas há alguns cenários em que essa 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 de autorotação em diferentes tipos de recursos, consulte Autorotação no Azure Key Vault.
Especificamente, este tutorial rotaciona as senhas do SQL Server armazenadas no Azure Key Vault usando uma função disparada por notificação do Grade de Eventos do Azure.
- Trinta dias antes da data de validade de um segredo, o Key Vault publica o evento de "expiração próxima" na Grade 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ções assinado para o evento.
- O aplicativo de funções recebe as informações secretas, gera uma nova senha aleatória e cria uma nova versão para o segredo com a nova senha em Key Vault.
- O aplicativo de funções atualiza SQL Server com a nova senha.
Observação
Pode haver um atraso entre as etapas 3 e 4. Durante esse tempo, o segredo em Key Vault não será capaz de se autenticar no SQL Server. No caso de uma falha em qualquer uma das etapas, o Event Grid tenta novamente por duas horas.
Pré-requisitos
- Uma assinatura Azure – criar uma gratuitamente.
- Azure Key Vault
- SQL Server
Se você não tiver Key Vault e SQL Server existentes, poderá usar este link de implantação:
- Em Grupo de recursos, selecione Criar. Dê um nome ao grupo, usamos akvrotation neste tutorial.
- Em Logon do Administrador do SQL, digite o nome de logon do administrador do SQL.
- Selecione Examinar + criar.
- Selecione Criar
Agora você terá uma Key Vault e uma instância de SQL Server. Você pode verificar essa configuração no CLI do Azure executando o seguinte comando:
az resource list -o table -g akvrotation
O resultado terá uma aparência semelhante à da 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
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
Esse modelo requer que o cofre de chaves, o SQL Server e a Função Azure estejam no mesmo grupo de recursos.
Em seguida, crie um aplicativo de funções 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ções requer estes componentes:
- Um plano de Serviço de Aplicativo do Azure
- Um Aplicativo de Funções com funções de rotação de senha do SQL com gatilho de evento e gatilho http
- Uma conta de armazenamento é necessária para o gerenciamento de gatilhos do aplicativo de função
- Uma atribuição de função RBAC do Azure para a identidade do aplicativo acessar os segredos no Key Vault
- Uma assinatura de evento do Event Grid para o evento SecretNearExpiry
Selecione o link de implantação do modelo Azure:
Na lista de grupos de recursos, selecione akvrotation.
No Nome do SQL Server, digite o nome do SQL Server com a senha para rotação
No Nome do Cofre de Chaves, digite o nome do cofre de chaves
No Nome do Aplicativo de Funções, digite o nome do aplicativo de funções
No Nome do Segredo, digite o nome do segredo em que a senha será armazenada
No Repo Url, digite a localização do código de função no GitHub (https://github.com/Azure-Samples/KeyVault-Rotation-SQLPassword-Csharp.git)
Selecione Examinar + criar.
Selecione Criar.
Depois de concluir as etapas anteriores, você terá uma conta de armazenamento, um farm de servidores e um aplicativo de funções. Você pode verificar essa configuração no CLI do Azure executando o seguinte comando:
az resource list -o table -g akvrotation
O resultado será semelhante ao seguinte resultado:
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ções e usar a identidade gerenciada para acessar Key Vault, consulte Criar um aplicativo de funções no Azure portal, Como usar a identidade gerenciada para o Serviço de Aplicativo e Azure Functions e Provide acesso ao Key Vault com Azure RBAC.
Função de rotação
Implantado na etapa anterior, a função usa um evento para disparar a rotação de um segredo atualizando o Key Vault e o banco de dados SQL.
Evento de gatilho de função
Essa 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ê 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 em GitHub.
Adicionar o segredo ao Key Vault
Defina sua política de acesso para conceder permissões de gerenciamento de segredos aos usuários:
az role assignment create --role "Key Vault Secrets Officer" --assignee <email-address-of-user> --scope /subscriptions/<subscription-id>/resourceGroups/<resource-group>/providers/Microsoft.KeyVault/vaults/akvrotation-kv
Crie um novo segredo com etiquetas que contenham a ID do recurso SQL Server, o nome de logon SQL Server e o período de validade do segredo em dias. Forneça o nome do segredo, senha inicial do banco de dados SQL (em nosso exemplo "Simple123") e inclua uma data de validade definida para amanhã.
$tomorrowDate = (get-date).AddDays(+1).ToString("yyyy-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
A criação de um segredo com uma data de validade curta publicará um evento SecretNearExpiry em 15 minutos, o que, por sua vez, disparará a função para girar o segredo.
Testar e verificar
Para verificar se o segredo foi renovado, vá para Key Vault>Segredos:
Abra o segredo sqlPassword e exiba as versões originais e rotacionadas:
Criar um aplicativo Web
Para verificar as credenciais do SQL, crie um aplicativo Web. Esse aplicativo Web obterá o segredo de Key Vault, extrairá informações e credenciais do banco de dados SQL do segredo e testará a conexão com SQL Server.
O aplicativo Web requer estes componentes:
- Um aplicativo Web com identidade gerenciada pelo sistema
- Uma política de acesso para acessar segredos no Key Vault por meio da identidade gerenciada do aplicativo Web
Selecione o link de implantação do modelo Azure:
Selecione o grupo de recursos akvrotation .
No SQL Server Name, digite o nome do SQL Server com a senha para a rotação.
No Nome do Cofre de Chaves, digite o nome do cofre de chaves
No Nome do Segredo, digite o nome do segredo em que a senha é armazenada
No Repo Url, digite a localização do código do aplicativo web no GitHub (https://github.com/Azure-Samples/KeyVault-Rotation-SQLPassword-Csharp-WebApp.git)
Selecione Examinar + criar.
Selecione Criar.
Abrir o aplicativo Web
Vá para a URL do aplicativo implantado:
https://akvrotation-app.azurewebsites.net/
Quando o aplicativo for aberto no navegador, você verá o Valor Secreto Gerado e um valor de Banco de Dados Conectado igual a verdadeiro.
Usar a IA para personalizar a função de rotação do banco de dados
Este tutorial demonstra a rotação de segredos para o SQL Server, mas você pode adaptar a função de rotação para outros tipos de banco de dados. GitHub Copilot no VS Code pode ajudá-lo a modificar o código da função de rotação para trabalhar com seu banco de dados ou tipo de credencial específico.
I'm using the Azure Key Vault secret rotation tutorial for SQL Server. Help me modify the rotation function to work with PostgreSQL instead. The function should:
1. Generate a new secure password
2. Update the PostgreSQL database user password
3. Store the new password in Key Vault
Show me the changes needed to the C# function code, including the correct PostgreSQL connection library and password update command.
Copilot também pode ajudá-lo a adaptar esse padrão para outros tipos de credencial, como chaves de API, cadeias de conexão ou senhas de conta de serviço.
GitHub Copilot é alimentado pela IA, portanto, surpresas e erros são possíveis. Para obter mais informações, consulte Copilot perguntas frequentes.