使用 Azure Identity crate 驗證 Rust 應用程式以連接到 Azure

Rust 應用程式必須向 Azure 服務進行驗證,例如儲存體、金鑰保存庫或 Cosmos DB。 本文說明如何使用 Azure 身分識別匣在本機開發和伺服器環境中安全地驗證 Rust 應用程式,從而提高安全性並簡化憑證管理。

建議的方法是讓您的應用程式在向 Azure 資源進行驗證時,使用 權杖型驗證,而不是連接字串或金鑰。 azure_identity Crate 提供以權杖為基礎的驗證,並可讓應用程式順暢地向 Azure 資源進行驗證,無論應用程式是在本機開發中、部署至 Azure,還是部署至內部部署伺服器。

應用程式應該用來向 Azure 資源進行驗證的特定權杖型驗證類型取決於應用程式的執行位置。

環境 Authentication
本地 當開發人員在本機開發期間執行應用程式時 - 應用程式可以使用開發人員的本機認證向 Azure 進行驗證。 這些選項會在 crates.io 中更詳細地提供 :使用開發工具進行驗證
Azure 當應用程式裝載在 Azure 上時 - 應用程式應該使用受控識別向 Azure 資源進行驗證。 crates.io 檔中會更詳細地討論此選項:驗證 Azure 裝載的應用程式
內部部署 當應用程式裝載並部署在內部部署時,應用程式應該使用應用程式服務主體向 Azure 資源進行驗證。 crates.io 檔中討論此選項:驗證服務主體

權杖型驗證的優點

建置適用於 Azure 的應用程式時,強烈建議您使用權杖型驗證,而不是連接字串或金鑰等秘密。

基於令牌的驗證 秘密 (連接字串和金鑰)
最低許可權原則,在 Azure 資源上建立應用程式所需的特定許可權。 連接字串或金鑰會授與 Azure 資源的完整權限。
沒有要儲存的應用程式密碼或密鑰。 必須在應用程式設定或環境變數中儲存和輪替秘密。
Azure 身分識別庫會在幕後為您管理令牌。 這使得使用權杖型驗證就像連接字串一樣容易使用。 秘密不受管理。

連接字串的使用應僅限於初始概念證明應用程式或未存取生產或敏感性資料的開發原型。 否則,在向 Azure 資源進行驗證時,應該一律偏好 Azure 身分識別程式庫中可用的權杖型驗證類別。

在本機開發期間進行驗證

在本機開發期間,當應用程式在開發人員的工作站上執行時,本機環境仍必須對應用程式使用的任何 Azure 服務進行驗證。

使用 Azure CLI 認證進行驗證

Azure CLI 認證會使用 Azure CLI 的驗證狀態來驗證您的 Rust 應用程式。 此認證非常適合本機開發,尤其是當您已使用 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(())
}

使用 Azure 開發人員 CLI 認證進行驗證

Azure 開發人員 CLI 認證會使用 Azure 開發人員 CLI (azd) 的驗證狀態來驗證您的應用程式。 使用此 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(())
}

在伺服器環境中進行驗證

在伺服器環境中,使用 受控識別 進行安全的無密碼驗證。 受控識別 是由 Azure 自動建立和管理,因此您的應用程式無需儲存認證即可進行驗證。

在伺服器環境中裝載時,請為每個環境的每一個應用程式指派唯一的應用程式身分識別。 在 Azure 中,應用程式身分識別是由服務主體表示,這是一種特殊類型的安全性主體,可識別應用程式並驗證 Azure。 您用於應用程式的服務主體類型取決於應用程式的執行位置。

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

範例程式碼

本文中顯示的程式碼可在 上 https://github.com/azure-samples/azure-sdk-for-rust-docs/找到。

其他資源