Azure Key Vault puede almacenar nombres de usuario y contraseñas y gestionar información sensible en Azure. Una vez que Azure Key Vaults almacena la información, los servicios de Azure que especifique (y SÓLO los servicios de Azure que especifique) pueden acceder a ella
En esta entrada de blog, voy a mostrarte cómo usar Azure Key Vault para almacenar las credenciales de Couchbase Server y acceder a ellas desde una Azure Function.
Esta entrada de blog sobre cómo almacenar credenciales y contraseñas de bases de datos en Azure Key Vault se basará en entradas de blog anteriores sobre Couchbase en Azure, por lo que es posible que desee revisarlas antes de continuar:
- Azure: Empezar es fácil y gratis
- Funciones Azure e inicialización perezosa con Couchbase Server
- Azure Functions con Couchbase Server (vídeo)
- Con esto debería bastar para ponerse al día, pero hay muchos más entradas de blog sobre Azure
Como siempre, si quieres seguirnos, puedes encontrar el fuente completa en GitHub.
Instalación y configuración de Couchbase Server
El resto de este post asume que tienes un Couchbase Server configurado en Azure. Puedes seguir los enlaces anteriores para aprender sobre este proceso (¡es fácil!).
En mi configuración para esta entrada del blog, he creado un clúster (que requiere la creación de credenciales de administrador) y un único cubo llamado "mybucket".
Estoy usando Couchbase Enterprise Edition 5.5.2 ya que es la más fácil de configurar en Azure. La edición Community y versiones anteriores de Couchbase también deberían funcionar.
Creación de una bóveda de claves de Azure
Se puede crear una bóveda de claves de Azure con Azure Portal UI, o se puede crear con la línea de comandos. En un post anterior sobre el uso del Operador Couchbase Kubernetes con AzureTambién he utilizado la línea de comandos. Es posible que desee revisar que si usted no ha utilizado el Línea de comandos Azure utilidad antes.
El primer paso sólo debe ejecutarse una vez por cada suscripción de Azure. Suponiendo que su línea de comandos está configurada para la suscripción que desea, registre Azure Key Vault con esa suscripción con este comando:
1 |
PS C:\> az proveedor regístrese en -n Microsoft.KeyVault |
El siguiente paso es crear una bóveda. Con este comando necesitas especificar un grupo de recursos. He creado un grupo de recursos de antemano llamado "KeyVaultDemo". También decidí utilizar la región North Central US de Azure.
1 |
PS C:\> az keyvault crear --nombre BóvedaClaveMiBase --recurso-grupo KeyVaultDemo --ubicación Centro-norte de EE.UU. |
Azure tardará unos instantes en terminar (pero el proceso es asíncrono, por lo que la línea de comandos aparecerá inmediatamente). La línea de comandos le indicará cómo comprobar el progreso.
Ahora que ha creado el nombre de usuario y la contraseña de la tienda en Azure Key Vault creado, usted puede comenzar a poner sus secretos en ella. Voy a almacenar 4 piezas de información en mi bóveda con estos 4 comandos:
1 2 3 4 |
PS C:\> az keyvault secreto configure --bóveda-nombre BóvedaClaveMiBase --nombre cbNombreUsuario --valor cbAdminUsername PS C:\> az keyvault secreto configure --bóveda-nombre BóvedaClaveMiBase --nombre cbContraseña --valor 'r6#Y%2^XXXXX' PS C:\> az keyvault secreto configure --bóveda-nombre BóvedaClaveMiBase --nombre cbBucketName --valor mybucket PS C:\> az keyvault secreto configure --bóveda-nombre BóvedaClaveMiBase --nombre cbClusterUri --valor 'http://52.162.XXX.XXX:8091' |
(Nota: He redactado parte de la información secreta utilizando equis)
Puede examinar sus secretos en el Portal Azure.
Ventajas de Azure Key Vault
Antes de seguir, hablemos de por qué querrá utilizar Azure Key Vault.
En entradas anteriores del blog, almacené las credenciales de Couchbase como configuración de la aplicación. En comparación con la configuración de la aplicación, Azure Key Vault te ofrece las siguientes capacidades de credenciales:
- App Settings almacena los valores como texto sin formato. Azure Key Vault los almacena cifrados.
- Cada aplicación tiene su propia configuración. Con Azure Key Vault, cada una de tus aplicaciones puede compartir una única bóveda de claves.
- Azure Key Vault almacena un historial de versiones de los valores, y cada secreto tiene una fecha de activación (opcional) y una fecha de caducidad.
Azure Key Vault no sustituir configuración de la aplicación. El uso de Azure Key Vault es mejor cuando se desea almacenar de forma segura información confidencial (como credenciales/contraseñas/claves de API) y/o utilizarlas en varios servicios.
Cómo preparar Azure Functions para Azure Key Vault
En un entrada anterior sobre Azure Functionsalmacené las credenciales de Couchbase en la configuración de la aplicación. Ahora que tengo esas credenciales en Azure Key Vault, voy a cambiar mi código Azure Functions para usar Azure Key Vault en su lugar.
En primer lugar, he creado un servicio Azure Functions. Puedes crearlo desde el Azure Portal UI, o desde Visual Studio o Visual Studio Code directamente. Esta vez, utilicé Visual Studio Code (para más información, echa un vistazo a la sección Extensión de Azure Functions). Se me ocurrió nombrar mi servicio Azure Functions cbkeyvaultdemo.
A continuación, he anotado los URI de cada uno de los secretos que he creado. Tengo 4 secretos, así que necesito 4 URIs ("Secret Identifier" como en esta captura de pantalla):
He creado 4 constantes y pegado estos valores en mi código. (Es posible que desee almacenar estos eventualmente en la configuración de la aplicación).
1 2 3 4 |
const cadena Nombre_Boveda_Uri = "https://mycouchbasekeyvault.vault.azure.net/secrets/cbBucketName/1bda709e1372465a8f03b6e8c3fb6014"; const cadena Bóveda_Clusteruri_Uri = "https://mycouchbasekeyvault.vault.azure.net/secrets/cbClusterUri/48605e696b3645a6a7c396a15d636dc2"; const cadena Vault_Username_Uri = "https://mycouchbasekeyvault.vault.azure.net/secrets/cbUsername/7d73ef5fa2174e5491d4a50a42bb0800"; const cadena Vault_Password_Uri = "https://mycouchbasekeyvault.vault.azure.net/secrets/cbPassword/d6f61ff7e41a4fdcbe17de0b1fe1f115"; |
El siguiente paso es instalar un par de paquetes con NuGet: Microsoft.Azure.Services.AppAuthentication y Microsoft.Azure.KeyVault. He aquí un ejemplo de instalación de esos paquetes con la línea de comandos:
1 2 |
C:\> dotnet añada paquete Microsoft.Azure.Servicios.AppAuthentication C:\> dotnet añada paquete Microsoft.Azure.KeyVault |
Obtención de secretos de Azure Key Vault
El siguiente paso es escribir algo de código para obtener los valores secretos de Azure Key Vault. He creado una pequeña función de ayuda que podría reutilizar:
1 2 3 4 5 6 7 8 9 |
privado estático cadena GetSecret(cadena url) { var azureServiceTokenProvider = nuevo AzureServiceTokenProvider(); var kvClient = nuevo KeyVaultClient( nuevo KeyVaultClient.AuthenticationCallback( azureServiceTokenProvider.KeyVaultTokenCallback), cliente); var secreto = kvClient.GetSecretAsync(url).Resultado.Valor; devolver secreto; } |
Como antes, utilizaré Inicialización perezosa en esta función de Azure. Esto es lo que parece cuando se utiliza la configuración de la aplicación (antes):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
privado estático sólo lectura Perezoso<IBucket> Cubo = nuevo Perezoso<IBucket>(() => { var uri = Medio ambiente.GetEnvironmentVariable("couchbaseUri"); var bucketName = Medio ambiente.GetEnvironmentVariable("couchbaseBucketName"); var nombre de usuario = Medio ambiente.GetEnvironmentVariable("couchbaseUsername"); var contraseña = Medio ambiente.GetEnvironmentVariable("couchbasePassword"); var grupo = nuevo Grupo(nuevo ClientConfiguration { Servidores = nuevo Lista<Uri> { nuevo Uri(uri) } }); grupo.Autentificar(nombre de usuario, contraseña); devolver grupo.OpenBucket(bucketName); }); |
Y así es como se ve cuando lo cambio para usar el botón GetBucket
(después):
1 2 3 4 5 6 7 8 9 10 11 12 13 |
privado estático sólo lectura Perezoso<IBucket> Cubo = nuevo Perezoso<IBucket>(() => { var uri = GetSecret(Bóveda_Clusteruri_Uri); var bucketName = GetSecret(Nombre_Boveda_Uri); var nombre de usuario = GetSecret(Vault_Username_Uri); var contraseña = GetSecret(Vault_Password_Uri); var grupo = nuevo Grupo(nuevo ClientConfiguration { Servidores = nuevo Lista<Uri> { nuevo Uri(uri) } }); grupo.Autentificar(nombre de usuario, contraseña); devolver grupo.OpenBucket(bucketName); }); |
Una cosa importante a tener en cuenta sobre esta función de ayuda. Obtener secretos de Azure Key Vault es una operación asíncrona. Sin embargo, Perezoso
espera una lambda síncrona. Una opción es utilizar el método AsyncLazy. Otra opción (que es lo que yo hice) es llamar a un método asíncrono de forma síncrona utilizando .resultado
.
¿Dónde cliente
¿De dónde viene? Fácil, he añadido private static HttpClient client = new HttpClient();
a la clase. Puede consulte el código fuente completo en GitHub.
He seguido principalmente esta excelente entrada del blog de Jeff Hollan titulada Obtención de secretos de bóveda de claves en Azure Functions (excepto que él almacenó una cadena de conexión EventHub y yo estoy almacenando credenciales Couchbase).
Autorización
Te estarás preguntando: Matt, ¿por qué publicaste los URI reales en tu código de ejemplo?
Es porque los propios URI no son secretos sensibles. Solo los servicios autorizados por Azure pueden obtener información útil de estas URI.
Para autorizar este servicio Azure Function, debe hacer dos cosas:
- Habilitar una identidad de servicio gestionada para el servicio Azure Functions. Esto es tan fácil como hacer clic en "Managed service identity" en el portal de Azure y cambiar un "off" a un "on".
- Añadir una política de acceso a su Azure Key Vault. Solo tienes que buscar Azure Key Vault en la interfaz de usuario del portal de Azure, hacer clic en "Políticas de acceso" en Configuración y añadir una nueva política de acceso. Puedes definir permisos detallados para acceder a claves, secretos y certificados (que, por cierto, Azure Key Vault también puede almacenar). Yo sólo necesitaba permisos de "Obtención", así que mi política de acceso era muy sencilla:
Eso es todo. Pero sin este importante paso, la cámara acorazada de claves no permitirá que ninguna persona o aplicación recupere una clave.
Resumen y próximos pasos
En lugar de desplegar Azure Functions (u otros servicios de aplicación) con las credenciales de Couchbase almacenadas en la configuración de la aplicación, ahora podemos poner esas credenciales (y cualquier otra información sensible) en una Azure Key Vault.
Damos permiso a la(s) aplicación(es) para acceder a los secretos de la cámara acorazada, y Azure impedirá que nadie más obtenga esos secretos.
Las aplicaciones extraen los secretos de Azure Key Vault.
Si tienes alguna pregunta sobre esta entrada del blog, no dudes en dejar un comentario a continuación o búscame en Twitter @mgroves.
Si está utilizando Couchbase con Azure, toda la plataforma Comunidad Couchbase nos encantaría conocer tu experiencia. O, si usted apenas está entrando en Couchbase con Azure, también puede encontrar y preguntar a otros miembros de la comunidad por sus consejos o recomendaciones de alto nivel.
Si tiene alguna pregunta técnica específica sobre Couchbase, consulte la sección Foros de Couchbase.