Condividi tramite


Autenticare le app Rust nei servizi di Azure

Le applicazioni Rust devono eseguire l'autenticazione ai servizi di Azure, ad esempio Archiviazione, Key Vault o Cosmos DB. Questo articolo illustra come usare il crate di Identità di Azure per autenticare in modo sicuro le app Rust in ambienti di sviluppo e server locali, migliorando la sicurezza e semplificando la gestione delle credenziali.

L'approccio consigliato consiste nell'usare l'autenticazione basata su token, anziché le stringhe di connessione o le chiavi, quando si esegue l'autenticazione alle risorse di Azure. La azure_identity crate fornisce l'autenticazione basata su token e consente alle app di eseguire facilmente l'autenticazione alle risorse di Azure, indipendentemente dal fatto che l'app sia in fase di sviluppo locale, distribuita in Azure o distribuita in un server locale.

Il tipo specifico di autenticazione basata su token che un'app deve usare per eseguire l'autenticazione alle risorse di Azure dipende dalla posizione in cui è in esecuzione l'app.

Ambiente Authentication
Locale Quando uno sviluppatore esegue un'app durante lo sviluppo locale: l'app può eseguire l'autenticazione in Azure usando le credenziali locali dello sviluppatore. Queste opzioni sono disponibili in modo più dettagliato nella crates.io: Eseguire l'autenticazione con gli strumenti di sviluppo.
Azure Quando un'app è ospitata in Azure: l'app deve eseguire l'autenticazione alle risorse di Azure usando un'identità gestita. Questa opzione è illustrata in modo più dettagliato nella documentazione di crates.io : Autenticare le applicazioni ospitate in Azure.
Locale Quando un'app è ospitata e distribuita in locale: l'app deve eseguire l'autenticazione alle risorse di Azure usando un'entità servizio dell'applicazione. Questa opzione è illustrata nella documentazione di crates.io : Autenticare le entità servizio.

Vantaggi dell'autenticazione basata su token

Quando si creano app per Azure, è consigliabile usare l'autenticazione basata su token anziché segreti come stringhe di connessione o chiavi.

Autenticazione basata su token Segreti (stringhe di connessione e chiavi)
Principio dei privilegi minimi, stabilire le autorizzazioni specifiche necessarie per l'app nella risorsa di Azure. Una stringa di connessione o una chiave concede diritti completi alla risorsa di Azure.
Non esiste alcun segreto dell'applicazione da archiviare. Deve archiviare e ruotare i segreti nell'impostazione dell'app o nella variabile di ambiente.
La libreria di identità di Azure gestisce automaticamente i token in background. Ciò semplifica l'uso dell'autenticazione basata su token come stringa di connessione. I segreti non vengono gestiti.

L'uso di stringhe di connessione deve essere limitato alle app di verifica iniziali o ai prototipi di sviluppo che non accedono a dati sensibili o di produzione. In caso contrario, le classi di autenticazione basate su token disponibili nella libreria di identità di Azure devono essere sempre preferite quando si esegue l'autenticazione alle risorse di Azure.

Eseguire l'autenticazione durante lo sviluppo locale

Quando un'applicazione viene eseguita nella workstation di uno sviluppatore durante lo sviluppo locale, l'ambiente locale deve comunque eseguire l'autenticazione a tutti i servizi di Azure usati dall'app.

Eseguire l'autenticazione con le credenziali dell'interfaccia della riga di comando di Azure

Le credenziali dell'interfaccia della riga di comando di Azure usano lo stato di autenticazione dell'interfaccia della riga di comando di Azure per autenticare l'applicazione Rust. Questa credenziale è ideale per lo sviluppo locale quando si è già connessi 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(())
}

Eseguire l'autenticazione con le credenziali dell'interfaccia della riga di comando per sviluppatori di Azure

Le credenziali dell'interfaccia della riga di comando per sviluppatori di Azure usano lo stato di autenticazione dell'interfaccia della riga di comando per sviluppatori di Azure (azd) per autenticare l'applicazione. Questa credenziale è utile quando si lavora con i modelli e i flussi di lavoro 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(())
}

Eseguire l'autenticazione negli ambienti server

Negli ambienti server usare le identità gestite per l'autenticazione sicura senza password. Le identità gestite vengono create e gestite automaticamente da Azure, in modo che l'applicazione possa eseguire l'autenticazione senza dover archiviare le credenziali.

Quando si ospita in un ambiente server, assegnare un'identità dell'applicazione univoca a ogni applicazione per ogni ambiente. In Azure un'identità dell'app è rappresentata da un'entità servizio, un tipo speciale di entità di sicurezza che identifica e autentica le app in Azure. Il tipo di entità servizio usata per l'app dipende dalla posizione in cui viene eseguita l'app.

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(())
}

Esempio di codice

Il codice illustrato in questo articolo è disponibile in https://github.com/azure-samples/azure-sdk-for-rust-docs/.

Risorse aggiuntive