O Azure Key Vault pode armazenar nome de usuário e senha e gerenciar informações confidenciais no Azure. Depois que o Azure Key Vaults armazena as informações, os serviços do Azure que você especificar (e SOMENTE os serviços do Azure que você especificar) podem acessá-las
Nesta postagem do blog, mostrarei como usar o Azure Key Vault para armazenar as credenciais do Couchbase Server e acessá-las a partir de uma Função do Azure.
Esta postagem do blog sobre como armazenar credenciais e senhas de banco de dados no Azure Key Vault será baseada em postagens anteriores do blog sobre o Couchbase no Azure, portanto, revise-as antes de prosseguir:
- Azure: Começar a usar é fácil e gratuito
- Azure Functions e Lazy Initialization com o Couchbase Server
- Azure Functions com o Couchbase Server (vídeo)
- Essas informações devem ser suficientes para que você se familiarize com o assunto, mas há muitas outras postagens de blog envolvendo o Azure
Como sempre, se quiser acompanhar, você pode encontrar o fonte completa no GitHub.
Instalação e configuração do Couchbase Server
O restante desta postagem pressupõe que você tenha uma configuração do Couchbase Server no Azure. Você pode seguir os links acima para saber mais sobre esse processo (é fácil!).
Em minha configuração para esta postagem do blog, criei um cluster (que exigiu a criação de credenciais de administrador) e um único bucket chamado "mybucket".
Estou usando o Couchbase Enterprise Edition 5.5.2, pois é o mais fácil de configurar no Azure. A edição Community e as versões anteriores do Couchbase também devem funcionar bem.
Criação de um cofre de chaves do Azure
Um Azure Key Vault pode ser criado com a UI do Portal do Azure ou você pode criá-lo com a linha de comando. Em uma postagem anterior sobre o uso do Operador de Kubernetes do Couchbase com o AzureTambém usei a linha de comando. Talvez você queira revisar isso se não tiver usado o Linha de comando do Azure utilidade antes.
A primeira etapa só precisa ser executada uma vez por assinatura do Azure. Supondo que sua linha de comando esteja definida para a assinatura desejada, registre o Azure Key Vault nessa assinatura com este comando:
1 |
PS C:\> az provedor registro -n Microsoft.KeyVault |
A próxima etapa é criar um vault. Com esse comando, você precisa especificar um grupo de recursos. Criei um grupo de recursos antecipadamente chamado "KeyVaultDemo". Também decidi usar a região Centro-Norte dos EUA do Azure.
1 |
PS C:\> az Keyvault criar --nome 'MyCouchbaseKeyVault' --recurso-grupo KeyVaultDemo --localização "Centro-Norte dos EUA |
O Azure levará alguns instantes para ser concluído (mas o processo é assíncrono, portanto, o prompt da linha de comando será exibido imediatamente). A linha de comando lhe dirá como verificar o progresso.
Agora que você criou o nome de usuário e a senha do armazenamento no Azure Key Vault, pode começar a colocar seus segredos nele. Vou armazenar 4 informações em meu cofre com esses 4 comandos:
1 2 3 4 |
PS C:\> az Keyvault segredo definir --cofre-nome 'MyCouchbaseKeyVault' --nome 'cbUsername' --valor 'cbAdminUsername' PS C:\> az Keyvault segredo definir --cofre-nome 'MyCouchbaseKeyVault' --nome 'cbPassword' --valor 'r6#Y%2^XXXXX' PS C:\> az Keyvault segredo definir --cofre-nome 'MyCouchbaseKeyVault' --nome 'cbBucketName' --valor 'mybucket' PS C:\> az Keyvault segredo definir --cofre-nome 'MyCouchbaseKeyVault' --nome 'cbClusterUri' --valor 'http://52.162.XXX.XXX:8091' |
(Observação: eu editei algumas das informações secretas usando Xs)
Você pode navegar pelos seus segredos no Portal do Azure.
Benefícios do Azure Key Vault
Antes de prosseguirmos, vamos falar sobre por que você deve usar o Azure Key Vault.
Nas postagens anteriores do blog, armazenei as credenciais do Couchbase como configurações do aplicativo. Em comparação com as configurações do aplicativo, o Azure Key Vault oferece os seguintes recursos de credenciais:
- O App Settings armazena valores como texto simples. O Azure Key Vault os armazena criptografados.
- Cada aplicativo tem suas próprias configurações de aplicativo. Com o Azure Key Vault, cada um de seus aplicativos pode compartilhar um único cofre de chaves.
- O Azure Key Vault armazena um histórico de versões de valores, e cada segredo tem uma data de ativação (opcional) e uma data de expiração.
O Azure Key Vault não substituir configurações do aplicativo. O uso do Azure Key Vault é melhor quando você deseja armazenar com segurança informações confidenciais (como credenciais/senhas/chaves de API) e/ou usá-las em vários serviços.
Preparando o Azure Functions para o Azure Key Vault
Em um postagem anterior do blog sobre o Azure FunctionsNo exemplo anterior, armazenei as credenciais do Couchbase nas configurações do aplicativo. Agora que tenho essas credenciais em um Azure Key Vault, vou alterar meu código do Azure Functions para usar o Azure Key Vault.
Primeiro, criei um serviço do Azure Functions. Você pode criar isso a partir da interface do usuário do Portal do Azure ou diretamente do Visual Studio ou do Visual Studio Code. Desta vez, usei o Visual Studio Code (para obter mais informações, consulte a seção Extensão do Azure Functions). Aconteceu de eu nomear meu serviço do Azure Functions como cbkeyvaultdemo.
Em seguida, anotei os URIs de cada um dos segredos que criei. Tenho 4 segredos, portanto, preciso de 4 URIs ("Identificador de segredo", como nesta captura de tela):
Criei quatro constantes e colei esses valores em meu código. (Talvez você queira armazená-los nas configurações do aplicativo).
1 2 3 4 |
const string Vault_Bucketname_Uri = "https://mycouchbasekeyvault.vault.azure.net/secrets/cbBucketName/1bda709e1372465a8f03b6e8c3fb6014"; const string Vault_Clusteruri_Uri = "https://mycouchbasekeyvault.vault.azure.net/secrets/cbClusterUri/48605e696b3645a6a7c396a15d636dc2"; const string Vault_Username_Uri = "https://mycouchbasekeyvault.vault.azure.net/secrets/cbUsername/7d73ef5fa2174e5491d4a50a42bb0800"; const string Vault_Password_Uri = "https://mycouchbasekeyvault.vault.azure.net/secrets/cbPassword/d6f61ff7e41a4fdcbe17de0b1fe1f115"; |
A próxima etapa é instalar alguns pacotes com o NuGet: Microsoft.Azure.Services.AppAuthentication e Microsoft.Azure.KeyVault. Aqui está um exemplo de instalação desses pacotes com a linha de comando:
1 2 |
C:\> dotnet adicionar pacote Microsoft.Azure.Serviços.Autenticação de aplicativos C:\> dotnet adicionar pacote Microsoft.Azure.KeyVault |
Obtenção de segredos do Azure Key Vault
A próxima etapa é escrever algum código para buscar os valores secretos do Azure Key Vault. Criei uma pequena função auxiliar que poderia reutilizar:
1 2 3 4 5 6 7 8 9 |
privado estático string GetSecret(string url) { var provedor azureServiceToken = novo Provedor de Token de Serviço do Azure(); var kvClient = novo Cliente do cofre de chaves( novo Cliente do cofre de chaves.AuthenticationCallback( provedor azureServiceToken.KeyVaultTokenCallback), cliente); var segredo = kvClient.GetSecretAsync(url).Resultado.Valor; retorno segredo; } |
Como antes, usarei Inicialização preguiçosa nessa função do Azure. Esta é a aparência ao usar as configurações do aplicativo (antes):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
privado estático somente leitura Preguiçoso<IBucket> Balde = novo Preguiçoso<IBucket>(() => { var uri = Meio ambiente.GetEnvironmentVariable("couchbaseUri"); var bucketName = Meio ambiente.GetEnvironmentVariable("couchbaseBucketName"); var nome de usuário = Meio ambiente.GetEnvironmentVariable("couchbaseUsername"); var senha = Meio ambiente.GetEnvironmentVariable("couchbasePassword"); var agrupamento = novo Aglomerado(novo Configuração de cliente { Servidores = novo Lista<Uri> { novo Uri(uri) } }); agrupamento.Autenticar(nome de usuário, senha); retorno agrupamento.OpenBucket(bucketName); }); |
E aqui está como ele fica quando eu o mudo para usar o GetBucket
método auxiliar (depois):
1 2 3 4 5 6 7 8 9 10 11 12 13 |
privado estático somente leitura Preguiçoso<IBucket> Balde = novo Preguiçoso<IBucket>(() => { var uri = GetSecret(Vault_Clusteruri_Uri); var bucketName = GetSecret(Vault_Bucketname_Uri); var nome de usuário = GetSecret(Vault_Username_Uri); var senha = GetSecret(Vault_Password_Uri); var agrupamento = novo Aglomerado(novo Configuração de cliente { Servidores = novo Lista<Uri> { novo Uri(uri) } }); agrupamento.Autenticar(nome de usuário, senha); retorno agrupamento.OpenBucket(bucketName); }); |
Um aspecto importante a ser observado sobre essa função auxiliar. Obter segredos do Azure Key Vault é uma operação assíncrona. No entanto, Preguiçoso
espera um lambda síncrono. Uma opção é usar o AsyncLazy. Outra opção (que foi o que eu fiz) é chamar um método assíncrono de forma síncrona usando Resultado
.
Onde foi que cliente
de onde vem? Fácil, eu adicionei cliente HttpClient estático privado = novo HttpClient();
para a classe. Você pode Confira o código-fonte completo no GitHub.
Segui principalmente esta excelente postagem do blog de Jeff Hollan chamada Obtendo segredos do cofre de chaves no Azure Functions (exceto que ele armazenou uma string de conexão do EventHub e eu estou armazenando credenciais do Couchbase).
Autorização
Você pode estar se perguntando: Matt, por que você publicou os URIs reais em seu código de exemplo?
Isso ocorre porque os URIs em si não são segredos confidenciais. Somente os serviços autorizados pelo Azure podem realmente obter informações úteis desses URIs.
Para autorizar esse serviço do Azure Function, você precisa fazer duas coisas:
- Habilitar uma identidade de serviço gerenciado para o serviço do Azure Functions. Para isso, basta clicar em "Managed service identity" (Identidade do serviço gerenciado) no portal do Azure e alterar a opção "off" (desligado) para "on" (ligado).
- Adicionar uma política de acesso ao Azure Key Vault. Basta localizar o Azure Key Vault na interface de usuário do portal do Azure, clicar em "Políticas de acesso" em configurações e adicionar uma nova política de acesso. Você pode definir permissões refinadas para acessar a chave, o segredo e os certificados (que o Azure Key Vault também pode armazenar, a propósito). Eu só precisava de permissões "Get", portanto, minha política de acesso era muito simples:
É isso aí. Mas sem essa etapa importante, o cofre de chaves não permitirá que nenhuma pessoa ou aplicativo obtenha uma chave.
Resumo e próximas etapas
Em vez de implantar o Azure Functions (ou outros serviços de aplicativos) com as credenciais do Couchbase armazenadas nas configurações do aplicativo, agora podemos colocar essas credenciais (e quaisquer outras informações confidenciais) em um Azure Key Vault.
Damos permissão ao(s) aplicativo(s) para acessar os segredos no cofre, e o Azure impedirá que qualquer outra pessoa obtenha esses segredos.
Os aplicativos extraem os segredos do Azure Key Vault.
Se você tiver alguma dúvida sobre esta postagem do blog, fique à vontade para deixar um comentário abaixo ou me encontrar em Twitter @mgroves.
Se você estiver usando o Couchbase com o Azure, todo o Comunidade Couchbase adoraríamos saber de sua experiência. Ou, se estiver apenas começando a usar o Couchbase com o Azure, você também pode encontrar e perguntar a outros membros da comunidade para obter seus conselhos ou recomendações de alto nível.
Se você tiver uma pergunta técnica específica sobre o Couchbase, consulte a seção Fóruns do Couchbase.