Compartir a través de


Autenticación de aplicaciones de Rust en servicios de Azure

Las aplicaciones de Rust deben autenticarse en servicios de Azure como Storage, Key Vault o Cosmos DB. En este artículo se explica cómo usar azure Identity crate para autenticar de forma segura las aplicaciones de Rust en entornos de servidor y desarrollo local, lo que mejora la seguridad y simplifica la administración de credenciales.

El enfoque recomendado es hacer que las aplicaciones usen la autenticación basada en tokens, en lugar de cadenas de conexión o claves, al autenticarse en recursos de Azure. El azure_identity crate proporciona autenticación basada en tokens y permite que las aplicaciones se autentiquen sin problemas en los recursos de Azure, tanto si la aplicación está en desarrollo local, implementada en Azure como si se implementa en un servidor local.

El tipo específico de autenticación basada en tokens que una aplicación debe usar para autenticarse en los recursos de Azure depende de dónde se ejecute la aplicación.

Medio ambiente Autenticación
Locales Cuando un desarrollador ejecuta una aplicación durante el desarrollo local: la aplicación puede autenticarse en Azure mediante las credenciales locales del desarrollador. Estas opciones se proporcionan con más detalle en la crates.io: Autenticación con herramientas de desarrollo.
Azure Cuando una aplicación se hospeda en Azure: la aplicación debe autenticarse en los recursos de Azure mediante una identidad administrada. Esta opción se describe con más detalle en la documentación de crates.io : Autenticación de aplicaciones hospedadas en Azure.
Local Cuando una aplicación se hospeda e implementa de forma local: la aplicación debe autenticarse en los recursos de Azure mediante una entidad de servicio de aplicación. Esta opción se describe en la documentación de crates.io : Autenticar entidades de servicio.

Ventajas de la autenticación basada en tokens

Al compilar aplicaciones para Azure, se recomienda encarecidamente usar la autenticación basada en tokens en lugar de secretos como cadenas de conexión o claves.

Autenticación basada en tokens Secretos (cadenas de conexión y claves)
Principio de privilegios mínimos, establezca los permisos específicos necesarios para la aplicación en el recurso de Azure. Una cadena de conexión o clave concede derechos completos al recurso de Azure.
No hay ningún secreto de aplicación que almacenar. Debe almacenar y rotar secretos en la configuración de la aplicación o la variable de entorno.
La biblioteca de identidades de Azure administra los tokens automáticamente en segundo plano. Esto hace que el uso de la autenticación basada en tokens sea tan fácil de usar como una cadena de conexión. Los secretos no se administran.

El uso de cadenas de conexión debe limitarse a la prueba inicial de aplicaciones de concepto o prototipos de desarrollo que no tienen acceso a la producción ni a los datos confidenciales. De lo contrario, las clases de autenticación basadas en tokens disponibles en la biblioteca de identidades de Azure siempre deben preferirse al autenticarse en los recursos de Azure.

Autenticación durante el desarrollo local

Cuando una aplicación se ejecuta en la estación de trabajo de un desarrollador durante el desarrollo local, el entorno local todavía debe autenticarse en los servicios de Azure usados por la aplicación.

Autenticación con credenciales de la CLI de Azure

La credencial de la CLI de Azure usa el estado de autenticación de la CLI de Azure para autenticar la aplicación de Rust. Esta credencial es ideal para el desarrollo local cuando ya ha iniciado sesión con az login.

use azure_identity::AzureCliCredential;
use azure_security_keyvault_secrets::SecretClient;

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {

    dotazure::load()?;

    let vault_url = std::env::var("AZURE_KEYVAULT_URL")
        .map_err(|_| "AZURE_KEYVAULT_URL environment variable is required")?;

    let credential = AzureCliCredential::new(None)?;

    let client = SecretClient::new(&vault_url, credential.clone(), None)?;

    Ok(())
}

Autenticación con credenciales de la CLI para desarrolladores de Azure

La credencial de la CLI para desarrolladores de Azure usa el estado de autenticación de la CLI para desarrolladores de Azure (azd) para autenticar la aplicación. Esta credencial es útil al trabajar con plantillas y flujos de trabajo azd.

use azure_identity::AzureDeveloperCliCredential;
use azure_security_keyvault_secrets::SecretClient;

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {

    dotazure::load()?;

    let vault_url = std::env::var("AZURE_KEYVAULT_URL")
        .map_err(|_| "AZURE_KEYVAULT_URL environment variable is required")?;

    let credential = AzureDeveloperCliCredential::new(None)?;

    let client = SecretClient::new(&vault_url, credential.clone(), None)?;

    Ok(())
}

Autenticación en entornos de servidor

En entornos de servidor, use identidades administradas para la autenticación segura sin contraseña. Azure crea y administra automáticamente las identidades administradas, por lo que la aplicación puede autenticarse sin necesidad de almacenar credenciales.

Al hospedar en un entorno de servidor, asigne una identidad de aplicación única a cada aplicación para cada entorno. En Azure, una identidad de aplicación se representa mediante una entidad de servicio, un tipo especial de entidad de seguridad que identifica y autentica las aplicaciones en Azure. El tipo de entidad de servicio que usa para la aplicación depende de dónde se ejecute la aplicación.

use azure_identity::{ManagedIdentityCredential, ManagedIdentityCredentialOptions, UserAssignedId};
use azure_security_keyvault_secrets::SecretClient;

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {

    dotazure::load()?;

    let vault_url = std::env::var("AZURE_KEYVAULT_URL")
        .map_err(|_| "AZURE_KEYVAULT_URL environment variable is required")?;

    let user_assigned_id: Option<UserAssignedId> = std::env::var("AZURE_USER_ASSIGNED_IDENTITY")
        .ok()
        .map(|id| UserAssignedId::ClientId(id.clone()));

    let credential_options = ManagedIdentityCredentialOptions {
        user_assigned_id,
        ..Default::default()
    };

    let credential = ManagedIdentityCredential::new(Some(credential_options))?;

    let client = SecretClient::new(vault_url.as_str(), credential.clone(), None)?;

    Ok(())
}

Código de ejemplo

El código que se muestra en este artículo está disponible en https://github.com/azure-samples/azure-sdk-for-rust-docs/.

Recursos adicionales